【问题标题】:How to find line numbers corresponding to offsets in stack trace using windbg?如何使用windbg在堆栈跟踪中找到与偏移量对应的行号?
【发布时间】:2011-08-01 10:01:20
【问题描述】:

我有一个非托管 C++ 代码的故障转储。

我用Windbg打开,设置符号路径和源路径。 Ran !analyze -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找到这个偏移量对应的行号?

【问题讨论】:

  • 您找到问题的解决方案了吗?

标签: windbg stack-trace offset


【解决方案1】:

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

.excr

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

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

【讨论】:

【解决方案2】:

这通常发生在找不到模块的符号时。使用 lm 命令列出所有模块。

lm

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

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

!itoldyouso SpamCatcher

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

!symnoisy
.reload /f

【讨论】:

  • 符号为他的模块加载正常。您可以查看静态链接 CRT 的行号。
  • 'lm' 列出了我的 'WINSPAMCATCHER(私有 pdb 符号)'。 !itoldyouso WINSPAMCATCHER 列出了 'MATCH: winspamcather.pdb 和 WINSPAMCATCHER.dll' .reload /f with !sym noise 显示了 'DBGHELP: WINSPAMCATCHER - private symbols & lines' 但是当我运行 !analyze -v 我没有看到一条线数字。我得到了问题中列出的相同堆栈跟踪。
【解决方案3】:

从 CRT 函数的行号可以看出,您的程序(或者它是 DLL?)的符号已正确加载。验证您是否已将 /Zi 指定给编译器。

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

【讨论】:

    【解决方案4】:

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

    • 启用

      .lines -e
      
    • 禁用

      .lines -d
      
    • 切换

      .lines -t
      

    【讨论】:

    • 也已经尝试过了。没有运气。我特别想查找是否有任何方法可以将偏移量 0x338 与代码中的特定行号相关联。
    • 您所指定的正是上述命令所发生的。你在哪里找线号?它们出现在堆栈跟踪中每一帧的最右侧。
    • 是的,我正在检查极右翼。我不断得到问题中列出的相同堆栈跟踪。 Windbg 是否有可能没有从我提到的源路径加载文件? .srcpath 列出了我设置的路径。有没有办法在分析时检查windbg是否正在获取所需的文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2016-07-03
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多