日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux系統(tǒng)中找出并解決程序錯誤方法( 五 )


rm -rf /lib/modules/2.4.17
rsync -a best@sfb:/lib/modules/2.4.17 /lib/modules
chown -R root /lib/modules/2.4.17
lilo

清單 7. 引入測試機器的內(nèi)核和模塊的腳本
現(xiàn)在我們可以通過改為使用內(nèi)核源代碼樹開始的目錄來啟動開發(fā)機器上的 gdb 程序了 。在本示例中 , 內(nèi)核源代碼樹位于 /usr/src/linux-2.4.17 。輸入 gdb 啟動程序 。
如果一切正常 , 測試機器將在啟動過程中停止 。輸入 gdb 命令 cont 以繼續(xù)啟動過程 。一個常見的問題是 , 空調(diào)制解調(diào)器電纜可能會被連接到錯誤的串口 。如果 gdb 不啟動 , 將端口改為第二個串口 , 這會使 gdb 啟動 。
使用 kgdb 調(diào)試內(nèi)核問題
清單 8 列出了 jfs_mount.c 文件的源代碼中被修改過的代碼 , 我們在代碼中創(chuàng)建了一個空指針異常 , 從而使代碼在第 109 行產(chǎn)生段錯誤 。

CODE:int jfs_mount(struct super_block *sb)
{
...
int ptr; /* line 1 added */
jFYI(1, ("nMount JFSn"));
/ *
* read/validate superblock
* (initialize mount inode from the superblock)
* /
if ((rc = chkSuper(sb))) {
goto errout20;
}
108 ptr=0; /* line 2 added */
109 printk("%dn",*ptr); /* line 3 added */

清單 8. 修改過后的 jfs_mount.c 代碼
清單 9 在向文件系統(tǒng)發(fā)出 mount 命令之后顯示一個 gdb 異常 。kgdb 提供了幾條命令 , 如顯示數(shù)據(jù)結(jié)構(gòu)和變量值以及顯示系統(tǒng)中的所有任務(wù)處于什么狀態(tài)、它們駐留在何處、它們在哪些地方使用了 CPU 等等 。清單 9 將顯示回溯跟蹤為該問題提供的信息;where 命令用來執(zhí)行反跟蹤 , 它將告訴被執(zhí)行的調(diào)用在代碼中的什么地方停止 。

CODE:mount -t jfs /dev/sdb /jfs
Program received signal SIGSEGV, Segmentation fault.
jfs_mount (sb=0xf78a3800) at jfs_mount.c:109
109 printk("%dn",*ptr);
(gdb)where
#0 jfs_mount (sb=0xf78a3800) at jfs_mount.c:109
#1 0xc01a0dbb in jfs_read_super ... at super.c:280
#2 0xc0149ff5 in get_sb_bdev ... at super.c:620
#3 0xc014a89f in do_kern_mount ... at super.c:849
#4 0xc0160e66 in do_add_mount ... at namespace.c:569
#5 0xc01610f4 in do_mount ... at namespace.c:683
#6 0xc01611ea in sys_mount ... at namespace.c:716
#7 0xc01074a7 in system_call () at af_packet.c:1891
#8 0x0 in ?? ()
(gdb)

清單 9. gdb 異常和反跟蹤
下一部分還將討論這個相同的 JFS 段錯誤問題 , 但不設(shè)置調(diào)試器 , 如果您在非 kgdb 內(nèi)核環(huán)境中執(zhí)行清單 8 中的代碼 , 那么它使用內(nèi)核可能生成的 Oops 消息 。
Oops 分析
Oops(也稱 panic , 慌張)消息包含系統(tǒng)錯誤的細節(jié) , 如 CPU 寄存器的內(nèi)容 。在 Linux 中 , 調(diào)試系統(tǒng)崩潰的傳統(tǒng)方法是分析在發(fā)生崩潰時發(fā)送到系統(tǒng)控制臺的 Oops 消息 。一旦您掌握了細節(jié) , 就可以將消息發(fā)送到 ksymoops 實用程序 , 它將試圖將代碼轉(zhuǎn)換為指令并將堆棧值映射到內(nèi)核符號 。在很多情況下 , 這些信息就足夠您確定錯誤的可能原因是什么了 。請注意 , Oops 消息并不包括核心文件 。
讓我們假設(shè)系統(tǒng)剛剛創(chuàng)建了一條 Oops 消息 。作為編寫代碼的人 , 您希望解決問題并確定什么導(dǎo)致了 Oops 消息的產(chǎn)生 , 或者您希望向顯示了 Oops 消息的代碼的開發(fā)者提供有關(guān)您的問題的大部分信息 , 從而及時地解決問題 。Oops 消息是等式的一部分 , 但如果不通過 ksymoops 程序運行它也于事無補 。下面的圖顯示了格式化 Oops 消息的過程 。
格式化 Oops 消息
ksymoops 需要幾項內(nèi)容:Oops 消息輸出、來自正在運行的內(nèi)核的 System.map 文件 , 還有 /proc/ksyms、vmlinux 和 /proc/modules 。關(guān)于如何使用 ksymoops , 內(nèi)核源代碼 /usr/src/linux/Documentation/oops-tracing.txt 中或 ksymoops 手冊頁上有完整的說明可以參考 。Ksymoops 反匯編代碼部分 , 指出發(fā)生錯誤的指令 , 并顯示一個跟蹤部分表明代碼如何被調(diào)用 。

推薦閱讀