2010-12-01 3 views
1

Я отлаживал GDB (код C). Проблема в том, что если я запустил мое приложение, и если он сработает, элемент управления вернется к main() (перезагрузке приложения). Следовательно, не будет понятия, где он разбился. Поэтому я провожу много времени, пробирая каждую функцию.Справка для gdb debug crash logging

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

Также, если gdb генерирует журнал, где будет путь?

Заранее спасибо.

+2

Можете вы назвать "crash"? Если есть необработанный сигнал (например, SIGSEGV), GDB должен перехватить его и немедленно остановить, но похоже, что это не то, что происходит, поэтому вы должны «сбой» другим способом. – 2010-12-01 04:26:45

ответ

3

Этот вопрос немного непонятен для меня, но я возьму удар:

Если GDB прилагается к процессу сбоя, когда он выходит из строя, аварии должна остановить программу и поставить вас обратно на подсказке (gdb). Если вы затем наберете bt, вы увидите стек.

Если у вас НЕ прилагается GDB,, то this answer to a related question может помочь. (Короче говоря, возможно, вы хотите, чтобы система создавала дамп ядра при сбое программы. Дамп ядра - это просто файл, содержащий много информации о разбившемся процессе. Вы можете использовать GDB с дампом ядра, чтобы увидеть стек.)

Если вы не знаете, опубликуйте, что вы видите на экране, когда это произойдет, и мы догадаемся.

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

0

Запустите программу в режиме gdb.

$ gdb ./myProgram 


Установить точку прерывания в ожидаемое место.

$ break functionName 


Или установить точку останова на конкретный номер строки.

$ break 15 


запустить выполнение

$ r 


Шаг внутрь или выйти исполнение по 's' или 'п'

$ s 


раз сбоя программы, сделать 'bt' для обратной линии.

$ bt 


вы можете пойти вверх и вниз в вашем след от 'вверх' & 'вниз' команды

$ up 


Можно также взять альтернативный путь. Отладка программы с «ядро» как файл дампа ядра.

$ gdb executableFilename core 
$ bt