在qemu環境中用gdb除錯Linux核心

2022-09-13 07:36:11 字數 2869 閱讀 4670

對使用者態程序,利用gdb除錯**是很方便的手段。而對於核心態的問題,可以利用crash等工具基於coredump檔案進行除錯。其實我們也可以利用一些手段對linux核心**進行gdb除錯,qemu就是一種。qemu是一款完全軟體模擬(binary translation)的虛擬化軟體,在虛擬化的實現中效能相對較差。但利用它來在測試環境中gdb除錯linux核心**,是熟悉linux核心**的乙個好方法。本文旨在介紹怎麼利用qemu搭建linux的gdb除錯環境。其中主要包括了如何編譯linux核心,如何利用gdb遠端連線qemu啟動的gdbserver,進而進一步進行核心**除錯。

編譯選項不同的架構有不同的預設檔案,比如x86平台,可以在arch/x86/configs找到相關檔案:i386_defconfig。通過執行make i386_defconfig 即可基於這個檔案生成.config檔案,在此基礎上可以再執行make menuconfig 來進行個別的調整。更多的細節請參考:documentation\kbuild\kconfig.txt。 總之,無論怎麼配置,最終都是為了生成.config檔案。這些巨集最終將影響makefile中參與編譯的檔案。

**的編譯選項配置很多,這裡主要做如下兩處配置:

# make

i386_defconfig //32位架構

# make menuconfig // 調整編譯選項

注意:預設make menuconfig會報錯如下,因為最小系統不支援圖形顯示。

# make

menuconfig

hostcc scripts/kconfig/mconf.o

in file included from scripts/kconfig/mconf.c:23:0

:scripts/kconfig/lxdialog/dialog.h:38:20: fatal error: curses.h: no such file

or directory

#include curses_loc

^compilation terminated.

解決方法:

# apt-get install libncurses5-dev -y
在核心編譯選項中,開啟如下"compile the kernel with debug info"

kernel hacking --->

compile-time checks and compiler options --->

[ ] compile the kernel with debug info

示意圖如下,利用鍵盤選中debug選項,然後敲"y"勾選:

在menuconfig中選完編譯選項,結果會寫入到.config檔案中。可以看到.config檔案的config_debug_info被設定成y。

編譯

編譯選項選完後,利用make編譯,編譯需要較長時間。

# make -j2
編譯完成之後,會有一些新的檔案產生,如:

安裝qemu

# apt-get update

# apt-get install

qemu

# 因為用的32位平台環境,所以用下面的qemu

# ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu

qemu主要選項解釋:

利用qemu啟動編譯好的核心,如下:

console=ttys0

" -nographic

在本機另乙個terminal利用gdb連線本地的gdbserver 1234埠

# gdb

# (gdb)

file linux-3.18.6/vmlinux //load linux符號表

reading symbols from linux-3.18.6/vmlinux...done

.# (gdb) target remote:

1234 //遠端連線監聽在tcp 1234的gdb server

(gdb) break start_kernel //在start_kernel函式設定斷點

breakpoint

1 at 0xc1a2f7c5: file init/main.c, line 501

.(gdb) c //continue,繼續執行**

在繼續執行後,最終qemu的輸出如下,在qemu虛擬機器裡執行的linux系統能成功啟動,並且最終以kernel panic宣告結束。看到call trace打出來的是在initrd_load的時候出錯,原因很簡單,因為啟動系統的時候只指定了bzimage,沒有指定initrd檔案,系統無法mount上initrd (init ram disk) 及其initramfs檔案系統。

到此為止,gdb除錯linux核心**的基本環境已經搭建完成,可以利用斷點來除錯啟動啟動中的細節。後面將介紹如何構建initramfs檔案系統,能讓qemu執行的linux系統更像「完整的系統」。

IDA除錯QEMU修復除錯環境

本篇文章是按照家用路由器裡面的內容來敘述的.在目錄 my file dir605l fw 113.bin.extracted squashfs root 0 下 執行cp which qemu mips 而後執行命令 sudo chroot qemu mips bin boa 注意 書上是有錯誤的,...

在NS2中用GDB來除錯

我想對於用ns來 的人來說,很重要的乙個問題就是除錯,因為並沒有像vc那樣方便的整合的除錯環境。ns與網路模擬 的書中介紹了tcl debug和kdevelop除錯的方法,這裡主要介紹gdb除錯的方法。因為偶個人第一次寫ns 除錯用的就是gdb,感覺安裝使用都很方便,這裡簡單介紹一下 2.修改mak...

利用Qemu搭建核心除錯環境

一 核心除錯的原理 傳統除錯核心需要配置兩台linux主機,其中一台主機稱為開發機,另一台主機稱為目標機。開發機中除了有乙個可執行的linux環境,還應包含必要的開發環境 gcc gdb make等 以及核心原始碼,目標機則需要能夠啟動核心並掛載乙個有效的檔案系統,可以將執行在目標機中待除錯核心稱為...