我希望看到做這樣的事情的時候被調用的內核函數:查看在崩潰之前調用哪個內核函數的方法?
int main(void)
{
int arr[5] = {0};
arr[3000] = 8; // I want to see what kernel function sends the SIGBUS
}
有沒有辦法用gdb,或其他一些工具來做到這一點?
我希望看到做這樣的事情的時候被調用的內核函數:查看在崩潰之前調用哪個內核函數的方法?
int main(void)
{
int arr[5] = {0};
arr[3000] = 8; // I want to see what kernel function sends the SIGBUS
}
有沒有辦法用gdb,或其他一些工具來做到這一點?
我'不知道,如果調用順序是具體的牌坊,但對於手臂:
do_page_fault -> __do_user_fault -> force_sig_info.
不能通過GDB檢查cuz它是一個內核。如果您想調查更多內容,請使用dump_stack()/ printk/ftrace內核API。 順便說一下, - 這是不明顯的,這段代碼將得到異常信號...
雖然你不應該指望這個崩潰,但它很可能會在今天的系統上。如果堆棧向下擴展,遠遠超出數組末端的訪問可能會高於堆棧的原始地址,並且會映射到堆棧的原始地址之外,因此可能會觸發故障,除非屬於該進程的某個其他頁面被映射到該地址地址。如果你打印出一些指針並進入睡眠狀態,可以在/ proc中查看進程的頁面映射,當我這樣做時,我發現堆棧映射和下一個之間存在差距,也許放在那裏以嘗試捕獲這種事情。 –
那麼,你不能保證得到一個信號。這是未定義的行爲,所以任何事情都可能發生,包括什麼都沒有。 –