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

C++ 使用symstore.exe无法在Windbg或Visual Studio中加载小型转储的符号,c++,windows,visual-studio,windbg,symstore,C++,Windows,Visual Studio,Windbg,Symstore,为了跟踪仅在Windows8用户机器上发生的Qt崩溃,我设置了一个本地符号服务器,用于调试崩溃转储 首先,我设置了以下标志进行了完整构建: QMAKE_CFLAGS_RELEASE += -Zi QMAKE_CXXFLAGS_RELEASE += -Zi QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF 并使用Windows installer和VS部署项目构建了一个安装程序。然后,我运行了以下symstore.exe命令: C:\ProgramFiles(x86

为了跟踪仅在Windows8用户机器上发生的Qt崩溃,我设置了一个本地符号服务器,用于调试崩溃转储

首先,我设置了以下标志进行了完整构建:

QMAKE_CFLAGS_RELEASE += -Zi
QMAKE_CXXFLAGS_RELEASE += -Zi
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF
并使用Windows installer和VS部署项目构建了一个安装程序。然后,我运行了以下symstore.exe命令:

C:\ProgramFiles(x86)\Windows Kits\8.1\Debuggers\x64>symstore.exe添加/r/f C:\builddir\*/s“C:\Users\Sam\symbols”/t“应用程序”/v“rev xxxx”/C“测试添加”

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

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

然后我尝试将其加载到WinDbg64(这是一个64位应用程序)。我设置
!sym noised
设置符号路径。symfix C:\Users\Sam\symbols
并用
重新加载。重新加载/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组件出现这种情况,因为它们不是作为常规构建的一部分构建的,甚至将symbol文件夹设置为直接包含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在不太仔细检查签名GUID的情况下使用PDB。然而,它仍然没有加载任何东西。额外输出:

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

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


一旦我这样做了,我就可以在崩溃转储中加载并查看Qt库的符号,但最多只能加载20帧,并且没有加载任何其他模块。然后我想复制这个堆栈,但无法从
WinDbg
中的堆栈窗口复制,因此找到了
k
命令来打印堆栈。这是一个“啊哈!”因为
k
命令打印出的内容远远超过堆栈窗口,并显示发生了堆栈溢出。我发现可以为要打印的堆栈深度传入一个额外的参数,并在整个堆栈中打印出一个
k0xffff

我提到二进制文件确实也被上传了。“这在
C:\Users\Sam\symbols
中创建了相应的dll、exe和pdb文件夹。”。