正確ではありませんが、デバッグ情報を使用して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%成功するとは限らないことに注意してください。ただし、コードに精通している場合は、デバッグを試みて、作業中のプラットフォームのアセンブリを解読することにある程度慣れてください...クラッシュなどのほとんどを特定できるはずです。