Использование GDB: у меня сбой (segfault).Как я могу увидеть строки кода, ведущие к нему? - PullRequest
0 голосов
/ 14 февраля 2019

Простите, если это дубликат, но я не могу найти какой-либо прямой совет по этому вопросу.

У меня есть приложение, которое выполняет цикл много раз.В какой-то момент это segfaults.Это написано на C, я использую GDB для отладки этого.В прошлом я бил n раз, и есть что сказать по этому поводу.Тем не менее, я думаю, что в данном случае было бы НАМНОГО более эффективно, если бы я мог на самом деле сделать шаг назад, чтобы увидеть, где происходит ошибка.

К сожалению, код библиотеки цитируется при сбое (из предварительно скомпилированной библиотеки, если я правильно помню), поэтому я даже не могу попытаться взглянуть на код, возвращающийся назад.Более того, я доверяю этой библиотеке.(На данный момент, конечно: P)

Я был бы безмерно благодарен, если бы кто-то мог предоставить несколько способов проследить назад к строкам кода в моих файлах, где происходит этот сбой!

1 Ответ

0 голосов
/ 15 февраля 2019

В прошлом я бил сотни раз, и есть, что сказать по этому поводу.

Если ваш сбой повторяется (например, всегда *)1006 * вылетает после 1234-го вызова foo()), тогда вот полезный метод, чтобы избежать сотен раз n:

(gdb) break foo
(gdb) ignore 1 10000
(gdb) run

В этот момент ваша программа запускается и вылетает на N-ый звонок на foo.Используйте info break, чтобы узнать, что такое N.А теперь:

(gdb) ignore 1 M  # where M == N-1
(gdb) run

Теперь вы остановились на предпоследнем звонке на foo.Пройдите через ваш код, установите точки останова и т. Д., Пока не дойдете до следующего вызова foo (что приведет к сбою).

Однако я думаю, что в данном случае это будет ОЧЕНЬ более эффективноесли бы я действительно мог сделать шаг назад, чтобы увидеть, где происходит ошибка.

В Linux вы могли бы сделать это: https://rr -project.org /

...