Как найти ошибку сегмента, которая не возникает при использовании инструментов - PullRequest
0 голосов
/ 29 мая 2020

Я спрашиваю об этом, потому что ошибка seg не возникает в моей программе на C ++, если я запускаю ее с Valgrind или GDB. Но его легко воспроизвести, если я запускаю его автономно, так как он обязательно выявляет ошибки. Я закомментировал участки кода до такой степени, чтобы заставить его работать, но мне все еще не удалось найти точную причину. Боюсь, что это происходит раньше и просто появляется поздно.

Обновление: чтобы уточнить, это C ++ 17 на Linux.

Ответы [ 3 ]

4 голосов
/ 29 мая 2020

Убедитесь, что вы не отключаете дампы ядра (ulimit -c unlimited, хотя есть другие параметры конфигурации , которые имеют значение), тогда, когда ваша программа выйдет из строя, вы должны получить файл дампа ядра.

Запустите gdb program core, чтобы проанализировать дамп ядра - gdb будет выглядеть так, как будто вы использовали его для запуска своей программы, и он попал в сигнал, который остановил его. Вы можете выполнить обратную трассировку, чтобы увидеть стек, проверить переменные и память и т. Д. c.

1 голос
/ 29 мая 2020

Хорошая старая плохая printf отладка :). Сделайте так, чтобы ваша программа отбрасывала хлебные крошки (в форме вывода на консоль или записи в журнал) в непосредственной близости от точки cra sh. Когда вы лучше поймете, где находится точка sh, сделайте панировочные сухари плотнее. Предполагая, что ваш cra sh достаточно детерминирован c, в конечном итоге он сойдется в точку cra sh.

Другой метод, установите обработчик сигналов для SIGSEGV. Как только сигнал сработает, сбросьте регистры точек cra sh, а затем используйте что-то вроде addr2line, чтобы преобразовать IP-адрес в исходную строку. Вам понадобится начальный адрес модуля.

0 голосов
/ 29 мая 2020

Для меня это типичное состояние гонки. Вы используете какой-либо поток в своем коде? Если это так, подумайте об использовании std::mutex при доступе к некоторым данным, которые могут использоваться в другом потоке. Я всегда мог отлаживать такие вещи, только используя ТОННЫ отладочных отпечатков, но будьте осторожны, они также могут немного замедлить ваш код и удалить состояние гонки.

...