origin:
本文也即《linux device drivers》,ldd3的第四章debuging techniques的讀書筆記之六,但我們不限於此內容。這章看得比較慢,最近比較懶,而陷入了文件工作中,我決定這章節不會有之七,在之六打住。
在使用者程式中,有很多編譯工具同提供的debug工具,用於設定斷點或者單步跟蹤,但是在kernel程式中是很困難的。ldd3介紹了gdb對於kernel模組的使用方式,但是需要kernel版本在2.6.7以上。我們需要兩個檔案vmlinux和/proc/kcore。我注意到moblin是沒有看kcore的,而moblin的快速啟動和效率是對linux的乙個很大的優化,所以不知道以後是否還能通過這個方式。我在fc10進行實驗,具體如下:
一、先獲得vmlinux。
1、rpm –ivh kernel-2.6.27.5-117.fc10.src.rpm,在~/rpmbuild/中或有specs/kernel.specs;
2、進入~/rpmbuild/specs目錄,執行rpmbuild –bp kernel.specs,在~/rpmbuild/build/下有源**
3、進入~/rpmbuild/build/kernel-2.6.27/linux-2.6.27.i386目錄,需要根據我們的環境生成我們的.config檔案,執行perl merge.pl config-i686 config-x86-generic > .config
4、開啟config_debug_info的選項,執行make menuconfig,進入kernel hacking的選項,開啟kernel debugging,選擇compile the kernel with debug info,儲存,檢視vi .config,確認config_debug_info的選項已經設定為y。
5、如果我們直接編譯,有乙個bug,是toshiba的api,需要打補丁,既然我的機器沒有日立的api,可以在.config中將config_acpi_toshiba的選項直接關閉解決。我們只需要獲得vmlinux,執行 make arch=x86 bzimage即可。這個過程花點時間,完成後在當前目錄有乙個檔案vmlinux,這就是我們所需的。
二、進入kernel的gdb模式:
執行gdb vmlinux /proc/kcore,在moblin中,不直接使用gdb vmlinux即可。我們載入scull模組後,在/sys/module/scull/sections中,使用ls -a的命令,有很多系統檔案,用於顯示scull模組的記憶體物理位置,其中需要注意的有.text。顯示模組執行executable code的位置,.bss和.data顯示模組變數的位置,如果編譯時沒有初始化位於.bss,如果編譯時已經初始化則位於.data。 需查清各自物理記憶體的位置。cat .data .bss .text
下面是處理的過程:
$sudo gdb vmlinux /proc/kcore
this is free software: you are free to change and redistribute it.
there is no warranty, to the extent permitted by law. type "show copying"
and "show warranty" for details.
this gdb was configured as "i386-redhat-linux-gnu"...
core was generated by `ro root=uuid=e57e257e-7340-411c-a6bb-6eb375f5aa8b rhgb quiet'.
[new process 0]
#0 0x00000000 in ?? ()
(gdb)add-symbol-file /home/wei/workspace/learning/kernel_module/scull_debug/scull.ko 0xf9df8000 -s .bss 0xf9dfaa00 -s .data 0xf9df9720
add symbol table from file "/home/wei/workspace/learning/kernel_module/scull_debug/scull.ko" at
.text_addr = 0xf9df8000
.bss_addr = 0xf9dfaa00
.data_addr = 0xf9df9720
(y or n)y
reading symbols from /workspace/wei/learning/kernel_module/scull_debug/scull.ko...done.
(gdb)p mydev[0]
$1 = }, count = 1, wait_list = }, cdev = , parent = 0x0,
kset = 0x0, ktype = 0xc07d97c0, sd = 0x0, kref = }, state_initialized = 1, state_in_sysfs = 0,
state_add_uevent_sent = 0, state_remove_uevent_sent = 0},
owner = 0xf9df9880, ops = 0xf9df9740, list = , dev = 260046848, count = 1}}
(gdb)p mydev[0]//這裡通過使用者程式寫入資訊,在執行一次,發現結果相同,gdb給出的是上次結果的快取
$2 = }, count = 1, wait_list = }, cdev = , parent = 0x0,
kset = 0x0, ktype = 0xc07d97c0, sd = 0x0, kref = }, state_initialized = 1, state_in_sysfs = 0,
state_add_uevent_sent = 0, state_remove_uevent_sent = 0},
owner = 0xf9df9880, ops = 0xf9df9740, list = , dev = 260046848, count = 1}}
(gdb)core-file /proc/kcore//更新,flush cache,下次查詢,將是實時內容
core was generated by `ro root=uuid=e57e257e-7340-411c-a6bb-6eb375f5aa8b rhgb quiet'.
[new process 0]
#0 0x00000000 in ?? ()
(gdb)p mydev[0]
$3 = }, count = 1,
wait_list = }, cdev = ,
parent = 0x0, kset = 0x0, ktype = 0xc07d97c0, sd = 0x0, kref = }, state_initialized = 1, state_in_sysfs = 0,
state_add_uevent_sent = 0, state_remove_uevent_sent = 0},
owner = 0xf9df9880, ops = 0xf9df9740, list = , dev = 260046848, count = 1}}
(gdb)
用gdb除錯核心模組
請讀者試用 本人開發搜尋頁面 速谷歌 本文也即 linux device drivers ldd3的第四章debuging techniques的讀書筆記之六,但我們不限於此內容。這章看得比較慢,最近比較懶,而陷入了文件工作中,我決定這章節不會有之七,在之六打住。在使用者程式中,有很多編譯工具同提供...
gdb除錯動態鏈結so
gdb file 你的exe gdb load 你的so 這條應該是可選的 gdb dir gdb sharedlibrary 你的so gdb breakpoint 你的so中somewhere gdb run load 是將動態庫加載入記憶體。sharedlibrary是將動態庫的符號讀入gdb...
gdb除錯動態鏈結so
gdb file 你的exe gdb load 你的so 這條應該是可選的 gdb dir gdb sharedlibrary 你的so gdb breakpoint 你的so中somewhere gdb run load 是將動態庫加載入記憶體。sharedlibrary是將動態庫的符號讀入gdb...