我有一个应用程序,在调试版本中运行得很好,但当我在发布版本中启动它时,会出现
unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005:
Access violation while reading at position 0x004bd96c
如果我点击“中断”,它会告诉我没有加载符号,无法显示源代码。在这种情况下,我该如何追踪问题?
我有一个应用程序,在调试版本中运行得很好,但当我在发布版本中启动它时,会出现
unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005:
Access violation while reading at position 0x004bd96c
这种问题通常是由于未初始化的变量引起的。我建议从这里开始查找问题。
调试模式更加宽容,因为经常配置为初始化没有明确初始化的变量。
也许你正在删除一个未初始化的指针。在调试模式下可以工作,因为指针被清空并且对 NULL 进行 delete ptr 是可以的。但在发布模式下则是垃圾值,然后 delete ptr 就会导致问题。
assert
重新定义为空操作。如果某些断言缺失导致崩溃,你将看到它。否则,就是其他原因。.dll
吗?我曾经花了一个小时想弄清楚为什么我的程序在调试模式下编译成功,但在发布模式下却失败了,结果只是因为我忘记更新发布文件夹中的dll文件。两个步骤:
a) 使用调试符号构建发布版本(至少使用VS可以实现)
b) 构建没有优化的发布版本
如果问题仍然出现,那么很好解决,并且几乎就像在调试版本中出现了问题。
如果问题发生在启用优化设置时,则真的很难处理,必须根据具体情况进行处理。
0x0043b134
或地址0x004bd96c
处的内容是什么。 - MSalters/DEBUG
意味着/OPT:NOREF, /OPT:NOICF
;文档说明您需要显式设置它们以获取带调试信息的发布版本。现在这两个标志将成为我的主要嫌疑对象。 - MSalters从main
函数一开始就插入日志输出,以追踪问题。
如果不是内存问题,那么你需要在发布版本中启用断言。对于内存问题,希望你有好的单元测试。你可以使用valgrind轻松捕获此类问题。
顺便问一下,为什么人们要在发布版本中禁用断言?在99%的情况下,它们不会导致性能问题,并且可以很好地检测错误。
不看代码很难确定问题出在哪里。以上所有建议都是好的和有用的,但我发现最有帮助的方式是将程序的某些部分分块运行来修复这种问题。也就是说,注释掉大量的代码/功能,然后运行程序并查看是否崩溃。如果没有,那么取消注释一些功能,再次运行,如此反复。通过这种方式,您将能够将问题缩小到导致其发生的确切代码。
在大多数情况下,这是由于一些缓冲区溢出引起的,而调试构建可以预防。
对我来说,问题在于构造函数以错误的顺序初始化了两个成员变量。即它们声明的顺序不同。
我很惊讶初始化顺序实际上会有任何影响。