LINUX.ORG.RU

[kernel] KGDB: Как узнать где упало?

 


0

3

Добрый день.

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

Проблема - как узнать от чего (или хотя бы где) упало ядро? Трасса стека ничего не показывает, продолжить не даёт. Frame pointers есть.

Помогите пожалуйста.

(gdb) s
Can't send signals to this remote system.  SIGSEGV not sent.

Program received signal SIGSEGV, Segmentation fault.
math_state_restore () at arch/x86/kernel/traps.c:871
871	in arch/x86/kernel/traps.c
Current language:  auto; currently c
(gdb) c
Continuing.
warning: Remote failure reply: E22

[Thread 5353] #1 stopped.
math_state_restore () at arch/x86/kernel/traps.c:871
871	in arch/x86/kernel/traps.c
(gdb) bt
#0  math_state_restore () at arch/x86/kernel/traps.c:871
#1  0xc0525c5d in do_device_not_available (regs=0xf5e0353c, error_code=-1) at arch/x86/kernel/traps.c:915
#2  <signal handler called>
#3  0xf7c63058 in ?? ()
#4  0xf7c63a83 in ?? ()
#5  0xf7c63ad2 in ?? ()
#6  0xf7cca293 in ?? ()
#7  0xf7d8d546 in ?? ()
#8  0xf7d8d795 in ?? ()
#9  0xf7d92bfb in ?? ()
#10 0xf7cca16a in ?? ()
#11 0xc0250294 in kthread (_create=<value optimized out>) at kernel/kthread.c:78
#12 0xc0203d87 in kernel_thread_helper () at arch/x86/kernel/entry_32.S:1045
#13 0x00000000 in ?? ()
(gdb) 

Дистрибутив, архитектуру и версию пакета с ядром - в студию

Led ★★★☆☆
()

>Проблема - как узнать от чего (или хотя бы где) упало ядро? Трасса стека ничего не показывает, продолжить не даёт. Frame pointers есть.

Ты все делаешь неправильно. Перво-наперво, отключи это говно (GDB). Не включай, вообще забудь про него.

Загружайся с опцией console=ttyS0 и гляди в minicom на втором компе. Когда ядро упадет, начнут бегать буковки и циферки, подожди, когда они остановятся.

Прокрути окошко назад, найди первый стек. Будет адрес, из-за которого все упало, IP и ещё куча всякой фигни.

Дизасемблируй objdump -D vmlinux и ищи свой адрес. По адресу - строку, дальше чистый профит.

ttnl ★★★★★
()

+1 к предыдущему комменту, kgdb - говнище страшное.

Если из стектрейса на консоли не станет понятно, где и почему упало, то лучше настрой crashkernel, получил дамп упавшего ядра и с помощью crash его изучай.

mv ★★★★★
()
Ответ на: комментарий от ttnl

Дизасемблируй objdump -D vmlinux и ищи свой адрес.

addr2line ещё есть.

mv ★★★★★
()
Ответ на: комментарий от ttnl

Да, этот вариант еще и самый удобный, вкупе с kdump

XVilka ★★★★★
()

Как все запущено в ляликсе с кернельным отладчиком..

anonymous
()
Ответ на: комментарий от mv

Спасибо, помогло.

Итого, поставил kdump, получил дамп упавшего ядра, crash-ем его посмотрел, проблему локализовал.

Artlav
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.