23.5. 使用遠端 GDB 來線上除錯 Kernel

這個功能從 FreeBSD 2.2 開始就有提供了,而且算是個很不錯的除 錯方式。

GDB 支援 遠端除錯 已經有好一段時間了。 這個模式經由序列埠使用一個簡單的協定來進行除錯。不像上面提到的其 他除錯方式,你需要兩台電腦才能使用此種方式進行除錯。其中主機提供 除錯環境,包括所有的原始碼與一份包含所有的符號的核心副本,而目的 機器上則執行與著與主機的核心非常接近的版本(但是精簡過除錯資訊)。

你應該在核心設定檔中加入 DDB 選項,然後執行 config -g 指令,接著再編譯核心。這樣做會讓你 得到一個很肥大的核心,因為裡面包含了除錯的資訊。將這個核心拷貝到 目標機器上,執行 strip -x 來精簡除錯符號,然 後重開機,並在 boot 提示符號下輸入 -d 參數。從 主機的任何 sio 裝置連線到目標機器上─設有 "flags 080"─的 sio 裝 置。接著在除錯機器切換到核心編譯目錄,執行 gdb :

    % gdb -k kernel
    GDB is free software and you are welcome to distribute copies of it
     under certain conditions; type "show copying" to see the conditions.
    There is absolutely no warranty for GDB; type "show warranty" for details.
    GDB 4.16 (i386-unknown-freebsd),
    Copyright 1996 Free Software Foundation, Inc...
    (kgdb) 

執行以下指令來初始化遠端除錯連線(在此假設使用第一個序列埠來 進行除錯):

    (kgdb) target remote /dev/cuaa0

接著在目標機器上(在開始偵測裝置前就進入 DDB 模式那台機器)輸 入:

    Debugger("Boot flags requested debugger")
    Stopped at Debugger+0x35: movb	$0, edata+0x51bc
    db> gdb

DDB 會回應

    Next trap will enter GDB remote protocol mode

每當你輸入 gdb 時,會在遠端 GDB 模式跟本地 DDB 模式之間切換。要立刻強迫切換到觸發動作,你只要打個 s 即可。你主機的 GDB 將會取得目標機器的核心的 控制權:

    Remote debugging using /dev/cuaa0
    Debugger (msg=0xf01b0383 "Boot flags requested debugger")
        at ../../i386/i386/db_interface.c:257
    (kgdb)

你可像使用其他 GDB 連線一樣來使用這個連線,包括全權存取原始碼、 在一個 Emacs 視窗內以 gud 模式執行之(另一個 Emacs 視窗會自動顯示原 始程式碼)等等。