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

chi*_*tti 6 windbg stack-trace offset

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

我用Windbg打开,设置符号路径和源路径。运行 !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
Run Code Online (Sandbox Code Playgroud)

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

ser*_*iol 5

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

.excr
Run Code Online (Sandbox Code Playgroud)

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

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


Joh*_*ohn 1

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

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