如何使用windbg查找堆栈跟踪中与偏移相对应的行号?

时间:2011-08-01 10:01:20

标签: windbg stack-trace offset

我有一个非托管C ++代码的崩溃转储。

我用Windbg打开它,设置符号路径和源路径。 跑!分析-v并获得以下堆栈跟踪

STACK_TEXT:  
094efec0 7439fdc8 8b6ac787 00000000 00000000 WINSPAMCATCHER!_invalid_parameter_noinfo+0xc [f:\dd\vctools\crt_bld\self_x86\crt\src\invarg.c @ 125]
094eff3c 743a005e 085c37d8 74547d66 085c37d8 WINSPAMCATCHER!SpamCatcher::SCEngine::ruleUpdateLoop+0x338
094eff44 74547d66 085c37d8 8b6ac637 00000000 WINSPAMCATCHER!SpamCatcher::SCEngine::ruleUpdateLoopWrapperWin+0xe
094eff7c 74547e0e 00000000 094eff94 771df13c WINSPAMCATCHER!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
094eff88 771df13c 091707c8 094effd4 7769d80d WINSPAMCATCHER!_threadstartex+0x82 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
WARNING: Stack unwind information not available. Following frames may be wrong.
094eff94 7769d80d 091707c8 7e3e52db 00000000 kernel32+0x8f13c
094effd4 7769da1f 74547d8c 091707c8 00000000 ntdll+0x7d80d
094effec 00000000 74547d8c 091707c8 00000000 ntdll+0x7da1f

从上面的堆栈跟踪中我看不到SCEngine :: ruleUpdateLoop + 0x338的行号。 相反,我看到偏移0x338。我猜这是某种装配偏移。是否可以使用windbg找到与此偏移对应的行号?

4 个答案:

答案 0 :(得分:2)

当您无法找到模块的符号时,通常会发生这种情况。使用lm命令列出所有模块。

lm

查找SpamCatcher并查看它是否找到了您的私有符号(好),或者它是否使用导出符号(错误)。

itoldyouso扩展程序还应告诉您PDB是否匹配。

!itoldyouso SpamCatcher

如果您需要进一步解决符号问题,请尝试启用详细符号加载,然后重新加载符号:

!symnoisy
.reload /f

答案 1 :(得分:1)

从CRT函数的行号中可以明显地正确加载程序的符号(或者是DLL?)。验证您是否已为编译器指定了/ Zi。

您还可以通过查看反汇编u WINSPAMCATCHER!SpamCatcher::SCEngine::ruleUpdateLoop WINSPAMCATCHER!SpamCatcher::SCEngine::ruleUpdateLoop+0x338并在头脑中进行反编译来尝试找出行号。这并不像你想象的那么困难。我建议this论文作为开始。

答案 2 :(得分:0)

打开调用堆栈窗口(在主窗口工具栏中可用),然后在调用堆栈窗口的工具栏中,切换“源”按钮以激活它。接下来,在主窗口上输入

.excr

然后在调用堆栈窗口中,条目将包含文件路径和行号。

最后,如果你加载了源文件,你只需双击一个条目,它就会弹出一个窗口,突出显示有问题的行。 :)

答案 3 :(得分:-2)

使用“.lines”将打开或关闭行号

  • 启用

    .lines -e
    
  • 禁用

    .lines -d
    
  • 切换

    .lines -t