如何在 Delphi 中找到“列表索引越界”错误的位置
-
19-09-2019 - |
题
在 Delphi 2009 中,我的程序现在产生“列表索引越界”错误。它会生成一个弹出框:
(来源: beholdgenealogy.com)
我正在使用“调试”构建配置,该配置打开了所有运行时错误检查。但这并不能在错误发生之前捕获错误。
有没有什么简单的方法可以在我的程序中找到此错误的根源,而不必放置断点并通过反复试验来缩小范围?
解决方案
你有“停止对德尔福例外”开启? (工具\调试选项\语言例外[Delphi7的])否则它不会在源代码中断裂。
另外,还要确保EListError是不是在你的“异常类型为忽略”列表。该列表也被在工具\调试选项\语言例外(Delphi 7中)找到。
其他提示
嘿,你不需要任何额外的工具来跟踪这个! :)
在调试器下,只要运行你的应用程序,并确保“停止对德尔福例外”(或任何它被称为在你的Delphi的版本)打开打开
当异常发生时 - 将有来自调试器的通知。按“OK” /“调试”按钮,只需查看调用堆栈。调用堆栈窗口是近Delphi的版本自动显示。如果你不能看到它 - 进入“查看” /“调试窗口” /“调用堆栈”
这是所有。 调用堆栈将这个问题的确切位置指向你。没有额外的工具需要。
如果您分配用户之间的程序,并希望收集有关客户端问题的bug报告需要这些工具(EurekaLog,JCL或madExcept)。即没有调试器来检查问题。
由于这是一个RTL / VCL错误,你往往具有更好的断裂/调用堆栈行为结束,如果你启用调试DCU(和重建)。
任何提示,当这种情况发生时你的应用程序在做什么?长循环? A按钮点击?
当应用程序暂停,你看看调用堆栈调试窗口,你可以跟踪调用回你的代码中最后一次通话?调用堆栈不会告诉你所有的条件,但可以缩小的位置。
一旦你缩小呼叫,测井仪器如的CodeSite 可真有用。例如,我常常登录循环控制变量,以找出哪些迭代错误发生之前最后,那么它有可能识别嫌疑人的问题。
为列表框,字符串列表,... 意味着索引超出列表 - >计数。 。 例如tString-> strnigs [η]; [η] <0或>(tString->计数-1)会导致超出范围的错误。
作为NMPop3等,... 如果使用pop3client获取电子邮件,它有一个错误的一些UNIX /? POP3服务器, 我已经跨越用它来从mail.???.com电子邮件,但一些好的来了。
最后我不得不重写我的Tclientsocket构件实现,而不是tnmpop3 pop3client应用。 现在与每次我连接到pop3server的。
希望这有助于和好运。