为了跟踪仅在Windows 8用户机器上发生的Qt中的崩溃,我设置了一个本地符号服务器,用于调试崩溃转储。
首先,我做了一个完整的构建,设置了以下标志:
QMAKE_CFLAGS_RELEASE += -Zi
QMAKE_CXXFLAGS_RELEASE += -Zi
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF并使用Windows安装程序和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生成一个微型文件。我尝试将转储加载到Visual,并将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使用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 symbolsC:\Users\Sam\symbols\QtGui4.dll中的文件夹名为4AA92D1B712000,包含正确的dll。
发布于 2014-09-01 12:51:38
我终于自己解决了这个问题。首先,我不得不删除和重新创建我的符号存储从零使用上述步骤。我想我一开始一定是用相同的版本号在不同的文件夹上运行了两次symstore.exe,从而破坏了我的商店。
一旦我这样做了,我就可以在崩溃转储中加载,并看到Qt库的符号,但是只有大约20个帧,其他模块都没有加载。然后,我想复制这个堆栈,但是无法从WinDbg中的堆栈窗口复制,因此找到了k命令来打印堆栈。这是一个“啊哈!”这是因为k命令输出的比堆栈窗口多得多,显示堆栈溢出已经发生。我发现可以为要打印的堆栈的深度传递一个额外的参数,并将一个k 0xFFFF打印出整个堆栈。
发布于 2014-08-30 16:20:54
对于使用minidump,您也应该将二进制文件上传到symstore。
https://stackoverflow.com/questions/25570040
复制相似问题