Delphi应用程序在调试器外部崩溃,但不在内部

时间:2011-11-01 23:11:57

标签: delphi

我们的DUnit项目在退出时崩溃。如果“在没有调试的情况下运行”,它会崩溃,但如果我在调试器中运行,则不会崩溃。

如果我在启动后将调试器附加到进程,则退出时不会崩溃。

我怀疑在最终确定中存在问题,所以我将print语句放在我怀疑运行的所有完成代码中。这没什么用。我们的一个低级单元的终结(不依赖于任何非系统单元)正在正确运行。所以它仍然可以最终确定,但可能不是。

崩溃产生了这个对话框:

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: MCLTesting.exe
  Application Version:  0.0.0.0
  Application Timestamp:    4eb07b50
  Fault Module Name:    kernel32.dll
  Fault Module Version: 6.0.6001.18215
  Fault Module Timestamp:   49953395
  Exception Code:   c0000005
  Exception Offset: 000bf395
  OS Version:   6.0.6001.2.1.0.256.6
  Locale ID:    3081
  Additional Information 1: b37c
  Additional Information 2: 2a7328d8bb40c81c93b4b5f46adb8e10
  Additional Information 3: b37c
  Additional Information 4: 2a7328d8bb40c81c93b4b5f46adb8e10

“例外代码:c0000005”这是否意味着什么?

我的主要线索是它在调试器中不会崩溃。有没有人见过这个?

2 个答案:

答案 0 :(得分:4)

我终于找到了这个。

问题确实存在于终结者中。终结器中抛出了用户异常。异常未被捕获,异常本身被泄露(异常及其字符串未被释放)。这个内存泄漏似乎导致了崩溃?我不知道为什么我最初发布时没有注意到这个内存泄漏。

捕获异常修复了崩溃问题。

我发现一件有趣的事情是,即使在终结器中抛出未捕获的异常,后续单元的终结器仍将运行。我假设一个终结器中的问题会阻止所有后续的终结器运行。

我用来查找违规单位的方法非常简单;我从项目中删除了所有单元,然后逐个重新引入单元,直到遇到崩溃错误。耗费时间但最终有效。

答案 1 :(得分:2)

异常代码c0000005是访问冲突。这通常意味着两件事之一:要么你试图取消引用设置为 nil 的指针或对象引用,要么你正在使用损坏的内存。

错误报告中的其他相关数据是Exception Offset: 000bf395。这告诉你在哪里发生了错误。尝试在地图文件中查找f395,看看是否找不到与该内存偏移相对应的单位终结。如果是这样的话,那应该可以让你知道出了什么问题。