Подтвердить что ты не робот

Невозможно воспроизвести segfault в gdb

Я получаю segfaults, когда запускаю свой проект. Каждый раз, когда я запускаю программу в gdb, segfaults исчезают. Такое поведение не является случайным: каждый раз, когда я запускаю его в своей оболочке, он segfaults, каждый раз, когда я запускаю его в gdb, segfaults исчезают. (Я перекомпилировал с помощью -g).

Итак, прежде чем я начну добавлять printfs отчаянно всюду в своем коде, я хотел бы узнать несколько вещей:

  • Это обычное поведение?
  • Какой лучший способ подойти к проблеме?

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

Я не вставлял свой код здесь, потому что это было бы слишком долго. Но если кто-то заинтересован в помощи, вот он: https://github.com/rahmu/Agros

4b9b3361

Ответ 1

Самый простой способ понять это - записать основные дампы:

$ ulimit -c unlimited

Затем запустите свою программу. Он будет генерировать файл core

Затем используйте gdb:

$ gdb ./program core

И загрузится gdb, и вы можете запустить обратную трассировку, чтобы точно увидеть, какая операция вызвала segfault.

Ответ 2

Является ли он базовым дампом? Это значит, что загрузите основной дамп в отладчик. В противном случае измените код, чтобы заставить его сделать основной дамп.

Ответ 3

Я предполагаю, что это проблема concurrency, вызывающая освобождение ссылки из-под вызова метода, предполагая, что указатель, который он имеет, останется действительным. Причина, по которой gdb, вероятно, маскирует это, состоит в том, что GDB позволяет только 2 потока фактически запускаться одновременно. Если у вас более двух потоков, то только 2 будут активно запускаться одновременно. GDB также имеет производительность, которая может маскировать это конкретное условие. Как уже упоминал Эд, просто создайте дамп ядра приложения, и вы можете открыть ядро ​​в GDB и проверить стек.

Ответ 4

Это обычное поведение?

Да. Поведение Undefined является источником большинства этих проблем, и по определению оно undefined. Перекомпиляция с помощью -g может, безусловно, повлиять на результаты. Перекомпиляция вообще может изменить результаты, если компилятор использует некоторый псевдослучайный генетический алгоритм для оптимизации материала или что-то в этом роде.

Какой лучший способ подойти к проблеме?

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