《Linux Device Drivers》第四章 除錯技術——note
阿新 • • 發佈:2019-02-03
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
(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