从 C++ (Windows) 转储堆栈跟踪 - 找不到符号

Dumping a stack trace from C++ (Windows) - fails to find symbols

我是 Windows 桌面软件的开发人员,我们的应用程序有时会崩溃。在极少数情况下,我想让客户 运行 应用程序的调试版本向我发送堆栈跟踪,以便我知道它崩溃的位置。我按照此处的说明操作:

Windows C++ stack trace from a running app

...但是当它在我的开发机器上工作时,它在任何客户端机器或我同事的机器上都不起作用,他们没有安装 Visual Studio。所以我假设在它工作之前有一些 .dll 或他们需要的东西。他们使用的是我正在使用的相同 .exe,即我在 VC++ 中以调试模式编译的那个。

经过一些艰苦的 "message window" 调试,我发现它在 SymGetSymFromAddr64() 中失败了 - 这个 returns FALSE。但是当我遍历堆栈时,这总是 returns FALSE 或者它 returns 没有意义的垃圾(随机无关的方法名称),就好像它是无效的 PC 值,而不是映射过程.重申一下,它是一个调试模式 .exe,可在我的开发机器上生成完美的符号堆栈跟踪。

我做了一些研究,发现了一些关于 "dbghelp.dll" 和 "imagehlp.dll" 的提及,但我最终还是感到困惑。 "dbghelp.dll" 随 Windows 的所有版本一起提供,但功能有所减少。我还可以安装一些其他的东西,但是安装一些 Windows "WDK" 或 "debug kits" 有点可怕,它们可能会覆盖重要的系统 .dll 或对您的计算机做天知道的事情.

所以我需要知道的是:"what's the simplest set of instructions I can give to these helper customers e.g. the minimum set of .dll's and where to stick them so that we can get proper symbolic information out of the stack traces when our program crashes?"

找不到符号的最可能原因是找不到.pdb 文件。即使您在调试模式下生成 .exe,符号也不在 .exe 中,它们在 .pdb 文件中。通过大量的实证测试,该进程似乎在其中硬编码了 .pdb 的路径名,因此如果您的客户在该位置没有该文件,他们不一定会找到它。但是,您可以向 SymInitialize() 函数提供 "search path" - 一个文件夹或一组文件夹,用于搜索 .pdb 文件。

在我的配置中,我有一个名为 "Edval.exe" 的 exe 和一个名为 "DebugEdval.pdb" 的 .pdb。该过程在搜索文件夹中搜索 "DebugEdval.pdb"。这对应于您在 "Properties > Linker > Debugging > Generate Program Database File".

中配置的内容