我有一个包含多个宏的C文件。
从文件生成的exe会在Windows事件查看器中多次报告事件时崩溃。在获取进程的转储并使用WinDbg使用正确的符号pdb文件对其进行分析后,我们得到堆栈跟踪并知道导致问题的函数。
stacktrace显示我们的函数代码的行号,这些函数调用了其中一个导致崩溃的函数 -
08 msvcr80!fwrite(void * buffer = 0x00000000`01ded180, unsigned int64 size =
0x1fff38, unsigned int64 count = 0x524fe123, struct _iobuf * stream =
0x00000000`00000000)+0x5f [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\fwrite.c
@ 77]
09 <function name>(void * param = 0x00000000`02d15a00)+0xb02
[<path to file> @ 1516]
我们的函数名为fwrite
,显示在第1516行。但是,在1516没有调用fwrite。(崩溃发生是因为fwrite
的流参数是0x0)< / p>
我想知道在扩展宏之后这些行号是否对应于源文件? 可能错误的行号可能是什么原因?
编辑:这里的exe是一个调试版本,编译时禁用了优化。
我在WinDbg中再次加载转储,但这次也在源文件中链接到WinDbg。它指向第1516行并且在从WinDbg查看源中时,它指向没有调用fwrite
的行。但是,上面有几行电话。
答案 0 :(得分:0)
我在这里没有直接回答问题:(
但我会制作一个COD文件。 a file that maps source code to assembly code
。然后查看为感兴趣的函数生成的汇编代码。特别与第1516行有关。
我希望能够对幕后发生的事情提供公平的见解。你可能想尝试一下。
您只需打开编译器标志即可生成COD文件。更多内容可以阅读here