【问题标题】:how to convert address to lines and file names on windows with PDB files?如何在带有 PDB 文件的 Windows 上将地址转换为行和文件名?
【发布时间】:2021-06-18 21:06:43
【问题描述】:

我有这样的 PDB 文件和调用堆栈

#1 - wseclient.dll+0x121170
#2 - wseclient.dll+0x120024
#3 - wseclient.dll+0x25fbf

我曾经使用add2line.exe将地址转换为行,但是在vs2019上不起作用,有人知道还有其他方法可以在callstack上转换地址吗?

【问题讨论】:

    标签: visual-studio-2017 windbg callstack pdb


    【解决方案1】:

    设置示例

    一些使用 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
    

    【讨论】:

    • 嗨,Thomas,抱歉更新晚了。我尝试使用 windbg 打开我的 dll 并运行命令:ln wseclient.dll+0x766f9 但我得到“无法解决 'wseclient.dll+0x766f9' 处的错误。你知道这个错误吗?非常感谢。
    • 你打开了 wseclient.dll,还是打开了别的东西?什么是“我的 DLL”?
    • 我打开了 wseclient.dll,它终于可以工作了。谢谢托马斯,你拯救了我的一天。你知道我们是否可以使用命令行来做这样的事情吗?
    • 应该是可以的。就在我的脑海里cdb -z wseclient.dll -c "ln wseclient.dll+xxx;q"。类似的东西
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2013-03-25
    • 2019-01-03
    • 2016-02-10
    • 2017-12-22
    相关资源
    最近更新 更多