|
|
|
|
|
|
|
WinDbg
帖子发起人: Dic4000 发起时间: 2015-10-13 21:58 下午 回复: 7
|
帖子排序:
|
|
|
|
2015-10-13, 21:58 下午
|
Dic4000
注册: 2015-10-13
发 贴: 7
|
请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
附件: 1.PNG
|
|
|
|
我是一个WinDbg初学者,刚刚来到这里的论坛,目前我在学习调试一个简单的C程序时遇到了一个问题,搜索了很长时间,也没找到一个明确的答案,希望大家能给我点提示。 程序如下: #include<stdio.h> int main(void) { int a = 1235;
const char *str = "abcdef"; printf("a=%d,str=%s\n", a, str); int b = 9; int sum = SumX(a, b, 3, 1); printf("sum=%d", sum); return 0; }
int SumX(int a, int b, int d, int e) { int c = a + b; return c; }
在汇编模式下跟踪到 const char *str = "abcdef"; 这一语句时,显示的汇编语句是: mov dword ptr[ebp - 8], offset main!_NULL_IMPORT_DESCRIPTOR <PERF>(main + 0x22000) (011d2000)
我对于这里的 offset main!_NULL_IMPORT_DESCRIPTOR 命令不是很明白,我用命令 da main + 0x22000 查看内存,显示的如同预期一样是“abcdef”,但是用命令 da main!_NULL_IMPORT_DESCRIPTOR 却显示的是“” (空字符串),用x main!_NULL_IMPORT_DESCRIPTOR 查看地址是0x011d1268, 这个地址0x011d1268与(main + 0x22000 = 0x011d2000) 并不一致。
后来我发现<PERF>是 performance - optimized code的含义,但我编译此程序是用命令行并没有打开任何优化开关 编译程序用的是Visual Studio 2013 x86 命令行工具 我想知道对于“const char *str = "abcdef" 语句 为何会反汇编出offset main!_NULL_IMPORT_DESCRIPTOR 这样的语句,却找不到相应地址中的内容,这个和const变量有什么关系吗? 能为我讲讲原因吗?不甚感激~~~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2015-10-15, 00:22 上午
|
Dic4000
注册: 2015-10-13
发 贴: 7
|
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
|
|
|
|
很感谢你的回复,让我知道我弄错的概念了(汇编也刚刚开始学,很多概念也没理解到位~~~)。我把 main!_NULL_IMPORT_DESCRIPTOR 这个Symbol的地址的值(0x011d126)当成了Offset(偏移量),我一直以为 地址的偏移量是基于0开始的,所以地址就相当于偏移量了。
我现在还有2个问题想请教下: 1: offset main!_NULL_IMPORT_DESCRIPTOR 这个语句所取到的偏移量不是基于0计算得到的,那么它是基于哪个位置(段)的呢? 2:Windbg中有没有什么命令或方式可以得到类似于 offset main!_NULL_IMPORT_DESCRIPTOR 的结果?这个我搜索了好久都没找到。 3:我知道可以使用dumpbin工具可以查看程序中有哪些段以及这些段的范围,在WinDBG中有类似的命令吗?如何知道哪个地址属于哪个段?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2015-10-16, 10:55 上午
|
悬崖遛马
注册: 2012-07-24
发 贴: 30
|
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
|
|
|
|
从生成的汇编代码来看,你的代码应该还是启用了优化的,建议到设置里面disable掉所有优化选项。或者用debug模式调试
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2015-10-16, 14:12 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
|
|
|
|
1,运行期是就是线性地址空间的偏移地址,等价于线性地址 2,直接用x main!_NULL_IMPORT_DESCRIPTOR 3,找到模块起始地址,然后!dh <模块起始地址>
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2015-10-16, 21:30 下午
|
Dic4000
注册: 2015-10-13
发 贴: 7
|
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
附件: 2.png
|
|
|
|
谢谢楼上的回复,但第二个回答我还是没有弄懂。你是说“x main!_NULL_IMPORT_DESCRIPTOR”命令运行后的结果就是汇编语句“offset main!_NULL_IMPORT_DESCRIPTOR”的结果吗? 可这样对不上啊,你看我新的截图:
main模块的地址范围: 00cd0000H ~ 00cf7000H x main!main 00cd1000H x main!_NULL_IMPORT_DESCRIPTOR 00cf1288H 字符串"abcdef" 00cf2000H
这个00cf2000H才是字符串"abcdef"最终在内存中的地址,也是模块的起始地址(00cd0000H)加上00cf2000H的偏移的结果,可那个x main!_NULL_IMPORT_DESCRIPTOR的结果是怎样变成00cf2000H的呢?
Levwz wrote: | 从生成的汇编代码来看,你的代码应该还是启用了优化的,建议到设置里面disable掉所有优化选项。或者用debug模式调试 |
|
我编译的时候 用-od 关掉了优化, 下面是我的cl编译选项: - c - X - I"E:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\include" - TC main.c - Gd - Od - FAcs - Fa"Manual\\" - Fd"Manual\\" - Fo"Manual\\mainObj.obj" - Zi - Zl - Za
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2015-10-17, 17:51 下午
|
Dic4000
注册: 2015-10-13
发 贴: 7
|
Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
|
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » WinDbg » Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系?
|
|
|
|
|
|