gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:40 25 4
gpt4 key购买 nike

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

Windows C++ stack trace from a running app

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

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

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

所以我需要知道的是:“我可以给这些帮助客户的最简单的指令集是什么,例如最小的 .dll 集以及将它们粘贴到哪里,以便我们可以从堆栈跟踪中获取正确的符号信息当我们的程序崩溃时?”

最佳答案

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

在我的配置中,我有一个名为“Edval.exe”的 exe 和一个名为“DebugEdval.pdb”的 .pdb。该过程在搜索文件夹中搜索“DebugEdval.pdb”。这对应于您在“属性 > 链接器 > 调试 > 生成程序数据库文件”中配置的内容。

关于c++ - 从 C++ (Windows) 转储堆栈跟踪 - 找不到符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28621905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com