繁体   English   中英

如果调试运行正常但释放崩溃怎么办

[英]what to do if debug runs fine, but release crashes

我有一个可以在调试版本中正常运行的应用程序,但是当我在发行版本中启动它时,会得到一个

unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005:
Access violation while reading at position 0x004bd96c

如果单击“中断”,则表明没有加载符号,并且无法显示源代码。

在这种情况下我该怎么办才能找出问题所在?

这种问题通常是由于单位变量引起的。 我将从那里开始寻找您的问题。

调试模式更为宽容,因为它通常配置为初始化尚未显式初始化的变量。

也许您要删除一个统一的指针。 在调试模式下,它起作用是因为指针已为空,并且删除ptr可以为NULL。 发布时有些垃圾,然后删除ptr实际上会引起问题。

可能有两件事:

  • 除了检查本身之外,您的一个或多个断言还可以进行必要的工作
  • 还有别的

要排除前者,请尝试在调试版本中将assert重新定义为空操作。 如果缺少某些断言导致崩溃,您将看到它。 否则,这是另一回事。

另外,我假设您具有版本控制权。 这刚刚开始发生吗? 您可以分析上周以来的代码更改。

最后,即使在调试模式下没有崩溃,运行内存检查器工具也可能有助于发现错误的内存访问。

两步:

a)带有调试符号的版本发行版(至少在VS中可用)

b)无需优化即可构建发行版本

如果问题仍然存在,则非常好且易于修复。 好像问题出在调试版本中一样。

如果在启用优化设置的情况下发生问题,那么这确实很困难,必须根据具体情况进行处理。

我遇到了这个问题,发布/调试在Visual Studio中运行良好,单独调试工作,但是发布崩溃了。 调试对我而言不是特别准确,我的解决方案是:

注释掉大多数代码,然后构建,测试,取消注释,重复,直到找到导致崩溃的部分。

在我的情况下,它传递的指针指向的数组对于函数而言太小。

您确定两个版本都使用相同的.dll吗? 我花了一个小时想知道为什么我的程序没有在调试模式下进行编译,而在发布模式下进行了编译,却忘记了更新发布文件夹中的dll。

main功能的开头一直跟踪到此插入日志输出的问题。

如果不是内存问题,则必须在发行版中启用断言。 对于内存问题,希望您获得了不错的单元测试。 您可以使用valgrind轻松捕获此类问题。

顺便说一句,为什么人们禁用发行版中的断言? 在99%的情况下,它们不会导致性能问题,并且可以很好地检测错误。

对我来说,问题在于构造函数以错误的顺序初始化2个成员变量。 也就是说,它们的声明顺序不同。
我很惊讶初始化顺序实际上没有任何作用。

在Windows上使用Microsoft debugdiag (免费)进行故障转储,并使用相同的程序分析转储。 它为崩溃的函数提供了一个不错的调用堆栈。 虽然,如果它仍然到处崩溃,那可能是堆损坏的问题。 然后,您需要与debugdiag结合使用全局标志(或gflags,这是Microsoft用于调试套件的工具的一部分,它是免费的)。 Gflags将为您提供堆实际上已损坏的位置。 希望能有所帮助。

如果不看代码,很难说出什么不好。 以上所有建议都是有益且有用的,但是我发现最有效的解决此类问题的方法是分批运行程序的某些部分。 即,注释掉很多代码/功能,然后运行程序,看看它是否崩溃。 如果不是,则取消注释某些功能,然后重新运行,依此类推。 这样,您就可以将问题缩小到导致此问题的确切代码。

在大多数情况下,这种情况的发生是由于Debug构建可以防止的某些Buffer超载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM