2

为了跟踪仅在 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.

然后我在用户机器上安装并通过 Process Explorer 生成了一个 minidump 文件。我尝试将转储加载到 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 文件夹也无济于事。

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

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

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

编辑: 我尝试了设置symopt+0x40,它应该让 WinDbg 使用 pdbs 而不仔细检查签名 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 的内容。

4

2 回答 2

1

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

完成此操作后,我可以加载故障转储并查看 Qt 库的符号,但最多只能加载大约 20 帧,并且没有加载任何其他模块。然后我想复制这个堆栈,但无法从堆栈窗口中复制WinDbg,因此找到了k打印出堆栈的命令。这是一个“啊哈!” 时刻,因为该k命令打印出的内容远远超过堆栈窗口,并显示发生了堆栈溢出。我发现可以为要打印的堆栈的深度传递一个附加参数,并k 0xFFFF打印出整个堆栈。

于 2014-09-01T12:51:38.367 回答
0

要使用 minidump,您也应该将二进制文件上传到 symstore

于 2014-08-30T16:20:54.110 回答