Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 确定给定字段的结构的字段';s偏移量_C_Visual Studio_Debugging_Struct - Fatal编程技术网

C 确定给定字段的结构的字段';s偏移量

C 确定给定字段的结构的字段';s偏移量,c,visual-studio,debugging,struct,C,Visual Studio,Debugging,Struct,假设我正在调试优化代码中的崩溃。我在拆解中看到如下内容: lea eax,[edi+8Ch] 现在让我们假设我知道edi中存储的是什么结构,在本例中,它是一个有点大的结构。足够大以至于我无法一眼看出8Ch偏移对应于哪个字段 我一直在做的就是在VisualStudio中打开我的watch窗口,手动对一个铸造的空指针进行指针运算(offsetof宏会做什么),直到得到一个匹配的指针为止,但这很乏味。有什么方法可以更快地确定访问哪个字段吗?如果您需要花时间使用此调试方案,我建议编写一个程序,打印结

假设我正在调试优化代码中的崩溃。我在拆解中看到如下内容:

lea eax,[edi+8Ch] 
现在让我们假设我知道edi中存储的是什么结构,在本例中,它是一个有点大的结构。足够大以至于我无法一眼看出8Ch偏移对应于哪个字段


我一直在做的就是在VisualStudio中打开我的watch窗口,手动对一个铸造的空指针进行指针运算(offsetof宏会做什么),直到得到一个匹配的指针为止,但这很乏味。有什么方法可以更快地确定访问哪个字段吗?

如果您需要花时间使用此调试方案,我建议编写一个程序,打印结构字段的所有偏移量,并将它们列在
偏移量中;字段


我会更进一步,编写一个脚本(例如,用Python编写),该脚本获取结构的文本并生成一个C代码文件,其中包含所有结构字段的
偏移量

(unsigned)&(((StructTypeName*)0)->StructFieldName)
输入不同的字段名,直到VS显示正确的偏移量值


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

这似乎可行,但这将是一件痛苦的事情-我必须让脚本解析我的整个程序,以防有嵌入式结构或typedef,并知道如何打包和对齐。把事情做好并可靠地处理所有边缘案件是件痛苦的事。。是的,我知道在某些情况下这可能不是一个选项。是的,在这种情况下肯定不是一个选项。代码不是C++兼容的:-/您阅读反汇编来调试C程序有什么好的理由吗?因为调用堆栈不能准确反映我所使用的函数,因为有许多函数是内联的(而崩溃本身是在内联函数中)。我需要查看反汇编以查看崩溃实际发生的位置。并且无法在调试模式下调试此代码?
cl.exe input.cpp/d1reportAllClassLayout>layouts.txt
将生成所有类/结构及其布局的转储。不幸的是,看起来你需要编译为C++,而不是纯C(添加<代码> /tp>代码>强制编译。C文件是C++)。@ d编码器非常好,但不是所有C代码都是C++代码,所以编译它的工作量很大。对于第一个建议,我已经在我的初始问题中发表了这篇文章,我现在正在做的是这个。但是在大型结构上,手工对所有字段进行二进制搜索会变得很乏味。我将查看WinDbg,看看
dt
是否符合我的要求。