我正在编写一个小应用程序,它打印出给定崩溃转储的调用堆栈。代码或多或少基于本教程:http://blogs.msdn.com/b/joshpoley/archive/2008/05/27/opening-a-crash-dump-file-automating-crash-dump-analysis-part-1.aspx?Redirected=true
当调试符号位于崩溃转储旁边时,代码可以正常工作。但是,当我的应用程序位于符号服务器中时,它找不到调试符号。我的符号服务器在_NT_SYMBOL_PATH
中指定。我很确定_NT_SYMBOL_PATH
和符号服务器没有问题,因为当我在Visual Studio和WinDbg中打开崩溃转储时,他们能够在符号服务器中找到符号。
我将SYMOPT_DEBUG
选项添加到我的IDebugSymbols
实例中,并得到以下输出:
DBGHELP: _NT_SYMBOL_PATH
:
srv*c:\localsymbols*my_symbol_server*http://msdl.microsoft.com/download/symbols
DBGHELP: Symbol Search Path
:
.;srv*c:\localsymbols*my_symbol_server*http://msdl.microsoft.com/download/symbols
我想这意味着我的IDebugSymbols实例知道符号服务器。
有没有人知道我做错了什么?
提前致谢。
答案 0 :(得分:1)
您应该获得Windows调试工具(现在从Windows套件中获取)并使用组件 它的dbgeng.dll,dbghelp.dll和symsrv.dll。操作系统在System32中具有这些dll的标准版本,不幸的是它们具有受限制的功能。例如,他们不支持Windows 7上的符号服务器。
你可能觉得我们的项目很有用:
kdlibcpp
pykd - python wrapper for kdlibcpp
例如,此代码打印出当前堆栈:
StackPtr stk = getStack();
for ( int i = 0; i < stk->getFrameCount(); ++i )
dprintln( findSymbol( stk->getFrame(i)->getIP() ) )