Windbg堆栈跟踪在宏扩展之前或之后显示行号

时间:2014-04-07 07:05:37

标签: c macros windbg stack-trace

我有一个包含多个宏的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的行。但是,上面有几行电话。

1 个答案:

答案 0 :(得分:0)

我在这里没有直接回答问题:(

但我会制作一个COD文件。 a file that maps source code to assembly code。然后查看为感兴趣的函数生成的汇编代码。特别与第1516行有关。

我希望能够对幕后发生的事情提供公平的见解。你可能想尝试一下。

您只需打开编译器标志即可生成COD文件。更多内容可以阅读here