Дамп ядра GDB: восстановление значений argc argv после сбоя - PullRequest
2 голосов
/ 10 августа 2011

Можно ли восстановить точные значения параметров argv и argc основного файла после сбоя приложения?

Мне нужно использовать только отладчик ядра приложения и gdb в Linux.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Да, если приложение было скомпилировано с отладочной информацией. Откройте дамп ядра в GDB и найдите фрейм, содержащий основную функцию. Затем перейдите к этому кадру и выведите значения argv и argc . Вот пример сеанса GDB.

[root@localhost ~]# gdb ./a.out core.2020
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/a.out...done.
[New Thread 2020]

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /usr/lib/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./a.out'.
Program terminated with signal 6, Aborted.
#0  0x0027b424 in __kernel_vsyscall ()
(gdb) bt
#0  0x0027b424 in __kernel_vsyscall ()
#1  0x00b28b91 in raise () from /lib/libc.so.6
#2  0x00b2a46a in abort () from /lib/libc.so.6
#3  0x007d3397 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#4  0x007d1226 in ?? () from /usr/lib/libstdc++.so.6
#5  0x007d1263 in std::terminate() () from /usr/lib/libstdc++.so.6
#6  0x007d13a2 in __cxa_throw () from /usr/lib/libstdc++.so.6
#7  0x08048940 in main (argv=1, argc=0xbfcf1754) at test.cpp:14
(gdb) f 7
#7  0x08048940 in main (argv=1, argc=0xbfcf1754) at test.cpp:14
14              throw std::runtime_error("123");
(gdb) p argv
$1 = 1
(gdb) p argc
$2 = (char **) 0xbfcf1754
(gdb)
1 голос
/ 10 августа 2011

Похоже, вам нужно начать с основ .. !!

скомпилируйте код приложения с флагом -g, убедитесь, что вы не удалили его.

Скажи, если я хотел скомпилировать hello.c

gcc -c -g hello.c -o hello.o
gcc hello.o -o hello

сейчас, если вы не хотите отлаживать

ulimit -c unlimited
./hello

при сбое приложения будет создан основной файл.

Для проверки файла ядра

"gdb ./hello core.$$$" this will list you your stack.

вы также можете выбрать для отладки изображения GDB привет

В Интернете есть много материалов о GDB, просмотрите их.

...