歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> VMware環境下的kgdb環境配置和模塊調試示例

VMware環境下的kgdb環境配置和模塊調試示例

日期:2017/2/28 15:53:01   编辑:Linux教程

linux下的模塊開發,不可避免要用到kgdb來調試,kgdb的調試環境需要一台開發機,一台目標機,其中代碼運行在目標機上,開發機通過串口來調試目標機上的模塊代碼。用vmware可以方便的使用管道來代替真正的串口,而且只用一台筆記本就可以玩起來,非常簡單粗暴

1. 開發機和目標機通過vmware的命名管道建立串口設備,其中開發機作為管道的client,目標機作為管道的server,如圖所示

開發機串口設置



目標機串口設置


之後就可以安裝虛機了,我選用的是CentOS6的發行版本,自帶RedHat裁剪過的2.6.32的內核,之所以選這個版本的內核,因為2.6.28之後的內核版本已經合並了kgdb(之前的mainstream內核版本是沒有kgdb模塊的,需要自己下載一份patch,麻煩。。)安裝完成後,建議你重新編譯一次kernel,我選的是2.6.32.27的kernel.org版本,在make menuconfig時,記得把kernel hacking裡面該選的都選上,特別是kgdb下面的選項都編進內核(具體的.config可以問我要)


All these options on are the “Kernel Hacking” menu.

In order to support KDB, “KGDB” support must be turned on first (even if you aren’t using kgdb/gdb)

  • CONFIG_DEBUG_KERNEL=Y – includes debug information in the kernel compilation – required for basic kernel debugging support
  • CONFIG_KGDB=Y – turn on basic kernel debug agent support
  • CONFIG_KGDB_SERIAL_CONSOLE=Y – to share a serial console with kgdb.
    • Sysrq-g must be used to break in initially.
    • Selecting this will automatically set:
      • CONFIG_CONSOLE_POLL=N
      • CONFIG_MAGIC_SYSRQ=Y – turn on MAGIC-SYSRQ key support
  • CONFIG_KGDB_KDB=Y – actually turn on the KDB debugger feature

Optional other configuration settings:

  • CONFIG_FRAME_POINTER=Y – this allows for better backtrace support in KDB
  • CONFIG_DEBUG_RODATA=N – disable this in order to support breakpoints on data accesses
  • CONFIG_KALLSYMS=Y – this adds symbolic information to the kernel, useful to see symbols instead of addresses
  • CONFIG_KDB_KEYBOARD – use KDB with an attached keyboard (not for use with serial console)
  • CONFIG_KGDB_TESTS – used to turn on kgdb internal self-tests – see the config help for this for more information


注意CONFIG_DEBUG_RODATA不要選上

開發機虛機安裝完之後,最簡單的就是copy一份成為目標機,OK現在萬事俱備了

有兩種方式開始調試,如果你不想kernel在load完之後就hold住,可以在進入shell之後開始搞事。首先在開發機和目標機都是設置下stty參數,這樣串口才可以通信

開發機:stty ispeed 115200 ospeed 115200 -F /dev/ttyS0

目標機:stty ispeed 115200 ospeed 115200 -F /dev/ttyS0

完了之後可以測試下,目標機上cat /dev/ttyS0,然後開發機上echo "test" > /dev/ttyS0,這時候目標機上應該顯示test出來

在目標機上敲 echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc 如果成功,可以在/var/log/message裡看到 kernel: kgdb: Registered I/O driver kgdboc

好了,現在你可以load你的module了(具體如何調試module下一篇文章講),如果想要開始設置斷點,首先需要 echo g > /proc/sysrq-trigger,這時會顯示:

SysRq: DEBUG

Entering KGDB

表示目標機已經開始等待開發機的kgdb連接了

在開發機上,首先用gdb裝載內核,這裡要裝載帶有debug symbol的內核,就是為什麼要編譯一份內核的原因了,我這裡是

gdb /usr/src/kernels/linux-2.6.32.27/vmlinux

(gdb) set remotebaud 115200

(gdb) target remote /dev/ttyS0


如果能看到這個,說明基本成功了,恭喜你!


現在目標機的內核已經break在 wmb()上了,如果你要目標機繼續工作,可以c 一下,做一些事情,然後在目標機上再次敲 echo g > /proc/sysrq-trigger,又會回來


如果想讓kernel在啟動時就hold住等待調試的話,可以修改grub參數,如下圖所示


這樣目標機內核啟動時會打出一條:

kgdb: Waiting for connection from remote gdb

這時用開發機的gdb去連就OK了,按個c,內核正常啟動,搞定

Copyright © Linux教程網 All Rights Reserved