Как я могу найти местоположение ошибки «индекс списка вне границ» в Delphi

StackOverflow https://stackoverflow.com/questions/1191604

Вопрос

В Delphi 2009 моя программа теперь производит ошибку «индекс списка вне границ». Он генерирует всплывающую коробку:

alt text
(источник: ЗДЕСЬ)

Я использую конфигурацию сборки «Debug», которая включает в себя всю проверку ошибок выполнения. Но это не захватывает ошибку до того, как это произойдет.

Есть ли какой -либо простой способ найти источник этой ошибки в моей программе без необходимости помещать в точки останова и сузить ее методом проб и ошибок?

Это было полезно?

Решение

У вас включено «Остановка на исключениях Delphi»? (Инструменты Параметры отладчика Exceptions [delphi7]), в противном случае он не сломается в вашем sourcecode.

Также убедитесь, что Elisterror не находится в вашем списке «Типы исключений, чтобы игнорировать». Этот список также находится в инструментах Варианты отладчика исключения языка (Delphi 7).

Другие советы

Madexcept (бесплатно) или Eurekalog (оплачивается) может помочь. Вы можете настроить их, чтобы показать/написать трассировку стека, когда возникает ошибка. Я использую Eurekalog во всех своих проектах, и это неоценимо для исправления таких вещей.

Эй, вам не нужны дополнительные инструменты, чтобы отслеживать это! :)

Просто запустите свое приложение в рамках отладчика и убедитесь, что «остановитесь на исключениях Delphi» (или как это называется в версии вашей Delphi) НА.

Когда произойдет исключение - будет уведомление от отладчика. Нажмите кнопку «ОК»/«Отладка» и просто просмотрите стек вызовов. Окно стека вызовов отображается автоматически в недавней версии Delphi. Если вы не можете его увидеть - перейдите в «Просмотр»/«Отладка Windows»/«Степок вызовов».

Это все. Стек вызовов укажет вам в точное местоположение проблемы. Анкет Не требуется дополнительного инструмента.

Эти инструменты (Eurekalog, JCL или Madexcept) необходимы, если вы распространяете свою программу среди пользователей и хотите собрать отчеты об ошибках о проблемах на стороне клиента. Т.е. нет никакого отладчика, чтобы проверить проблему.

Поскольку это ошибка RTL/VCL, вы часто получаете лучшее поведение разрыва/Callstack, если вы включите отладочную DCU (и восстановление).

Есть намеки на то, что делает ваше приложение, когда это происходит? Длинная петля? Кнопка нажмите?

Когда приложение останавливается, и вы смотрите на окно отладки стека вызовов, можете ли вы отследить звонок до последнего вызова из вашего кода? Стек вызовов не расскажет вам все условия, но может сузить местоположение.

Как только вы сузите вызов, инструмент для ведения журнала, как Кода может быть действительно полезным. Например, я часто регистрирую контрольные переменные цикла, чтобы выяснить, какая итерация происходит последней до ошибки, тогда это вопрос идентификации вероятных подозреваемых.

Для ListBox, TStrings ... означает, что индекс находится за пределами списка-> count ,. Анкет Пример tstring-> strnigs [?]; [?] Является ли <0 или> (tString-> count-1) вывеет из-за ошибки границ.

Что касается NMPOP3 и т. Д., ... если использовать POP3Client для получения электронной почты, у него есть ошибки в UNIX/? POP3 Server, который я наткнулся, используя его, чтобы получить электронную почту по почте .???.com, но с некоторыми.

Наконец, я должен переписать свое приложение POP3Client с TClientSocket вместо TNMPOP3. Теперь работает с каждым из Pop3server, с которым я подключился.

Надеюсь, эта помощь и удачи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top