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