我有一些非常复杂的遗留代码,我一直在研究收集大块数据时的崩溃.我一直无法找到崩溃的确切原因,我正在尝试不同的方法来解决它或至少恢复得很好.我做的最后一件事是将崩溃的代码包含在一个
try ... except cleanup(); end;
只是为了使它表现出来.但清理工作永远不会完成.在什么情况下不会发现异常?这可能是由于一些内存溢出或某些东西,因为应用程序正在收集相当多的数据.
哦,我添加之前的例外try
是"访问冲突"(还有什么?),CPU窗口指向非常低的地址.任何想法或指针将不胜感激!
"非常低的地址"可能意味着有人试图在一个实际上不存在的对象上调用虚方法(即'nil').例如:
的TStringList(无).Clear;
不过,第一部分非常神秘.我不知道怎么会发生这种情况.
我认为你应该尝试使用madExcept捕获该异常.它从来没有让我失望过.(免责声明:我不使用D7.)
丢失的堆栈或堆栈溢出都会对堆栈上的结构造成不可挽回的损害,Windows中的结构化异常处理(SEH)用于查找实际的异常处理程序.
如果堆栈上的缓冲区中存在缓冲区溢出(例如,静态数组作为局部变量但写入超出其结尾),并覆盖异常记录,则可以覆盖指向下一个异常的"下一个"指针记录在堆栈上.如果指针遭到破坏,那么操作系统无法找到下一个异常处理程序并最终到达您的全部异常处理程序.
堆栈溢出是不同的:它们可以完全阻止调用函数,因为每个函数调用都需要至少一个堆栈空间用于返回地址.