2008-12-18 61 views
3

我有我想要在调试一个崩溃的应用程序。然而,就很难发现问题的几个原因:如何诊断应用程序退出访问冲突

  • 坠机发生在关机,这意味着有问题的代码不在堆栈
  • 崩溃只发生在发布版本上,这意味着符号不可

死机的,我指的是以下情况例外:

0xC0000005: Access violation reading location 0x00000000. 

你会用什么策略来诊断这个问题?

我迄今所做的是,直到我得到了最低限度,将导致崩溃从我的程序删除尽可能多的代码。它似乎在静态链接到项目的代码中发生,所以这也没有帮助。

回答

5

甚至可以为发布版本创建符号文件。这样做,运行你的程序,附加调试器,关闭它,并在调试器中查看崩溃的原因。

+0

该选项在visual C++ 6的链接选项卡中被称为“生成调试信息”。 – FryGuy 2008-12-19 00:57:01

1

你似乎有东西读空指针 - 从来没有好。

我不确定你在哪个平台上。在Linux下,你可以考虑使用valgrind

什么是你的版本不同,从建立你的调试,从调试信息是否存在建立分开?

你能建立一个带有调试信息的静态链接代码吗?你能获得静态链接代码的调试版吗?

+0

它是使用WTL的窗口。静态链接的代码是我们的,是的,我可以创建它的调试版本。 – FryGuy 2008-12-18 22:55:31

+0

当我点击WTL标签时,我发现一切与Windows相关......你确定你不能从完整的调试版本中崩溃吗? – 2008-12-18 23:12:15

1

我会使用的策略正是你所做的。尽可能多地删除代码,直到问题消失,然后再添加最后一位并调试它。

但是,它可能不是你的代码有问题。有一点需要注意 - 我们在AIX上发现了这个问题,即使您运行的是Windows,它也可能类似。

我们有一个第三方库,动态加载另一个共享库,在其初始化程序,设立的atexit函数被调用进程退出的时候。

然而,随着我们的应用程序加载和卸载这些共享库,由过程结束的时间,共享库的atexit对功能在内存不再和我们转储核心。

这是从main()返回之后显示为访问冲突所以如果这是发生在您身上的事情,那几乎可以肯定是同样的事情。 C RTL启动代码将遍历atexit列表并调用它的每个函数,而不管你用它们做了什么。

当然,如果它在main()退出之前崩溃,那么这是一个有争议的问题。

有一两件事你可以考虑(和我们跟踪下来,固定一个特别棘手的bug的成本/效益分析后实际上已经做到了这一点,有一次):送出去的调试版本为您的产品。如果它没有崩溃,这可能是一个快速解决方案,让您的产品在您的闲暇时间得到更可接受的解决方案。