5

假设我正在调试优化代码中的崩溃。我查看反汇编,我看到如下内容:

lea eax,[edi+8Ch] 

现在假设我知道 edi 中存储了什么结构,在这种情况下,它是一个有点大的结构。足够大,以至于我一眼就无法分辨出 8Ch 偏移量对应的字段。

我一直在做的只是在 Visual Studio 中打开我的监视窗口并手动对强制转换的 NULL 指针进行指针运算(offsetof 宏会做什么),直到我得到匹配的那个,但这很乏味。有没有办法可以更快地确定正在访问哪个字段?

4

2 回答 2

3

在 VisualStrudio 中,您应该能够“观看”这样的表达式:

(unsigned)&(((StructTypeName*)0)->StructFieldName)

您输入不同的字段名称,直到 VS 显示正确的偏移值。

您还可以将您的应用程序加载到WinDbg(确保已加载符号)并使用该dt命令。WinDbg 将转储提供的类型/变量名称的布局/内容以及所有字段的偏移量。

于 2012-10-05T05:21:33.880 回答
0

如果您需要花时间在这个调试方案上,我建议编写一个程序来打印结构字段的所有偏移量,并将它们offset; field成对列出。

我会更进一步,编写一个脚本(例如在 Python 中),它采用结构的文本并生成一个 C 代码文件,其中包含所有offsetof结构字段的所有语句。

于 2012-10-04T20:53:17.817 回答