在 Delphi 2009 中,我的程序现在产生“列表索引超出范围”错误。它会生成一个弹出框:
(来源:beholdgenealogy.com)
我正在使用打开了所有运行时错误检查的“调试”构建配置。但这不会在错误发生之前捕获错误。
有没有什么简单的方法可以在我的程序中找到这个错误的根源,而不必设置断点并通过反复试验来缩小范围?
在 Delphi 2009 中,我的程序现在产生“列表索引超出范围”错误。它会生成一个弹出框:
(来源:beholdgenealogy.com)
我正在使用打开了所有运行时错误检查的“调试”构建配置。但这不会在错误发生之前捕获错误。
有没有什么简单的方法可以在我的程序中找到这个错误的根源,而不必设置断点并通过反复试验来缩小范围?
您是否打开了“停止 Delphi 异常”?(Tools\Debugger Options\Language Exceptions [Delphi7]) 否则它不会破坏你的源代码。
还要确保 EListError 不在“要忽略的异常类型”列表中。此列表也可以在 Tools\Debugger Options\Language Exceptions (Delphi 7) 中找到。
嘿,您不需要任何其他工具来跟踪它!:)
只需在调试器下运行您的应用程序并确保“停止 Delphi 异常”(或在您的 Delphi 版本中调用的任何内容)已打开。
发生异常时 - 调试器会发出通知。按“确定”/“调试”按钮并查看调用堆栈。调用堆栈窗口在最近的 Delphi 版本中自动显示。如果您看不到它 - 转到“查看”/“调试 Windows”/“调用堆栈”。
就这样。调用堆栈会将您指向问题的确切位置。不需要额外的工具。
如果您在用户之间分发程序并希望收集有关客户端问题的错误报告,则需要这些工具(EurekaLog、JCL 或 madExcept)。即没有调试器来检查问题。
由于这是一个 RTL/VCL 错误,如果您启用调试 DCU(和重建),您通常会得到更好的中断/调用堆栈行为。
发生这种情况时您的应用程序在做什么的任何提示?长循环?一个按钮点击?
当应用程序停止并且您查看调用堆栈调试窗口时,您能否将调用追溯到代码中的最后一次调用?调用堆栈不会告诉您所有条件,但可以缩小位置。
一旦你缩小了调用范围,像CodeSite这样的日志记录工具就会非常有用。例如,我经常记录循环控制变量以找出在错误之前最后发生的迭代,然后就是识别可能的嫌疑人的问题。
对于 listbox, tstrings,... 表示索引超出了 list->count, 。. tString->strnigs[?] 的例子;[?] is < 0 or > (tString->count-1) 会导致越界错误。
至于 NMPop3 等,...如果使用 pop3client 获取电子邮件,它对某些 unix/ 有错误?pop3 服务器,我遇到过使用它从 mail.???.com 中获取电子邮件,但可以接受一些。
最后我必须用 tclientsocket 而不是 tnmpop3 重写我的 pop3client 应用程序。现在可以与我连接的每个 pop3server 一起使用。
希望这有帮助并祝你好运