Что значит ?? в GDB означают обратную трассировку и как получить фактические кадры стека? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытался узнать, как использовать gdb в дампах ядра.

Вот код:

int main()
{
    return 1/0;
}

Это вывод gdb, когда я запускаю gdb a.out core:

warning: exec file is newer than core file.
[New LWP 3121]
Core was generated by `./crash'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x00000000004004fc in ?? ()
(gdb) bt
#0  0x00000000004004fc in ?? ()
#1  0x0000000000400500 in ?? ()
#2  0x00007f6ea0945b97 in ?? ()
#3  0x0000000000000000 in ?? ()

Что такое ?? в следе? Как я могу их разрешить?

Ответы [ 3 ]

3 голосов
/ 06 февраля 2020

В этих ?? обычно указывается название функции. GDB не знает названия этих функций и поэтому отображает ??.

Теперь, почему это происходит? Зависит. G CC компилируется, включая символы (например, имена функций и тому подобное) по умолчанию. Скорее всего, вы работаете с версией strip * , где символы были удалены, или просто с неправильным файлом.

Как подсказывает @ zwol , строку, которую вы видите warning: exec file is newer than core file указывает на то, что происходит что-то еще, что вы не указали в своем вопросе. Вы работаете с core файлом дампа, созданным сбойным исполняемым файлом, который устарел.

Я бы посоветовал перекомпилировать программу с нуля и убедиться, что вы открываете нужный файл с помощью GDB. , Сначала создайте новый дамп core, разбив новую программу, затем откройте его в GDB.

Предполагая следующее program.c:

int main(void) { return 1/0; }

Это должно работать:

$ rm -f core
$ gcc program.c -o program
$ ./program
Floating point exception (core dumped)

$ gdb program core
Reading symbols from program...(no debugging symbols found)...done.
[New LWP 11896]
Core was generated by `./program'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x000055d24a4cd790 in main ()
(gdb) bt
#0  0x000055d24a4cd790 in main ()
(gdb)

ПРИМЕЧАНИЕ: если вы не видите (core dumped) при запуске процесса, это означает, что дамп ядра не был сгенерирован (что оставляет вас прежним). Если вы используете Bash, попробуйте выполнить команду ulimit -c unlimited до сбоя программы.

1 голос
/ 06 февраля 2020

Что значит ?? в GDB обратная трассировка означает

. Это означает, что GDB не знает, к какому коду относятся адреса в обратной трассировке: 0x04004fc, 0x0400500 и т. д. c. соответствуют.

и как получить фактические кадры стека?

Это зависит от , почему это происходит. Существует два общих сценария ios:

  1. Вы отлаживаете неверный исполняемый файл.

    Один из способов это может произойти, когда вы компилируете оптимизация, например, gcc -O2 main.c -o crash, дайте программному дампу core, затем перекомпилируйте с отладкой (например, gcc -g main.c -o crash) и попробуйте отладить «старый» дамп ядра с помощью «нового» исполняемого файла.

    Не делать который. Вместо этого скомпилируйте с оптимизацией и отладка: gcc -O2 -g main.c -o crash.

    PS Это предупреждение: warning: exec file is newer than core file предназначено для предупреждения точно об этом случае.

  2. Другая распространенная причина - когда вы получаете cra sh в производственной системе и пытаетесь отлаживать его в разработке (учитывая адреса, которые вы показываете, это вряд ли произошло здесь) .

    В этом случае см. этот ответ .

0 голосов
/ 06 февраля 2020

Вы не скомпилировали с символами отладки - попробуйте добавить -g в строку компиляции

...