我目前正在調試一個內核模塊,爲此,我使用調試信息(產生kallsyms等)構建了整個內核。爲什麼缺少一些調試符號以及如何跟蹤它們?
當我嘗試nm my_module.ko
時,我得到了我的模塊包含的符號列表。除了某些符號由於它們不出現在符號列表中而有些遺漏之外,一切都是好的。我對此的感覺是相關功能被自動內聯。
無論如何,當用qemu-kgdb/gdb運行內核時,我能夠看到「missing」函數被調用。這意味着編譯器沒有把它擦掉,因爲它從來沒有用在任何代碼路徑中(因此我的「感覺」)。
因爲符號沒有出現,所以我不能在它上面設置一個斷點,並且gdb不會展開它,這樣我就可以看到正在運行的代碼路徑 - 理解我不知道如何告訴gdb展開它。
不幸的是,我想看看代碼路徑的這一部分...我該怎麼做?
編輯:正如湯姆的回答表明,我嘗試使用下面的file:line
語法:
我的代碼文件看起來像這樣:
int foo(int arg) // The function that I suspect to be inlined - here is line 1
{
/* Blabla */
return 42;
}
void foo2(void)
{
foo(0); // Line 9
}
我試過b file.c:1
,並且斷點被擊中但foo()
函數未展開。 當然,我正在生成調試符號,因爲我還設置了一個斷點到foo2
來檢查發生了什麼(哪一個工作正常)。
您是否嘗試過在特定的行上設置斷點而不是符號?此外,您可以強制編譯器不要內聯代碼。 – Hasturkun
你使用了一些剝離選項? –