VS2005里面调试的时候怎么看全局的静态变量(局部变量看起来很简单)?看内存?那全局的静态变量在内存里面的地址怎么计算?
VS2005里面调试的时候怎么看全局的静态变量(局部变量看起来很简单)?看内存?那全局的静态变量在内存里面的地址怎么计算?看EXE文件对应生成的MAP文件吗?
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
//我的上面变量是属于类的,看类的就可以了
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
看这个内存的话,我觉得最高级的做法是使用IDA反汇编,然后使用二进制查看相应DLL,lib,EXE文件等
这样你很容易找到函数的标号地址。进而找到相应的变量在内存中的地址。——不过这个方法只能看到程序运行到最后的结果吧,不能动态查看。
静态变量和全局变量一样,是在静态段里,同样看内存就行了。
老是分不清下面的一系列东西,他们有什么区别,他们放的地址有什么不同
1.rdata
2.xdata
3.idata
4.pdata
5.bss
6.data
引用: 引用 5 楼 xqhrs232 的回复:
老是分不清下面的一系列东西,他们有什么区别,他们放的地址有什么不同
1.rdata
2.xdata
3.idata
4.pdata
5.bss
6.data
这个应该和单片机程序是一样的吧?
1.rdata 只读的数据段,字符串、常量和调试信息等
2.xdata 异常处理表
3.idata 导入数据段,导入库和导入地址名称表
4.pdata 异常信息段
5.bss 数据段,未初始化的数据,包括所有为static的变量
6.data 数据段,已初始化的数据
直接把全局的静态变量名字放到 Watch 里面就可以看到了
引用: 引用 8 楼 navi_dx 的回复:
直接把全局的静态变量名字放到 Watch 里面就可以看到了
看类的静态成员变量呢?用你的方法好像不行!在WATCH窗口里面老显示下面的错误
g_TotalSFR CXX0017: 错误: 未找到符号“g_TotalSFR”
引用: 引用 3 楼 gooogleman 的回复:
看这个内存的话,我觉得最高级的做法是使用IDA反汇编,然后使用二进制查看相应DLL,lib,EXE文件等
这样你很容易找到函数的标号地址。进而找到相应的变量在内存中的地址。——不过这个方法只能看到程序运行到最后的结果吧,不能动态查看。
囧。。反编译。。。太难恐怖了。。。
[url=http://blog.eeworld.net/jacksoon/archive/2008/05/21/2467841.aspx][/url]
找到了一点东西,但没改进,还是看不到!
某个类的静态成员变量难道真的只能看MAP文件,去找对应的内存地址看了?不能做为一个变量被引用?把它做为一个变量拖到WATCH窗口老是提示下面的错误!为什么?想不通啊!静态成员变量的地址是不是写死的,DEBUG的时候不能动态访问?
g_TotalSFR CXX0017: 错误: 未找到符号“g_TotalSFR”
类的静态成员变量编译时做了name-mangling 就是用类名作为修饰符加在变量前面,查看要加类名 CXX::g_TotalSFR
反汇编,太夸张了
引用: 引用 13 楼 navi_dx 的回复:
类的静态成员变量编译时做了name-mangling 就是用类名作为修饰符加在变量前面,查看要加类名 CXX::g_TotalSFR
反汇编,太夸张了
太感谢了!