2012-02-04 2 views
1

Я пытаюсь отладить драйвер устройства, который, по-видимому, вызывает другую задачу . Детерминировано, что какая задача или в какое время будет висеть .Отладка ядра для зависания процесса?

В основном у меня появилось сообщение об ошибке из ядра, в котором говорилось, что «задача имеет заблокирована более 120 секунд», а также некоторые трассировки стека. нависшая задача варьируется от Sendmail до МКФСА к pdflush (ядра нити». И верхней функции трассировки стеки отличаться от„getnstimeofday“ на„bio_submit“на„mark_locks_held“.

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

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

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

+0

Является ли ваше ядро ​​скомпилированным для использования указателей на рамки? – Karmastan

+0

Нет, это не так. Однако у него есть все опции отладки. – yangsuli

ответ

0

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

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

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. Зная, что некоторые из результатов отладки плохие, используйте свои знания кода, чтобы выяснить, реальный call стек. Это может помочь найти общие функции в нескольких дампах стека.

  2. Перекомпилируйте ядро ​​для использования указателей на рамки.

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

? printk 
? A 
crash 
? foo 
trouble 
+0

Итак, я пошел перекомпилировать свое ядро ​​с указателями на рамки. Трассировка стека не кажется очень надежной ... Например, у меня есть один трассировочный стек: ]? mutex_lock_nested + 0x13c/0x224 [] mutex_lock_nested + 0x143/0x224 []?real_lookup + 0x24/0xc5 [] real_lookup + 0x24/0xc5 Это очень подозрительно, поскольку я не вижу, как real_lookup вызывает mutex_lock_nested в исходном коде! (Я использую 2.6.26) – yangsuli

+0

Я обновил свое сообщение, чтобы сообщить ваш комментарий. – Karmastan

+0

@yangsuli: вы также можете посмотреть [здесь] (http://lxr.linux.no/#linux+v2.6.26/fs/namei.c#L505) и [здесь] (http: // lxr. linux.no/#linux+v2.6.26/include/linux/mutex.h#L131). – Karmastan

Смежные вопросы