2010-10-25 90 views
5

我有一个运行在调试版本就好了,但是当我在发布版本中启动它,我得到一个做什么,如果调试运行正常,但发布崩溃

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

如果我点击一个应用程序在'break'时它告诉我没有加载符号并且不能显示源代码。

在这种情况下我能做些什么来追踪问题?

+0

由于内存问题,有时会发生这种情况。通常发布版本在这方面的宽容度较低。你的程序可能有内存泄漏,缓冲区溢出问题等? – Cam 2010-10-25 07:12:56

+0

什么样的内存问题? – Mat 2010-10-25 07:14:16

+1

看起来你已经删除了一些东西,但尝试使用它。无论如何,你实际上可以发布一些代码吗?如果你不告诉我们你在做什么,我们就无能为力。 – GManNickG 2010-10-25 07:14:28

回答

3

这可能是两两件事:

  • 一个或以上的断言不从检查本身除了必要的工作
  • 别的东西

为了排除前,尝试重新定义assert作为调试版本中的空操作。如果没有某个断言导致崩溃,你会看到它。否则,这是别的。

另外,我假设你有版本控制。这是否刚刚开始?您可以分析上周的代码更改。

最后,即使在调试模式下没有崩溃,运行内存检查器工具可能会发现不正确的内存访问。

+0

+1版本控制建议。 – Zooba 2010-10-25 07:19:45

+0

我对所有我的项目使用版本控制,除了那个,因为我正在开发的这个特定的机器没有连接到互联网:/愚蠢的我...我重新定义断言什么也不做,它不会在调试版本中崩溃。我会谷歌'记忆检查工具' - 你能推荐一个吗? – Mat 2010-10-25 07:25:35

+0

@Mat:请考虑@ Grozz建议使用日志输出。这肯定会给它一些启示。 – 2010-10-25 07:45:34

10

这种问题通常是由于单位变量。我会从那里开始寻找你的问题。

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

也许你正在删除一个单位化的指针。在调试模式下,它的工作原理是指针无效,并且在NULL上删除ptr就可以了。在释放它是一些垃圾,然后删除ptr实际上会导致一个问题。

+0

这听起来很合理!我可以告诉Visual Studio不要在调试版本中初始化变量吗? – Mat 2010-10-25 07:29:01

+0

我在我的调试版本中激活/ RTCu(非初始化变量) - 如果有任何未初始化的变量,不应该这么唠叨吗? – Mat 2010-10-25 07:32:53

+0

是在大多数情况下,但不是在所有情况下。如果指针可能已被其他方式初始化,则该检查将被忽略。在实践中,您可能已经使用了&运算符地址并通过指针初始化变量。所以它仍然可能缺少初始化并且不会产生警告。请参阅http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx – Montdidier 2010-10-25 12:21:07

1

main函数的开头处开始查找插入日志输出的问题。

1

如果这不是内存问题,那么您必须在发布中启用断言。对于内存问题,我希望你有好的单元测试。你可以很容易地用valgrind来解决这些问题。

btw为什么人们在发布版本中禁用断言?在99%的情况下,它们不会导致性能问题,并且擅长检测错误。

0

在windows上使用Microsoft debugdiag进行崩溃转储(它是免费的)并使用相同的分析转储。它为崩溃的函数提供了一个很好的调用堆栈。尽管如果它一直在崩溃,它可能是堆损坏的问题。然后,您需要使用全局标志(或gflags,它是Microsoft免费调试套件的微软工具的一部分)以及debugdiag。 Gflags会给你堆的地方实际上已经损坏。希望有所帮助。

0

没有看代码,很难说什么是坏的。以上所有建议都很好,很有帮助,但是我发现最有帮助的解决这类问题的方法是以块的形式运行程序的某些部分。即注释掉很多代码/功能,然后运行程序并查看它是否崩溃。如果没有,则取消某些功能的注释,然后再重新运行,等等。通过这种方式,您将能够将问题缩小到导致此问题的确切代码。

在大多数情况下,这是由于一些Debug版本可能防范的缓冲区溢出。

2

两个步骤:

一)构建发布版本与调试 符号(可能与VS至少)

B) 构建发布版本没有 优化

如果问题仍然存在,它很好,很容易修复。这就好像问题出现在调试版本中一样。

如果问题发生在优化设置上,那么它非常困难,必须以具体情况处理。

+0

如果我使用调试符号构建发行版,它不会崩溃 – Mat 2010-10-25 08:01:35

+0

@Mat:就是_very_很奇怪,因为二进制文件应该(for所有目的)是相同的。主要区别在于“调试符号”选项会创建一个单独的.PDB文件来描述内存地址和函数/变量之间的关系。即它应该告诉你地址0x0043b134或地址0x004bd96c是什么。 – MSalters 2010-10-25 09:29:25

+0

@MSalters:我认为原因是发布版本的二进制文件总是通过一些优化(例如/ O2)来构建。我怀疑它与优化标志有关。 – Chubsdad 2010-10-25 10:32:54

1

我有这个问题,释放/调试在Visual Studio里面工作得很好,调试工作独立,但发布崩溃独立。调试对我来说并不特别准确,我的解决方案是:我的解决方案是:

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

在我的情况下,它将一个指针传递给一个函数太小的数组。

1

你确定这两个版本使用相同的.dll吗?我花了一个小时想知道为什么我的程序在调试模式下编译,但不是在释放模式下,我只是忘了更新发布文件夹中的DLL。

0

对我来说,问题在于构造函数以错误的顺序初始化2个成员变量。即与他们声明的订单不同。
我很惊讶,初始化顺序实际上有任何区别。

相关问题