假设我正在调试优化代码中的崩溃。我查看反汇编,我看到如下内容:
lea eax,[edi+8Ch]
现在假设我知道 edi 中存储了什么结构,在这种情况下,它是一个有点大的结构。足够大,以至于我一眼就无法分辨出 8Ch 偏移量对应的字段。
我一直在做的只是在 Visual Studio 中打开我的监视窗口并手动对强制转换的 NULL 指针进行指针运算(offsetof 宏会做什么),直到我得到匹配的那个,但这很乏味。有没有办法可以更快地确定正在访问哪个字段?
假设我正在调试优化代码中的崩溃。我查看反汇编,我看到如下内容:
lea eax,[edi+8Ch]
现在假设我知道 edi 中存储了什么结构,在这种情况下,它是一个有点大的结构。足够大,以至于我一眼就无法分辨出 8Ch 偏移量对应的字段。
我一直在做的只是在 Visual Studio 中打开我的监视窗口并手动对强制转换的 NULL 指针进行指针运算(offsetof 宏会做什么),直到我得到匹配的那个,但这很乏味。有没有办法可以更快地确定正在访问哪个字段?
在 VisualStrudio 中,您应该能够“观看”这样的表达式:
(unsigned)&(((StructTypeName*)0)->StructFieldName)
您输入不同的字段名称,直到 VS 显示正确的偏移值。
您还可以将您的应用程序加载到WinDbg
(确保已加载符号)并使用该dt
命令。WinDbg 将转储提供的类型/变量名称的布局/内容以及所有字段的偏移量。
如果您需要花时间在这个调试方案上,我建议编写一个程序来打印结构字段的所有偏移量,并将它们offset; field
成对列出。
我会更进一步,编写一个脚本(例如在 Python 中),它采用结构的文本并生成一个 C 代码文件,其中包含所有offsetof
结构字段的所有语句。