|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.10.2019, 18:09 | #1 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Отладка ошибок Access violation
Как отлаживать такие вот ошибки? Ошибка возникает на 5 минуте.
Судя по всему ошибка связано с полосой по середине. Я предположил, что ошибка здесь. Код:
Собственно как локализовать ошибку? Второе предположение было что закончилась память, но вроде бы нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
19.10.2019, 18:33 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Можно в лог писать в разных местах для локализации участка возникновения ошибки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
19.10.2019, 20:13 | #3 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
так вроде есть-же адрес глючной инструкции 00401DE5 на скрине - поставить на неё бряк и всё. Или этот адрес меняется каждый раз?
Нашедшего выход - затаптывают первым..
|
19.10.2019, 21:00 | #4 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Аватар
Я хочу учится новому. Хочу через бряки докопаться до правды. Если не получится тогда буду лог делать. R71MT Адрес инструкции постоянный. Бряк поставил. Эта инструкция внутри менеджера памяти. Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
19.10.2019, 21:41 | #5 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Черная полоса не связана с выходом, за с утечкой указателей(индексов).
Можно считать что логи тоже дали отрицательный результат.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
20.10.2019, 05:51 | #6 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
я бы сказал, что это ваша инструкция обращается напрямую к менеджеру памяти, чего делать нельзя и guard (в данном случае) этому препятствует. На скрине говорится, что инструкция 0x0040xxxx обратилась к памяти 0x80xxxxxx. Регион памяти от нуля и до 0х7FFFFFFF принадлежит вашей программе, а от 0x80000000 и выше - это уже системная. Поэтому 0x00401DE5 это адрес внутри вашей программы.
"Access Violation" имеет код-ошибки 0хС0000005 и указывает на то, что программа пытается прочитать не доступный ей адрес. Я бы поставил точку-останова на адрес ДО глючной инструкции, например 0x00401D00 или ещё раньше. Теперь в отладчике смотрите, что (и почему) лежит в регистрах, которые обращаются к системной памяти. По отпечатку своего кода вы легко локализуете проблему. А вообще для отлова блох хорошо помогают пользовательские "обработчики структурных исключений SEH". В ассемблере вручную их создаём, а в ЯВУ вроде оператор _try. Когда возникает исключение, то обработчик перехватывает его и в нашем распоряжении оказывается весь контекст регистров (структура CONTEXT в стеке по смещению ESP+0Ch). Мы можем подменить в этом контексте значение регистра EIP и возвратить управление опять нашей программе. Но это в критических случаях.. Попробуйте вставить _try в каждый подозреваемый блок, и в обработчиках выводите разные сообщения - это конкретно выявит причину.
Нашедшего выход - затаптывают первым..
Последний раз редактировалось R71MT; 20.10.2019 в 05:55. |
20.10.2019, 06:00 | #7 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
кстати какая система? можно будет в отладчике WinDbg посмотреть, кому принадлежит адрес 0х8018276С - скорей всего это не диспетчер памяти, а обработчик исключений RaiseExeption(). Если это действительно он, то круг подозреваемых сузится, и проблема может быть вообще не в том месте, на который указывает скрин.
Нашедшего выход - затаптывают первым..
|
20.10.2019, 10:12 | #8 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
У меня флаг 3G включен {$SetPEFlags $20}
Так что первые 3ГБ принадлежат мне. Цитата:
Решил закомментировать подозрительные функции не помогло. Это уже интересно. Значит ошибка где-то ещё.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
20.10.2019, 22:30 | #9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Нашел ошибку. Так как ошибка явна была связанна с границей в 2ГБ пришлось пересобрать код под 64 бита, там она не исчезла. Отключил всё лишнее и там догадался что у меня integer вместо NativInt,
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
21.10.2019, 06:52 | #10 | |
instagram
Участник клуба
Регистрация: 24.05.2008
Сообщений: 1,451
|
Цитата:
Код:
Код:
Последний раз редактировалось beegl; 21.10.2019 в 06:55. Причина: Add text |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Access violation | Vanta11a | C++ Builder | 4 | 12.04.2013 18:14 |
Access violation | dimavit | Общие вопросы Delphi | 3 | 29.07.2012 19:16 |
access violation | ho_N | Компьютерное железо | 2 | 30.11.2011 08:36 |
Поиск ошибок, отладка стиля макета | CocoDen | HTML и CSS | 5 | 24.05.2011 02:48 |
Access Violation | Carbon | Общие вопросы Delphi | 12 | 18.09.2007 19:55 |