Как узнать, по какому адресу вылетает программа в Linux?
У меня есть программа, работающая в Linux, и она таинственным образом вылетает. Я уже знаю один способ узнать, где он падает, это использовать GDB. Но я не хочу присоединяться к нему каждый раз, когда перезагружаю его (делайте это много, так как я его тестирую). Есть ли альтернативный способ сделать это?
4 ответа
Первое использование ulimit -c unlimited
разрешить сбойным программам записывать дампы ядра.
После сбоя программы вы найдете файл дампа ядра, который называется core
или возможно core.<pid>
если ваша программа многопоточная.
Вы можете загрузить это в GDB, чтобы проверить состояние в точке сбоя с помощью gdb program core
,
Сначала сделай ulimit -c unlimited
, так что программа покинет дамп ядра. Затем, когда он падает, вызвать gdb
с дампом ядра, чтобы прочитать состояние программы в момент сбоя.
Вы можете настроить свою ОС на сброс файла ядра в любой момент, когда происходит сбой программы. Затем вы можете проверить ядро, чтобы определить место аварии.
-> скомпилировать код с включенными флагами GDB.
gcc -o <двоичное имя> -g
-> запустить исполняемый файл с помощью GDB. GDB <двоичное имя>
после этого есть способы найти место сбоя: 1. пошаговое выполнение. 2. запустить код, он вылетает (как и ожидалось), введите "где" в GDB (без кавычек), он дает обратную трассировку. из этого вы можете узнать адрес.
Вот хорошее краткое руководство по GDB: http://www.cs.cmu.edu/~gilpin/tutorial/