Как локализовать ошибку SIGSEGV?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 02.09.2016 20:09:10

Здравствуйте. Время от времени получаю такую коварную ситуацию. При работе через отладчик, конфликт доступа к памяти возникает практически в каких угодно местах. Если в логике программы содержится ошибка, отладчик ее не покажет, а покажет дизасемблированый код того места, где возникло последствие, а не причина. Есть ли какие то медоты/приемы как диагностировать такие ошибки? Кроме общей грамотности и хорошего знания языка, коим не обладаю.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 02.09.2016 20:13:33

Карандаш и пошаговое выполнение в "ручном" режиме.
Как правило, это ошибка неправильной работы с объектами/указателями.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 02.09.2016 20:42:09

Лекс Айрин именно так. В ручном режиме не всегда есть возможность выполнить алгоритм, например, если имеет место обмен данными с другим приложением. Из-за такой опасности пропадает желание развивать приложение и реализовывать сложные схемы. Возможно всеже есть какой то выход?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение azsx » 02.09.2016 20:52:09

не знаю верный ли мой способ, но я стал писать логи. То есть во всех проблемных местах условие, если лог = труе то писать "этап в программе". Тогда при ошибке по логам можно весьма точно понять где ошибка.
Ошибка всего один раз была не на моей стороне, а на стороне модуля постгрес в лазарус.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 02.09.2016 21:12:14

CRobin, понятное дело, что тяжело. Но, кстати, сомневаюсь, что обмен данными может привести к подобной ошибке. Для этого надо очень плохо писать код -- наплевав, как минимум, на проверки диапазонов (массивов, ссылок).

Можно писать код маленькими порциями. Написал, проверил, отладил и забыл. Можно отключать проблемный (или кажущийся проблемным) код. Логи, кстати, в таких случаях очень желательны -- особенно если используется специальные проверочные данные.
Иногда поведение программы очень сильно отличается от ожидаемого.

Кстати, есть шанс понять где ошибка, несмотря на то, что она возникает не там где исключение, если удается соотнести ассемблерный код с текстом программы. (например, удаление уже удаленного объекта указывает, что скорее всего он не был где-то создан. Ну или реально пытаемся удалить дважды.)
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 02.09.2016 23:15:47

Лекс Айрин я имел в виду, что наличие клиента или сервера (по сути второй стороны) может создавать логические ситуации, которые невозможно воспроизвести.

Добавлено спустя 4 минуты 48 секунд:
azsx логи как правило показывают ошибки, которые являются следствием искомой ошибки. Например, обращение к несуществующему элементу в модуле А, может спокойно вызвать сбой в модуле Б и модуле С. При этом большая опасность, если вы начнете исследовать модули Б и С, сломать то, что работает.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение azsx » 03.09.2016 03:20:56

обращение к несуществующему элементу в модуле А, может спокойно вызвать сбой в модуле Б и модуле С. При этом большая опасность, если вы начнете исследовать модули Б и С, сломать то, что работает.

Не поверите и такие ситуации у меня бывали. Типа вот конкретная строка кода, до неё лог срабатывает, после неё лог уже не пишется. А строка как строка и ошибка ваще ниже по коду была. Вот в таких случаях сижу, разбираюсь в коде, который сам написал, ищу ошибку в этой строке или в коде который до этой строки следует и т.п. Конечно, если бы я на ассемблерный код глянул и сразу чувствовал бы где я сделал в паскалевском коде ошибку - было бы значительно проще.
Бывает и иначе. Написал алгоритм, программа каждые пару суток вылетает как часы. Я программу запускаю с bat файла, в нем цикл - вылетела, снова запускается. Да и нафиг надо искать проблему, прямо других занятий нет, кроме как доводить свой софт до совершенства.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 03.09.2016 09:42:40

CRobin писал(а):я имел в виду, что наличие клиента или сервера (по сути второй стороны) может создавать логические ситуации, которые невозможно воспроизвести.

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

Можно запустить копию клиента/сервера у себя. И не говори, что поднять сервак это суперсложная проблема. Под виндой это, допустим, Денвер. Под линухой он идет в репах и его настройка, в принципе, не настолько сложна как представляется.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 03.09.2016 10:58:05

Лекс Айрин писал(а):да ладно... можно написать эмулятор

Конечно же можно, и даже нужно)) Но если процесс взаимодействия не линейный, то не возможно в принципе воспроизвести все игровые ситуации.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 03.09.2016 11:39:05

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

И, заметь, тебе все равно придется любым способом воспроизвести ошибку, чтобы понять, как минимум, что после всех мытарств она исправлена. Ну и зная что именно ее вызывает, практически всегда можно примерно понять где косяк. Если, конечно, помнить схему взаимодействия кода.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как локализовать ошибку SIGSEGV?

Сообщение zub » 03.09.2016 11:43:05

CRobin
>>Здравствуйте. Время от времени получаю такую коварную ситуацию.
Ситуация вполне обычная)) Баги всегда кажутся какимито "сказочными", а когда их найдешь оказываются глупыми
>>Если в логике программы содержится ошибка, отладчик ее не покажет
а посмотреть стек вызовов?
>>Кроме общей грамотности и хорошего знания языка, коим не обладаю.
Собрать программу с heaptrc - устранить ругань (при этом нужно чтобы программа штатно завершалась, а не падала, при падении будет куча лишней ругани на всю не освобожденную память)
Прогнать прогрпамму в valgrind - устранить ругань

azsx
>>Типа вот конкретная строка кода, до неё лог срабатывает, после неё лог уже не пишется. А строка как строка и ошибка ваще ниже по коду была.
Мистики тут быть неможет. После нахождения ошибки такое "невообразимое" поведение становится объяснимым и понятным
>>Да и нафиг надо искать проблему
Если даже программа одноразовая-ненужная, ошибку надо найти и устранить для приобретения соответствующего опыта
>>Конечно, если бы я на ассемблерный код глянул и сразу чувствовал бы где я сделал в паскалевском коде ошибку - было бы значительно проще.
Если ошибку не видно глядя на паскаль, то глядеть на асемблер вообще смысла нет.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 03.09.2016 11:57:48

zub писал(а):а когда их найдешь оказываются глупыми

А когда находишь и понимаешь в чем было дело, ужасаешься от того что в следующий раз может так не повезти.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение zub » 03.09.2016 12:00:10

Везенью тут не место.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 03.09.2016 12:10:01

zub спасибо за упоминания инструментов, буду гуглить
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение azsx » 03.09.2016 12:15:45

zub почему то подумалось, когда читал Ваш пост. Есть такие бравые программисты, они умны, бородаты в очках. У них компьютер всегда выполняет записанные ими инструкции, опечатки бывают, но они их исправляют. Побольше бы их таких.
зы
я не такой, я вежливо говоря разгильдяй и книжку "херак, херак и в продакшен" я бы почитал с удовольствием.
Но мысли у вас верные, я буду стараться.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

Рейтинг@Mail.ru