1. 程式人生 > >《Linux Device Drivers》第四章 除錯技術——note

《Linux Device Drivers》第四章 除錯技術——note

2.1oops錯誤定位
   (1)首先在編譯生成核心的時候同時生成了一個vmlinux,使用gdb。
    在核心配置時,make menuconfig 要開啟complie with debug info選項。
    注意這行: PC is at skb_release_data+0x74/0xc4
    這告訴我們,skb_release_data函式有0xc4這麼大,而Oops發生在0x74處。 那麼我們先看一下skb_release_data從哪裡開始:
    #grep skb_release_data ./System.map
    c0282af4 t skb_release_data
    於是我們知道在系統出現錯誤時程式指標在 c0282af4+0x74=c0282b68
    (2)然後用gdb檢視,gdb ./vmlinux (在linux目錄下執行),進入除錯模式。
    gdb$ b *0xc0282b68
    Breakpoint 1 at 0xc0282b68: file net/core/skbuff.c ,line312
    這就是告訴我們在哪個檔案,在哪一行。如此知道了錯誤的位置,具體的原因帶解決。
    (2)反彙編
     gdb$ disassemble 0xc0282b68


2.2反編譯某一行
    先readelf -a vmlinux | grep setup_arch得到相關資訊:
    12707: c0351020 543 FUNC GLOBAL DEFAULT 9 setup_arch
    其中,c0351020 為起始地址,543為長度(10進位制),
    然後使用objdump -d --start-address=0xc0351020 --stop-address=0xc035123f vmlinux