c++ - 使用 symstore.exe 无法在 Windbg 或 Visual Studio 中为小型转储加载符号

标签 c++ windows visual-studio windbg symstore

为了跟踪仅在 Windows 8 用户计算机上发生的 Qt 崩溃,我设置了一个本地符号服务器以用于调试故障转储。

首先,我使用以下标志集进行了完整构建:

QMAKE_CFLAGS_RELEASE += -Zi
QMAKE_CXXFLAGS_RELEASE += -Zi
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF

并使用 Windows Installer 和 VS 部署项目构建了一个安装程序。然后我运行了以下 symstore.exe 命令:

C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64>symstore.exe add/r/f C:\builddir\*.*/s "C:\Users\Sam\symbols"/t "Application"/v "rev xxxx"/c "test add"

这在 C:\Users\Sam\symbols 中创建了适当的 dll、exe 和 pdb 文件夹。

然后我在用户机器上安装并通过 Process Explorer 生成了一个小型转储文件。我尝试将转储加载到 Visual Studio 并将 C:\Users\Sam\symbols 添加到符号文件位置,但找不到与我的二进制文件匹配的符号。

然后我尝试将它加载到 WinDbg64(这是一个 64 位应用程序)。我设置 !sym noisy 使用 .symfix C:\Users\Sam\symbols 设置符号路径并使用 .reload/f 重新加载。这也没有任何成功,只在加载的地方导出符号。例如:

QtGui4  No data is available : SRV*C:\Users\Sam\symbols*http://msdl.microsoft.com/download/symbols
    The SYMSRV client failed validating the GUID for the module, or the
    module does not have the debug header information.

所有模块都会发生这种情况,但我完全不希望 Qt 组件发生这种情况,因为它们不是作为常规构建的一部分构建的,甚至将符号文件夹设置为直接包含 pdb 文件的 lib 文件夹也无济于事.

然后我尝试针对我的符号存储中的可执行文件和 pdb 文件运行 ChkMatch.exe。可执行文件的签名与 pdb 所在的文件夹相匹配,这表明它们应该是匹配的,但随后出现以下错误:

Debug information file:
Format: PDB 7.00
Error: PDB header - too many pages in root stream.

为了以防万一,我再次针对已安装的可执行文件运行了 ChkMatch.exe,但得到了相同的签名和相同的错误。

编辑: 我尝试设置 symopt+0x40,这应该使 WinDbg 无论如何都使用 pdb,而无需过于仔细地检查签名 GUID。但是它仍然没有加载任何东西。额外输出:

SYMSRV:  C:\Users\Sam\symbols\QtGui4.dll\5202030497e000\QtGui4.dll not found
...
SYMSRV:  C:\Users\Sam\symbols\QtGui4.dbg\5202030497e000\QtGui4.dbg not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/QtGui4.dbg/5202030497e000/QtGui4.dbg not found
DBGHELP: .\QtGui4.dbg - file not found
DBGHELP: .\dll\QtGui4.dbg - path not found
DBGHELP: .\symbols\dll\QtGui4.dbg - path not found
DBGHELP: QtGui4.dll missing debug info.  Searching for pdb anyway
DBGHELP: Can't use symbol server for QtGui4.pdb - no header information available
DBGHELP: QtGui4.pdb - file not found
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for QtGui4.dll - 
DBGHELP: QtGui4 - export symbols

C:\Users\Sam\symbols\QtGui4.dll 中的文件夹名称为 4AA92D1B712000 并且包含正确的 dll。

最佳答案

我最终设法自己解决了这个问题。首先,我必须使用上述步骤从头开始删除并重新创建我的符号存储。我想我最初一定是通过在不同文件夹上使用相同版本号运行 symstore.exe 两次而搞砸了我的商店。

完成此操作后,我就可以加载故障转储并查看 Qt 库的符号,但最多只能加载大约 20 帧,并且没有加载任何其他模块。然后我想复制这个堆栈,但不能从 WinDbg 中的堆栈窗口复制,所以我找到了 k 命令来打印堆栈。这是一个'啊哈!时刻因为 k 命令打印出比堆栈窗口多得多的信息,并表明发生了堆栈溢出。我发现可以为要打印的堆栈深度传入一个附加参数,然后 k 0xFFFF 打印出整个堆栈。

关于c++ - 使用 symstore.exe 无法在 Windbg 或 Visual Studio 中为小型转储加载符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25570040/

相关文章:

c++ - 将函数指针转换为另一个具有更多参数的函数指针

c# - Windows 窗体控件消失了

ios - Visual Studio Xamarin 自动配置不起作用

Main() 函数完成时 C++ 程序自动关闭

c++ - 用 C++ 思考?

c++ - 在 unique_ptr 中删除的构造函数

windows - 用于确定路径是相对路径还是绝对路径的 Win32 API?

windows - 你知道 Windows 上的 wc(unix 字数统计命令)的类似程序吗?

c++ - 提取证书中主题属性的所有值

visual-studio - 即时调试器不会安装在 Visual Studio 2017 中