为了跟踪仅在 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 的内容。