отладка ядра для зависшего процесса? - PullRequest
1 голос
/ 04 февраля 2012

Я пытаюсь отладить драйвер устройства, который, очевидно, вызывает другие Задача повесить. Это определенно то, что задача или в какое время это будет висеть.

По сути, я получил сообщение об ошибке из ядра, в котором говорится, что «задача имеет был заблокирован на более чем 120 секунд ", вместе с некоторым следом стека. Зависшие задачи варьируются от sendmail до mkfs и pdflush (поток ядра). И самая верхняя функция в трассировке стека отличается от "getnstimeofday" "bio_submit" в "mark_locks_held".

Мне трудно отлаживать это, так как очень трудно найти проблема. Трассировка стека, предоставляемая ядром, не очень полезна ни. Согласно этим следам стека, некоторые из этих зависших процессов даже не пытаются захватить замок (как в getnstimeofday функции), и я понятия не имею, почему они зависают.

Так что мне интересно, есть ли у кого-нибудь идеи о том, как отладить такой проблема. Будет ли здесь полезен kgdb, может быть, давая мне именно то, что указать процесс зависает, и какой блокировки он ждет?

Любые предложения приветствуются.

1 Ответ

0 голосов
/ 04 февраля 2012

Если в ядре не включены указатели фреймов, трассировка стека не будет надежной, и это вас смущает.Ядро прибегает к сканированию всего стека на предмет значений, которые могут быть указателями на код ядра (т. Е. Потенциальных адресов возврата).Это означает, что предыдущие вызовы функций, которые уже были возвращены, могут все еще печататься.

Если у вас был код, который выглядел так:

void A(void) {
    printk("foo\n");
}

void B(void) {
    int x;
    A();
}

void crash(void) {
    char buf[32];
    *(int*)0 = 0;
}

void trouble(void) {
    int x;
    B();
    crash();
}

Дамп стека может выглядеть примерно так:

printk
A
crash
foo
trouble
...

Что касается отладки вашей проблемы, у меня есть два предложения:

  1. Зная, что некоторые выходные данные отладки плохие, используйте свои собственные знания кода, чтобы понять реальный стек вызовов.Это может помочь найти общие функции в нескольких дампах стека.

  2. Перекомпилировать ядро, чтобы использовать указатели фреймов.

Ядро все еще будетвыведите каждое значение, которое выглядит как адрес возврата, но оно помечает ненадежные адреса знаком «?».Таким образом, ваш дамп стека может выглядеть так:

? printk
? A
crash
? foo
trouble
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...