用gdb除錯核心模組

2021-06-08 09:22:35 字數 4117 閱讀 3457

請讀者試用 本人開發搜尋頁面

速谷歌  

本文也即《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)

其他調測工具

可以使用虛擬機器來調測kernel,例如在moblin中,有mic2工具,或者可以使用kvm。書中介紹了user-mode linux的概念,但是這種方式,適合調測kernel,而不太適合做驅動,因為無法獲取硬體裝置,因此這本書只是提了一下,並沒有做進一步的介紹。在一些實驗例子中,如果我覺得有可能危及我的系統,一般轉到kvm上先看看。

總結一下第四章:對於我們的開發,如果不是很大規範,只設計到kernel module不涉及到kernel,不需要引入其他的工具,printk就是很好的工具,在這種中我們可以通過makefile來設定調測的等級。還學習了通過/proc檔案來和kernel進行互動。

gdb除錯動態載入模組

origin 本文也即 linux device drivers ldd3的第四章debuging techniques的讀書筆記之六,但我們不限於此內容。這章看得比較慢,最近比較懶,而陷入了文件工作中,我決定這章節不會有之七,在之六打住。在使用者程式中,有很多編譯工具同提供的debug工具,用於設...

用GDB除錯程式

用gdb除錯程式 gdb概述 gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc bcb的圖形化偵錯程式更強大的功能。所謂 寸有所長,尺有所短 就是這...

用gdb除錯core dump檔案

在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.開發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示co...