TC.*_*TC. 1 c++ debugging visual-studio-2008 visual-studio
我有一个相当大的解决方案偶尔会崩溃.遗憾的是,这些崩溃似乎只发生在发布版本中.当我在崩溃时附加调试器时,我收到消息:
"没有为任何调用堆栈帧加载符号.源代码无法显示"
这使得很难找到崩溃的原因.我正在使用visual studio 2008的默认版本构建设置,其中"调试信息格式"设置为"程序数据库(/ Zi)".
你有什么提示可以帮我找到这个bug吗?例如,我可以更改项目中的某些设置,以便崩溃可能仍然发生但在调试器中获取更有意义的信息吗?
更新:问题是一个非常罕见的逻辑错误,本身不应该导致崩溃,但显然导致其他地方崩溃.解决逻辑错误解决了崩溃行为.
对于那些来到这里寻找解决类似问题的人来说:运气好的话,你是一个艰难的旅程.最终帮助我找到问题的是在代码中添加了大量的边界检查(我可以使用预处理器指令启用/禁用)并为linux编译并使用gdb/valgrind运行.
首先确保您为发布版本构建符号(调试信息),并且调试器可以找到它们(这可能需要配置符号路径 - 符号服务器会更好).
其次在调试时使用Modules视图以确认您已加载符号.
获取符号的最简单方法是将.pdb文件放在与程序集相同的位置.
查看John Robbins博客,了解更多有关此操作的详细信息.
如果代码在应用优化后崩溃(如在默认版本中),则很可能是您的代码存在某些缺陷,并且依赖于在发布和调试版本之间发生变化的未定义行为.
尝试在发布版本中关闭优化以查看问题是否消失(或者在调试版本中将其打开以查看是否发生).如果确实如此,你仍然应该找到并修复bug,但你至少会知道要寻找未定义的行为.
将编译器警告级别设置为最大值(/ W4),将警告设置为错误(/ Wx)并修复所有警告(而不是简单地将所有内容放在视线中 - 考虑一下!).应用优化时,您可能会收到调试版本中未发生的警告,因为执行了更广泛的代码分析 - 这是非常有用的静态分析.
如果您希望在优化版本中进行切换调试,则可以使用,但由于优化器可能会重新排序代码并删除代码和变量,因此您不太可能按照正在进行的操作进行操作.