Как найти местоположение ошибки "Список индекса за пределами границ" в Delphi

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

alt text
(источник: beholdgenealogy.com)

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

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

Ответ 1

У вас включена функция "Остановить на Delphi Exceptions"? (Tools\Debugger Options\Language Exceptions [Delphi7]) В противном случае он не будет разбиваться на исходный код.

Также убедитесь, что EListError не находится в списке "Исключение типов для игнорирования". Этот список также можно найти в разделе "Инструменты\Отладчик" \ "Исключения языка" (Delphi 7).

Ответ 2

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

Ответ 3

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

Просто запустите приложение в отладчике и убедитесь, что "Stop on Delphi Exceptions" (или то, что он вызывается в вашей версии Delphi) имеет значение ВКЛ.

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

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

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

Ответ 4

Так как это ошибка RTL/VCL, вы часто оказываетесь в режиме break/callstack, если вы включаете Debug DCU (и перестраиваете).

Ответ 5

Любые подсказки, что делает ваше приложение, когда это происходит? Длинная петля? Нажмите кнопку?

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

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

Ответ 6

для listbox, tstrings,... означает, что индекс находится за пределами списка- > count., пример tString- > strnigs [?]; [& alpha;] вл етс < 0 или > (tString- > count-1) приведет к ошибке за пределы.

как для NMPop3 и т.д.,... если вы используете pop3client для получения электронной почты, у него есть ошибки для некоторых unix/? pop3-сервер, что я натолкнулся на его использование, чтобы получать электронную почту с mail.Â?.com, но нормально с некоторыми.

Наконец, я должен переписать мое приложение pop3client с помощью tclientsocket вместо tnmpop3. теперь работает с каждым из pop3server, к которому я подключился.

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