问题描述
#1 - wseclient.dll+0x121170
#2 - wseclient.dll+0x120024
#3 - wseclient.dll+0x25fbf
我曾经使用 add2line.exe 将地址转换为行,但它在 vs2019 上不起作用,有人知道还有其他方法可以在调用堆栈上转换地址吗?
解决方法
设置示例
一些使用 Visual Studio 2019 编译的示例代码:
#include <iostream>
class Test {
public:
__declspec(noinline) static int one()
{
throw std::exception("maximize debugging fun");
}
};
__declspec(noinline) int main()
{
return Test::one();
}
这将在 WinDbg 中运行时创建以下调用堆栈:
0:000> k
# ChildEBP RetAddr
...
02 00affa6c 00661316 CallStackDecodingExample!Test::one+0x1d [C:\...\CallStackDecodingExample.cpp @ 6]
...
我们可以使用一些计算来来回获取数字:
0:000> ? CallStackDecodingExample!Test::one+0x1d
Evaluate expression: 6689037 = 0066110d
0:000> ? CallStackDecodingExample
Evaluate expression: 6684672 = 00660000
0:000> ? CallStackDecodingExample+0x110d
Evaluate expression: 6689037 = 0066110d
0:000> ln 0066110d
[C:\...\CallStackDecodingExample.cpp @ 6]
(006610f0) CallStackDecodingExample!Test::one+0x1d |
(00661110) CallStackDecodingExample!main
鉴于调试器能够正确解析 PDB,我们现在得到了预期的结果。让我们尝试在没有调试会话的情况下实现这一点,即既不使用实时调试也不使用故障转储分析,而是通过 PDB + 文本输入。
从 DLL + PDB 获取地址
在 WinDbg 中,使用“打开转储文件”,尽管您没有崩溃转储文件。而是打开 DLL(对于本示例是 wseclient.dll 或 CallStackDecodingExample.exe)。
然后使用ln
:
0:000> ln CallStackDecodingExample+0x110d
[C:\...\CallStackDecodingExample.cpp @ 6]
(004010f0) CallStackDecodingExample!Test::one+0x1d
| (00401110) CallStackDecodingExample!main