получить доступ к стеку ядра процесса с указанным идентификатором процесса при отладке ядра - PullRequest
1 голос
/ 02 марта 2012

У меня Linux работает на VMWare, и я использую gdb на хост-машине для подключения к нему при отладке. Во время работы мое ядро ​​вызовет зависание некоторых процессов, и я хотел бы исследовать больше.

То, что дает мне ядро, это идентификатор процесса зависания вместе с трассировкой стека. Однако без передаваемых аргументов трассировка стека не очень полезна. Поэтому я хочу собрать больше информации. Итак, у меня есть два вопроса:

  1. Учитывая pid, как я могу получить task_struct, соответствующий процессу? Я пытался сделать "p find_task_by_pid_ns (2533, & init_pid_ns)" под GDB, однако он зависает.

  2. Однажды я получил task_struct и указатель стека. Моей конечной целью было бы воспроизвести трассировку стека (с аргументом каждого вызванного функционала). Есть ли инструмент для этого? GDB берет указатель стека и печатает для меня трассировку стека?

Спасибо.

1 Ответ

1 голос
/ 11 мая 2012

KDB будет полезен в этом случае.Я не знаю, какую версию ядра вы используете, но если вы используете ядро ​​на linux-2.6.35 или после него, вы можете переключиться на kdb из gdb, используя следующую команду:

        maintenance packet 3

Onceвы находитесь в kdb, вы можете использовать команду ps, чтобы узнать адрес дескриптора процесса, и можете использовать команду bt для трассировки стека.В качестве альтернативы, вы можете запустить команды kdb из GDB, используя команду GDB 'monitor'.Например, чтобы использовать команду «ps» для kdb, вы можете ввести следующую команду в свой gdb.

       (gdb) monitor ps

Вы можете получить список команд kdb, используя следующую команду.

       (gdb) monitor help

Когда вы знаете дескриптор процесса, вы можете использовать следующую документацию для отслеживания стека любого процесса.

      http://www.emntech.com/documentation/debugging/kdb.pdf   
...