- 论坛徽章:
- 1
|
能详细说明一下adb,kadb怎么用吗?
adb的使用范例,也给你贴一个
Solaris Device Driver 簡介-(05)
* Device Driver Debug
一般來說在 Solaris 上較常用來作 Kernel Debug 的工具有: kadb, adb 等,我個人是比
較常用這兩個工具來做除錯的工作.
* kadb
kadb 可以讓使用者擷取使用者所想要的資訊,諸如堆疊的追蹤, 執行緒的資訊或 cpu 資料
的結構.
首先先確定系統中是否有 kadb
#cd /platform/sun4u
/platform/sun4u
#ls kadb
kadb
- 使用 /etc/halt 指令將系統關閉,回到 ok 提示下
ok setenv boot-file kadb
ok boot
或者
ok boot kadb -->; (Note:此為 64 bit Kernel)
此時系統將會啟動進入 Solaris.
Note:
Solaris 8 是可以讓您執行 64 bit kernel 或是 32 bit kernel.
* 以 32-bit Kernel 來做除錯工作
先以 root 身分登錄, 開啟終端機視窗並輸入下列命令:
# su -
# cd /
# halt -y
系統將會回應下列的結果並回到 ok 提示下:
syncing file systems... done
Program terminated
ok
在 "ok" 提示下輸入下列命令:
ok boot kadb -D kernel/unix
系統將會以此核心檔案來啟動.
以 root 身分登錄, 開啟終端機視窗並輸入下列命令:
# su -
# cd /
# eeprom boot-file=kernel/unix
# reboot
這個時候 Solaris 8 日後的啟動核心檔案便是預設的 32 bit kernel.
* 以 64-bit Kernel 來做除錯工作
要改變回 64 bit kernel, 僅需執行下列指令.
# su -
# cd /
# halt -y
系統將會回應下列的結果並回到 ok 提示下:
syncing file systems... done
Program terminated
ok
在 "ok" 提示下輸入下列命令:
ok boot kadb -D kernel/sparcv9/unix
以 root 身分登錄, 開啟終端機視窗並輸入下列命令:
# su -
# cd /
# eeprom boot-file=kernel/sparcv9/unix
# reboot
這個時候 Solaris 8 日後的啟動核心檔案便是預設的 64 bit kernel.
當進入系統後您現在就可以按下 (STOP-A) 進入 "kadb:" 提示下.
若要回到系統中只要於 "kadb:" 提示下輸入 :c, 便可以回到系統了.
Note:
按下 L1-A 或 STOP-A (sparc console), BREAK (sparc tty), 或 CTRL-ALT-D
(x86 - D not DEL).
現在您便是在 kernel debugger 之中並且可以傾印緩衝區內的訊息, 追蹤堆疊以及檢查剩
餘的記憶體空間, 您可以輸入下列命令來查詢所要的工作:
$c - 取得現行的堆疊追蹤
$C - 顯示 frame pointer addresses.
*******************************************************************************
$e
$f
$m
$v
$x
$X
$r
*******************************************************************************
:e - 執行程式下一步驟
$<msgbuf - 顯示 msgbuf 的內容
freemem/D - 顯示剩餘記憶體空間容量
$<cpus - 顯示 cpu 的資料結構 (long)
$<threadlist - 顯示所有的執行緒 (very long)
:c - 回到作業系統中繼續執行
$q - 回到 OBP 的 ok 提示下
sync - 在 OBP 的 ok 提示下強迫產生 core dump
lbolt/X - 顯示 lbolt 的值
* adb
當您的系統核心發生 core dump 的情況時, 您可以直接執行 adb 在下列的路徑找到
core dump 所產生的檔案.
# adb -k /var/crash/`uname -n`/unix.0 /var/crash/`uname -n`/vmcore.0
$C - 顯示 frame pointer addresses.
$<threadlist - 顯示所有的執行緒 (very long)
$<panicbuf - 查看各個單獨的核心執行緒
Note:
按下 L1-A 或 STOP-A (sparc console), BREAK (sparc tty), 或 CTRL-ALT-D
(x86 - D not DEL).
18::more - 開啟螢幕分頁模式 (如同執行 "more"
:c - 回到作業系統中繼續執行
$<cpus - 顯示各個 cpu 的執行緒
freemem/X - 顯示剩餘記憶體的分頁數
$<kmastat - 顯示剩餘記憶體空間容量
$<msgbuf - 顯示 msgbuf 的內容
lbolt/X - 顯示 "system tick" 計數器 (如同系統 "clock" tick)
[ - 如同在 gdb 中的 "next"
] - 如同在 gdb 中的 "step"
module#f_name:b - 設定 "breakpoint" 在 function f_name(), kernel module 'module'
--------------------------------------------------------------------------------
不幸地, $C 所給予的格式如下:
functionname:+0x104
只能了解是在哪裡產生 core dump, 您可以 "objdump" 來了解您的 driver 是再哪一行發
生錯誤.
假設您的 Driver 有附加選項 -g 來編譯,
objdump -d -S yourdriver
這時您將會看到組合語言的輸出, 並以 C 程式語言為註解, 以及 hex offsets.
Note:
# adb -k -w
physmem 78ec
$r
g0 0 l0 0
g1 0 l1 0
g2 0 l2 0
g3 0 l3 0
g4 0 l4 0
g5 0 l5 0
g6 0 l6 0
g7 0 l7 0
o0 0 i0 0
o1 0 i1 0
o2 0 i2 0
o3 0 i3 0
o4 0 i4 0
o5 0 i5 0
sp 2a1008d1101 fp 0
o7 1002bb60 trap_rtt+0x74 i7 0
y 0
tstate: 0 (ccr=0x0, asi=0x0, pstate=0x0, cwp=0x0)
pstate: ag:0 ie:0 priv:0 am:0 pef:0 mm:0 tle:0 cle:0 mg:0 ig:0
pc 1002bb60 trap_rtt+0x74: call preempt
npc 0
不管是在 kadb 或 adb 中, 輸入 $r 都會見到下列 register 的表示, 簡略說明
各 register 的意義.
Windowed Register Address r Register Address
====================================================
g0 - g7 表示為 global register r[0] - r[7]
o0 - o7 表示為 out register r[8] - r[15]
l0 - l7 表示為 local register r[16] - r[23]
i0 - i7 表示為 in register r[24] - r[31]
** 詳細內容請參考 The SPARC Architecture Manual Version 9
雅虎奇摩徵才
更多訊息...
雅虎奇摩徵才
頂尖的網路公司提供您卓越的網路工作生涯! 如果您熱愛暢遊網路,想成為熱門行業的菁英,雅虎奇摩讓您暢遊!
Software Engineer
Associate Marketing Manager
Billing Specialist
[關閉]
undefined
[關閉]
undefined |
|