日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

linux kdb 内核调试器

發布時間:2023/12/13 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 linux kdb 内核调试器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

許多讀者可能奇怪為什么內核沒有建立更多高級的調試特性在里面.答案, 非常簡單, 是 Linus 不相信交互式的調試器. 他擔心它們會導致不好的修改, 這些修改給問題打了補丁 而不是找到問題的真正原因. 因此, 沒有內嵌的調試器.

其他內核開發者, 但是, 見到了交互式調試工具的一個臨時使用. 一個這樣的工具是 kdb 內嵌式內核調試器, 作為來自 oss.sgi.com 的一個非官方補丁. 要使用 kdb, 你必須獲 得這個補丁(確認獲得一個匹配你的內核版本的版本), 應用它, 重建并重安裝內核. 注意, 直到本書編寫時, kdb 只在 IA-32(x86)系統中運行(盡管一個給 IA-64 的版本在主線內核 版本存在了一陣子, 在被去除之前.)

一旦你運行一個使能了 kdb 的內核, 有幾個方法進入調試器. 在控制臺上按下 Pause(或 者 Break) 鍵啟動調試器. kdb 在一個內核 oops 發生時或者命中一個斷點時也啟動, 在 任何一種情況下, 你看到象這樣的一個消息:

Entering kdb (0xc0347b80) on processor 0 due to Keyboard Entry [0]kdb>

注意, 在 kdb 運行時內核停止任何東西. 在你調用 kdb 的系統中不應當運行其他東西; 特別, 你不應當打開網絡 -- 除非, 當然, 你在調試一個網絡驅動. 一般地以單用戶模式 啟動系統是一個好主意, 如果你將使用 kdb.

作為一個例子, 考慮一個快速 scull 調試會話. 假設驅動已經加載, 我們可以這樣告訴 kdb 在 sucll_read 中設置一個斷點:

[0]kdb> bp scull_read

Instruction(i) BP #0 at 0xcd087c5dc (scull_read) is enabled globally adjust 1

[0]kdb> go

bp 命令告訴 kdb 在下一次內核進入 scull_read 時停止. 你接著鍵入 go 來繼續執行. 在將一些東西放入一個 scull 設備后, 我們可以試著通過在另一個終端的外殼下運行 cat 命令來讀取它, 產生下面:

Instruction(i) breakpoint #0 at 0xd087c5dc (adjusted) 0xd087c5dc scull_read: int3

Entering kdb (current=0xcf09f890, pid 1575) on processor 0 due to

Breakpoint @ 0xd087c5dc [0]kdb>

我們現在位于 scull_read 的開始. 為看到我們任何到那里的, 我們可以獲得一個堆棧回 溯:

[0]kdb> bt

ESP EIP
Function (args)

0xcdbddf74
0xd087c5dc [scull]scull_read 0xcdbddf78 0xc0150718 vfs_read+0xb8 0xcdbddfa4
0xc01509c2 sys_read+0x42 0xcdbddfc4 0xc0103fcf syscall_call+0x7 [0]kdb>

kdb 試圖打印出調用回溯中每個函數的參數. 然而, 它被編譯器的優化技巧搞糊涂了. 因 此, 它無法打印 scull_read 的參數.

到時候查看一些數據了. mds 命令操作數據; 我們可以查詢 schull_devices 指針的值, 使用這樣一個命令:

[0]kdb> mds scull_devices 1 0xd0880de8 cf36ac00
....

這里我們要求一個(4 字節)字, 起始于
scull_devices 的位置; 答案告訴我們的設備數組 在地址
0xd0880de8; 第一個設備結構自己在 0xcf36ac00. 為查看那個設備結構, 我們需 要使用這個地址:

[0]kdb>
mds cf36ac00 0xcf36ac00 ce137dbc .... 0xcf36ac04 00000fa0 .... 0xcf36ac08
000003e8 ....

0xcf36ac0c 0000009b .... 0xcf36ac10 00000000 ....

0xcf36ac14 00000001 ....

0xcf36ac18 00000000 ....

0xcf36ac1c 00000001 ....

這里的 8 行對應于 scull_dev 結構的開始部分.
因此, 我們看到第一個設備的內存位于 0xce137dbc, quantum 是 4000 (16 進制 fa0), 量子集大小是 1000 (16 進制
3e8 ), 當 前有 155( 16 進制 9b) 字節存于設備中.

kdb 也可以改變數據. 假想我們要截短一些數據從設備中: [0]kdb> mm cf26ac0c 0x50

0xcf26ac0c = 0x50

在設備上一個后續的 cat 會返回比之前少的數據.

kdb
有不少其他功能, 包括單步(指令, 不是 C 源碼的一行), 在數據存取上設置斷點, 反匯編代碼, 步入鏈表, 存取寄存器數據, 還有更多. 在你應用了
kdb 補丁后, 一個完 整的手冊頁集能夠在你的源碼樹的 documentation/kdb 下發現.

總結

以上是生活随笔為你收集整理的linux kdb 内核调试器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。