Как проанализировать файл дампа катастрофического отказа с помощью GDB

printf("%d", sizeof(enum));
7
задан Bill the Lizard 11 October 2009 в 20:53
поделиться

4 ответа

Первое, что нужно искать, - это сообщение об ошибке, которое вы получаете при сбое программы. Это часто говорит вам, какая ошибка произошла. Например, «segmentation fault» или «SIGSEGV» почти наверняка означают, что ваша программа отменила ссылку на NULL или другой недействительный указатель. Если программа написана на C ++, то в сообщении об ошибке часто указывается имя любого неперехваченного исключения.

Если вы не видите сообщение об ошибке, запустите программу из командной строки или направьте ее вывод в файл.

Чтобы основной файл был действительно полезным, вам нужно скомпилировать вашу программу без оптимизации и с отладочной информацией. GCC требуются следующие параметры: -g -O0 . (Убедитесь, что в вашей сборке нет других параметров -O .)

После того, как у вас есть основной файл, откройте его в gdb с помощью:

gdb YOUR-APP COREFILE

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

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

Удачи!

(Убедитесь, что в вашей сборке нет других параметров -O .)

После того, как у вас есть основной файл, откройте его в gdb с помощью:

gdb YOUR-APP COREFILE

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

Удачи!

(Убедитесь, что в вашей сборке нет других параметров -O .)

После того, как у вас есть основной файл, откройте его в gdb с помощью:

gdb YOUR-APP COREFILE

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

Удачи!

gdb YOUR-APP COREFILE

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

Удачи!

gdb YOUR-APP COREFILE

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

Если ваша программа потерпела крах, вероятно, это недействительный доступ к памяти, поэтому вам нужно искать указатель, имеющий нулевое значение или указывающий на плохо выглядящие данные. Вы можете не найти проблему в самом низу стопки, возможно, вам придется переместиться на несколько уровней вверх, прежде чем вы найдете проблему.

Удачи!

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

Удачи!

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

Удачи!

8
ответ дан 6 December 2019 в 08:15
поделиться

Команда dirname является самой простой, она просто анализирует путь до имени файла в переменной $ 0 (имя сценария):

dirname "$0"

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

Некоторые другие упоминали команду readlink , но в простейшем случае вы можете использовать:

dirname "$(readlink -f "$0")"

readlink преобразует путь скрипта в абсолютный путь от корня файловой системы. Итак, любые пути, содержащие одинарные или двойные точки, тогда первым шагом, вероятно, будет печать трассировки стека:

gdb program core
> where

Это должно сообщить вам, где была программа, когда произошел сбой. Что еще доступно, зависит от того, как был скомпилирован сервер. Если возможно, вам следует перекомпилировать с включенной отладкой (это будет с флагом ' -g ' с GCC). Это даст вам больше информации из трассировки стека.

Если ваша проблема связана с памятью, подумайте о запуске с valgrind .

Также рассмотрите возможность сборки и запуска с отладочной версией malloc ( ) . Отладочная версия обнаруживает злоупотребления памятью, которые отсутствуют в обычных версиях или которые завершаются сбоем.

вам следует перекомпилировать с включенной отладкой (это будет с флагом ' -g ' с GCC). Это даст вам больше информации из трассировки стека.

Если ваша проблема связана с памятью, подумайте о запуске с valgrind .

Также рассмотрите возможность сборки и запуска с отладочной версией malloc ( ) . Отладочная версия обнаруживает злоупотребления памятью, которые отсутствуют в обычных версиях или которые завершаются сбоем.

вам следует перекомпилировать с включенной отладкой (это будет с флагом ' -g ' с GCC). Это даст вам больше информации из трассировки стека.

Если ваша проблема связана с памятью, подумайте о запуске с valgrind .

Также рассмотрите возможность сборки и запуска с отладочной версией malloc ( ) . Отладочная версия обнаруживает злоупотребления памятью, которые отсутствуют в обычных версиях или которые завершаются сбоем.

9
ответ дан 6 December 2019 в 08:15
поделиться
gdb -c core.file exename
bt

Предположим, что exename был построен с отладочными символами (и всеми его динамическими зависимостями находятся на пути), что даст вам обратный след. «вверх» и «вниз» будут перемещать вас вверх и вниз по стеку, а p varname может использоваться для проверки локальных переменных и параметров.

Вы также можете попробовать запустить его под valgrind:

valgrind --tool=memcheck --leak-check=full exename
5
ответ дан 6 December 2019 в 08:15
поделиться

Создает ли ваше приложение файл ядра? В таком случае я бы использовал gdb для устранения этой проблемы.

0
ответ дан 6 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: