2016-06-28 35 views
1

我希望看到做這樣的事情的時候被調用的內核函數:查看在崩潰之前調用哪個內核函數的方法?

int main(void) 
{ 
    int arr[5] = {0}; 
    arr[3000] = 8; // I want to see what kernel function sends the SIGBUS 
} 

有沒有辦法用gdb,或其他一些工具來做到這一點?

+2

那麼,你不能保證得到一個信號。這是未定義的行爲,所以任何事情都可能發生,包括什麼都沒有。 –

回答

1

我'不知道,如果調用順序是具體的牌坊,但對於手臂:

do_page_fault -> __do_user_fault -> force_sig_info. 

不能通過GDB檢查cuz它是一個內核。如果您想調查更多內容,請使用dump_stack()/ printk/ftrace內核API。 順便說一下, - 這是不明顯的,這段代碼將得到異常信號...

+0

雖然你不應該指望這個崩潰,但它很可能會在今天的系統上。如果堆棧向下擴展,遠遠超出數組末端的訪問可能會高於堆棧的原始地址,並且會映射到堆棧的原始地址之外,因此可能會觸發故障,除非屬於該進程的某個其他頁面被映射到該地址地址。如果你打印出一些指針並進入睡眠狀態,可以在/ proc中查看進程的頁面映射,當我這樣做時,我發現堆棧映射和下一個之間存在差距,也許放在那裏以嘗試捕獲這種事情。 –