不完全是,但如果你有一個vmlinux的圖像內置與調試信息,(例如,在RHEL,你應該能夠安裝內核調試或內核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上生成的可執行文件,得到了一個大的輸出描述可執行文件的各個部分inclding以下部分:
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 <[email protected]>
}
您可以將第一列中目標代碼的地址與堆棧跟蹤中的地址進行匹配。將它與在組件輸出中交錯的行號信息結合起來......並且您在那裏。
現在請記住,這不會總是100%成功,因爲kenrel通常編譯在-O2優化級別,編譯器會做很多代碼重新排序等。但如果您熟悉代碼你正在嘗試調試並且解密你正在工作的平臺的程序集時有一些安慰......你應該能夠確定你的大部分崩潰等。
你是否嘗試過使用kalllsyms_all構建和詳細bug()? – user2284570 2015-04-12 14:32:04