1

完了キューの問題と思われるものをデバッグしようとしています。

Apr 14 18:39:15 ST2035 kernel: Call Trace:
Apr 14 18:39:15 ST2035 kernel:  [<ffffffff8049b295>] schedule_timeout+0x1e/0xad
Apr 14 18:39:15 ST2035 kernel:  [<ffffffff8049a81c>] wait_for_common+0xd5/0x13c
Apr 14 18:39:15 ST2035 kernel:  [<ffffffffa01ca32b>]
ib_unregister_mad_agent+0x376/0x4c9 [ib_mad]
Apr 14 18:39:16 ST2035 kernel:  [<ffffffffa03058f4>] ib_umad_close+0xbd/0xfd

それらの16進数を行番号に近いものに変えることは可能ですか?

4

1 に答える 1

5

正確ではありませんが、デバッグ情報を使用してvmlinuxイメージをビルドしている場合(たとえば、RHELでは、kernel-debugまたはkernel-dbgなどをインストールできるはずです)、近づけることができます。したがって、そのvmlinuxファイルが利用可能であると仮定します。以下をせよ:

objdump -S vmlinux

これにより、オブジェクトコードをソースコードの個々の行に一致させるのが最も困難になります。

たとえば、次のCコードの場合:

#include <stdio.h>
main() {
  int a = 1;
  int b = 2;

  // This is a comment

  printf("This is the print line %d\n", b);
} 

でコンパイル:cc -g test.c

次に、結果の実行可能ファイルでobjdump -Sを実行すると、次のセクションを含む実行可能ファイルのさまざまな部分を説明する大きな出力が得られます。

00000000004004cc <main>:
#include <stdio.h>
main() {
  4004cc:   55                      push   %rbp
  4004cd:   48 89 e5                mov    %rsp,%rbp
  4004d0:   48 83 ec 20             sub    $0x20,%rsp
  int a = 1;
  4004d4:   c7 45 f8 01 00 00 00    movl   $0x1,-0x8(%rbp)
  int b = 2;
  4004db:   c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%rbp)

  // This is a comment

  printf("This is the print line %d\n", b);
  4004e2:   8b 75 fc                mov    -0x4(%rbp),%esi
  4004e5:   bf ec 05 40 00          mov    $0x4005ec,%edi
  4004ea:   b8 00 00 00 00          mov    $0x0,%eax
  4004ef:   e8 cc fe ff ff          callq  4003c0 <printf@plt>
} 

最初の列のオブジェクトコードのアドレスを、スタックトレースのアドレスと照合できます。それをアセンブリ出力にインターリーブされた行番号情報と組み合わせると...そこにいます。

kenrelは通常-O2最適化レベルでコンパイルされ、コンパイラは多くのコードの並べ替えなどを行うため、これが常に100%成功するとは限らないことに注意してください。ただし、コードに精通している場合は、デバッグを試みて、作業中のプラットフォームのアセンブリを解読することにある程度慣れてください...クラッシュなどのほとんどを特定できるはずです。

于 2010-04-15T21:02:07.383 に答える