將訊號用作 Linux 調試工具 – From IBMDW

來源:互聯網
上載者:User
本文介紹了如何用訊號來調試一個程式。眾所周知,在Linux編程中,經常會遇到程式segment fault或其他類似的錯誤,這些錯誤比較難調試,本文就介紹了用訊號來調試這種錯誤的方法。

當一個程式訪問一個未分配記憶體的地址時或其他情況時,會產生segment fault錯誤,此時程式會產生一個SIGSEGV的訊號,所以,我們的程式可以捕獲這個訊號,並列印出是哪條指令導致了該錯誤,及產生該錯誤時CPU各寄存器的值,從而定位出問題所在。

本文舉了兩個很好的例子,一個是對SIGILL訊號的處理,比如,當一個應用程式執行了一個不被允許的操作(比如用彙編執行儲存/恢複CPU特權 寄存器的指令),這種操作在使用者空間中是不被允許的,只有核心程式採用使用這種指令,那麼,此時,程式就會產生一個SIGILL的訊號,我們的程式可以捕 獲這個訊號,同時將產生該訊號的指令和當前CPU寄存器的值列印到一個檔案中,然後退出。OK,有了這些資訊後,我們就可以用objdump來查看我們的 二進位程式檔案,找到相應的指令,然後就可以分析出是程式的哪句代碼導致了該錯誤了,贊啊!

如果我們在編譯器的時候,加上了 -g 這個選項,那麼,在objdump的輸出中,還會在相應的彙編代碼處加上原始碼,這就更方便我們定位代碼錯誤了!

本文第二個例子就是給一個未分配記憶體空間的指標賦值,顯然,這會產生SIGSEGV訊號,同樣的,我們捕獲這個訊號,並將指令和CPU寄存器的值列印出來,然後用objdump分析二進位檔案,就可以找到是哪句代碼導致了該錯誤了!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.