我有一个c ++应用程序,它使用g3log库在崩溃发生时提供堆栈跟踪信息。我的发布配置还构建了完整的pdb文件,以便可以实现。我的app.exe存储了pdb文件的完整路径,即我没有使用/ PDBALTPATH:%_ PDB%。
当我从任何文件夹路径运行.exe时,只要.pdb没有被移动,那么如果我强制崩溃,我会得到一个有意义的堆栈跟踪。现在如果我将.pdb文件移动到与我的.exe相同的目录中,它就不再被加载了。我的猜测是与.exe中的路径不匹配。我以为会加载一个与.exe同名的.pdb文件,我想我错了。
我已经通过指定/ PDBALTPATH:%_ PDB%进行了测试,这样就没有路径信息,但是再次永远不会加载.pdb文件。
对于这两种情况,如果我附加一个调试器,那么调试器中的一切都很好,但不在我的堆栈跟踪中。
有没有办法让#34;自动加载" .pdb(不知道如何调用它)的时候它与.pdb在同一目录中时发生的完整路径匹配。这样我就可以在需要时获得有意义的调用堆栈。
答案 0 :(得分:0)
一般来说,你的用例似乎很奇怪。因为意外的异常通常意味着未定义的状态,并且没有意义继续。因此,您可能需要保存转储并稍后使用PDB文件进行调查。
我不确定在开发环境中获取堆栈跟踪信息的内部机制。但通常情况下,调试器正在查找 PDB文件并尝试从不同位置加载它。当您使用EXE文件放置PDB文件时,您可以通过调试器找到它。
例如,我的构建服务器在构建到本地符号服务器时保存PDB文件。当我使用调试器调试崩溃转储时,它会正确获得所需的符号。
我从未尝试过你想做的事情。事实上,它看起来像生产中的调试版本,这不是一个好习惯。所以,我会考虑上面描述的方法。
答案 1 :(得分:0)
您可以设置此路径; 设置_NT_SYMBOL_PATH = C:\ MySymbols,其中有pdb文件。 这是一个简单的方法,如果你不能设置这条路径,那么按照以下步骤。
你提到了:
当我从任何文件夹路径运行.exe时,只要.pdb没有被移动,那么如果我强行崩溃,我会得到一个有意义的堆栈跟踪。<< ;
因此,请务必确保您的应用从.exe + .pdb文件所在的目录运行。
您可以使用GetModuleFileName + SetCurrentDirectory执行此操作。 这意味着,您的工作目录是不同的。 我建议,在你的申请中,得到“GetModuleFileName”。 然后使用:SetCurrentDirectory将工作目录更改为exe路径。
答案 2 :(得分:0)
似乎@prasad-mk是正确的一半。设置_NT_SYMBOL_PATH会以某种方式强制加载我的.pdb符号,就像路径匹配的情况一样。
我发现的另一个选项是使用此实用程序 http://bytepointer.com/tools/index.htm#peupdate更新我的pdb位置wharever的路径。