如何在带有 PDB 文件的 Windows 上将地址转换为行和文件名?

问题描述

我有这样的 PDB 文件调用

#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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...