VS2005里面调试的时候怎么看全局的静态变量(局部变量看起来很简单)?看内存?那全局的静态变量在内存里面的地址怎么计算?

filter   2008-12-9 18:19 楼主
VS2005里面调试的时候怎么看全局的静态变量(局部变量看起来很简单)?看内存?那全局的静态变量在内存里面的地址怎么计算?看EXE文件对应生成的MAP文件吗?

回复评论 (15)

static        HANDLE hPort;在MAP文件里面应该是下面的那一段?


Start         Length     Name                   Class
0001:00000000 0002e7fcH .text                   CODE
0001:0002e7fc 000007acH .text$yc                CODE
0001:0002efa8 000001dcH .text$yd                CODE
0002:00000000 00000004H .CRT$XCA                DATA
0002:00000004 0000000cH .CRT$XCC                DATA
0002:00000010 00000060H .CRT$XCL                DATA
0002:00000070 0000000cH .CRT$XCU                DATA
0002:0000007c 00000004H .CRT$XCZ                DATA
0002:00000080 00000004H .CRT$XIA                DATA
0002:00000084 00000004H .CRT$XIZ                DATA
0002:00000088 00000004H .CRT$XPA                DATA
0002:0000008c 00000004H .CRT$XPZ                DATA
0002:00000090 00000004H .CRT$XTA                DATA
0002:00000094 00000004H .CRT$XTZ                DATA
0002:000000a0 0003119dH .rdata                  DATA
0002:00031240 000000aaH .rdata$debug            DATA
0002:000312ec 00000050H .xdata                  DATA

0002:0003133c 00000034H .xdata$x                DATA


0002:00031370 00000004H ATL$__a                 DATA
0002:00031374 00000004H ATL$__z                 DATA

0002:00031378 00000050H .idata$2                DATA


0002:000313c8 00000014H .idata$3                DATA
0002:000313dc 000004ecH .idata$4                DATA
0002:000318c8 0000008eH .idata$6                DATA
0002:00031956 00000000H .edata                  DATA
0003:00000000 000004ecH .idata$5                DATA
0003:000004f0 00000b20H .data                   DATA
0003:00001010 00000680H .bss                    DATA
0004:00000000 00002d10H .pdata                  DATA
0005:00000000 00001168H .rsrc$01                DATA
0005:00001170 001ac560H .rsrc$02                DATA
点赞  2008-12-9 18:24
//我的上面变量是属于类的,看类的就可以了

hPort-------------00074504
g_TotalSFR--------000740c8



0003:000010c0       ?m_QueryPackage@CPublic@@2U_QueryPackage@@A 000740c0     Public.obj
0003:000010c8       ?g_TotalSFR@CPublic@@2U_TotalSFR@@A 000740c8     Public.obj
0003:00001100       ?m_RecQueue@CPublic@@2U_RecQueue@@A 00074100     Public.obj
0003:00001504       ?hPort@CPublic@@2PAXA      00074504     Public.obj
点赞  2008-12-9 18:43
看这个内存的话,我觉得最高级的做法是使用IDA反汇编,然后使用二进制查看相应DLL,lib,EXE文件等
这样你很容易找到函数的标号地址。进而找到相应的变量在内存中的地址。——不过这个方法只能看到程序运行到最后的结果吧,不能动态查看。
点赞  2008-12-9 19:28
静态变量和全局变量一样,是在静态段里,同样看内存就行了。
点赞  2008-12-9 19:53
老是分不清下面的一系列东西,他们有什么区别,他们放的地址有什么不同

1.rdata
2.xdata
3.idata
4.pdata
5.bss
6.data
点赞  2008-12-10 09:00
引用: 引用 5 楼 xqhrs232 的回复:
老是分不清下面的一系列东西,他们有什么区别,他们放的地址有什么不同

1.rdata
2.xdata
3.idata
4.pdata
5.bss
6.data


这个应该和单片机程序是一样的吧?
点赞  2008-12-10 09:03
1.rdata  只读的数据段,字符串、常量和调试信息等
2.xdata  异常处理表
3.idata  导入数据段,导入库和导入地址名称表
4.pdata  异常信息段
5.bss    数据段,未初始化的数据,包括所有为static的变量
6.data   数据段,已初始化的数据
点赞  2008-12-10 09:19
直接把全局的静态变量名字放到 Watch 里面就可以看到了
点赞  2008-12-10 09:20
引用: 引用 8 楼 navi_dx 的回复:
直接把全局的静态变量名字放到 Watch 里面就可以看到了


看类的静态成员变量呢?用你的方法好像不行!在WATCH窗口里面老显示下面的错误


g_TotalSFR        CXX0017: 错误: 未找到符号“g_TotalSFR”       
点赞  2008-12-10 09:38
引用: 引用 3 楼 gooogleman 的回复:
看这个内存的话,我觉得最高级的做法是使用IDA反汇编,然后使用二进制查看相应DLL,lib,EXE文件等
这样你很容易找到函数的标号地址。进而找到相应的变量在内存中的地址。——不过这个方法只能看到程序运行到最后的结果吧,不能动态查看。

囧。。反编译。。。太难恐怖了。。。
点赞  2008-12-10 09:43
[url=http://blog.eeworld.net/jacksoon/archive/2008/05/21/2467841.aspx][/url]

找到了一点东西,但没改进,还是看不到!
点赞  2008-12-10 09:47
某个类的静态成员变量难道真的只能看MAP文件,去找对应的内存地址看了?不能做为一个变量被引用?把它做为一个变量拖到WATCH窗口老是提示下面的错误!为什么?想不通啊!静态成员变量的地址是不是写死的,DEBUG的时候不能动态访问?

g_TotalSFR CXX0017: 错误: 未找到符号“g_TotalSFR”
点赞  2008-12-10 10:05
类的静态成员变量编译时做了name-mangling 就是用类名作为修饰符加在变量前面,查看要加类名 CXX::g_TotalSFR
反汇编,太夸张了
点赞  2008-12-10 10:44
引用: 引用 13 楼 navi_dx 的回复:
类的静态成员变量编译时做了name-mangling 就是用类名作为修饰符加在变量前面,查看要加类名 CXX::g_TotalSFR
反汇编,太夸张了


太感谢了!
点赞  2008-12-10 11:07
KAN O KAN
点赞  2010-1-28 11:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复