1. 程式人生 > >在vmware中用kdb除錯linux核心和模組

在vmware中用kdb除錯linux核心和模組

環境:

vmware:6.0.7

Ubuntu:12.04 LTS

Linux kernel:4.3

KDB的工作原理是把kernel停下來,然後等待命令輸入,命令可以來自串列埠或鍵盤。輸出是到串列埠和console,但console上的輸出只能在退出KDB之後才能看到。

1.需要開啟Linux kernel 的KDB選項,編譯,安裝,重啟。Linux kernel 4.3 自帶有KGDB和KDB。 實際上KDB是KGDB的一個子集。


2.在vmware的虛擬機器上新增串列埠。


3.在host windows上安裝PuTTY。


4.在Linux上配置KGDBOC的引數, 然後觸發KDB。

4.1 鍵盤輸入,沒有串列埠輸出。如下圖:

當輸入“echo g > /proc/sysrq-trigger"後, 沒有顯示,就像宕機一樣。但如果輸入”go”並回車,那麼你就能退出KDB並看到KDB的輸出。

4.2 串列埠輸入輸出,如下圖:


左邊是PuTTY,右邊是Linux。 當觸發KDB後,KDB輸出到PuTTY,並且可以在PuTTY上輸入。當go退出KDB後,右邊的Linux則會顯示左邊一樣的內容。

4.3 串列埠輸出,鍵盤輸入。如下圖:


同樣左邊是PuTTY,右邊是Linux。 不同於4.2的是,輸入在Linux這一側,而串列埠只輸出。

問題1.為什麼要串列埠?

因為進入KDB後kernel已經停止,輸出到console( VT )的東西都已經沒辦法顯示(可以讀tty下VT的程式碼)。所以需要輸出到串列埠。

程式碼瀏覽:

static struct kgdb_io kgdboc_io_ops = {
	.name			= "kgdboc",
	.read_char		= kgdboc_get_char,
	.write_char		= kgdboc_put_char,
	.pre_exception		= kgdboc_pre_exp_handler,
	.post_exception		= kgdboc_post_exp_handler,
};
首先看看這個結構體,這個結構體會被註冊到 dbg_io_ops上。

下面這個函式就是KDB的輸出函式。

int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap)
{
/*remove other code*/	
kdb_printit:

	/*
	 * Write to all consoles.
	 */
	retlen = strlen(kdb_buffer);
	cp = (char *) printk_skip_level(kdb_buffer);
	if (!dbg_kdb_mode && kgdb_connected) {
		gdbstub_msg_write(cp, retlen - (cp - kdb_buffer));
	} else {
		if (dbg_io_ops && !dbg_io_ops->is_console) {
			len = retlen - (cp - kdb_buffer);
			cp2 = cp;
			while (len--) {
				dbg_io_ops->write_char(*cp2); //輸出到串列埠
				cp2++;
			}
		}
		while (c) {
			c->write(c, cp, retlen - (cp - kdb_buffer)); //輸出到console,退出KDB後可以看到
			touch_nmi_watchdog();
			c = c->next;
		}
	}
/*remove other code*/
}


下面看看kgdboc_io_ops的write_char函式。

static void kgdboc_put_char(u8 chr)
{
	if (!kgdb_tty_driver)
		return;
	kgdb_tty_driver->ops->poll_put_char(kgdb_tty_driver,
					kgdb_tty_line, chr);
}
原來是呼叫kgdb_tty_driver的poll_put_char()函式。 kgdb_tty_driver是怎麼得到的呢?要看configure_kgdboc()了,如下。
static int configure_kgdboc(void)
{
	struct tty_driver *p;
	int tty_line = 0;
	int err;
	char *cptr = config;
	struct console *cons;

	err = kgdboc_option_setup(config);
	if (err || !strlen(config) || isspace(config[0]))
		goto noconfig;

	err = -ENODEV;
	kgdboc_io_ops.is_console = 0;
	kgdb_tty_driver = NULL;

	kgdboc_use_kms = 0;
	if (strncmp(cptr, "kms,", 4) == 0) {
		cptr += 4;
		kgdboc_use_kms = 1;
	}

	if (kgdboc_register_kbd(&cptr))   //這裡就是KDB從鍵盤取輸入的配置地方。
		goto do_register;

	p = tty_find_polling_driver(cptr, &tty_line); //在tty驅動佇列裡查詢配置給KDB的tty,本例子中是ttyS1。
	if (!p)
		goto noconfig;

	cons = console_drivers;
	while (cons) {
		int idx;
		if (cons->device && cons->device(cons, &idx) == p &&
		    idx == tty_line) {
			kgdboc_io_ops.is_console = 1;
			break;
		}
		cons = cons->next;
	}

	kgdb_tty_driver = p; //這裡就是怎麼得到kgdb_tty_driver的地方。
	kgdb_tty_line = tty_line;

do_register:
	err = kgdb_register_io_module(&kgdboc_io_ops);//dbg_io_ops = kgdboc_io_ops 的地方。
	if (err)
		goto noconfig;

	err = kgdb_register_nmi_console();
	if (err)
		goto nmi_con_failed;

	configured = 1;

	return 0;

nmi_con_failed:
	kgdb_unregister_io_module(&kgdboc_io_ops);
noconfig:
	kgdboc_unregister_kbd();
	config[0] = 0;
	configured = 0;
	cleanup_kgdboc();

	return err;
}




相關推薦

vmware中用kdb除錯linux核心模組

環境: vmware:6.0.7 Ubuntu:12.04 LTS Linux kernel:4.3 KDB的工作原理是把kernel停下來,然後等待命令輸入,命令可以來自串列埠或鍵盤。輸出是到串列埠和console,但console上的輸出只能在退出KDB之後才能看到。

使用 ftrace 除錯 Linux 核心,第 1 部分-debugfs掛載除錯介面

ftrace 是內建於 Linux 核心的跟蹤工具,從 2.6.27 開始加入主流核心。使用 ftrace 可以除錯或者分析核心中發生的事情。ftrace 提供了不同的跟蹤器,以用於不同的場合,比如跟蹤核心函式呼叫、對上下文切換進行跟蹤、檢視中斷被關閉的時長、跟蹤核心態中的延遲以及效能問題等。系統開發人員

Vmware+gdb除錯Linux核心——工欲善其事,必先利其器

今天我終於忍受不了qemu的低速跟不可理喻的各種bug,開始尋找新的除錯核心的方法。然後想到了Vmware,那麼成熟的虛擬機器怎麼可能除錯不了核心。於是嘗試了一番,發現結果非常的棒!所以立馬奮筆疾書,把這個方法記錄下來。          我們這裡主要分成幾個步驟:    

利用eclipse + qemu| Vmware + gdb 除錯linux核心

      繼續回到eclipse中,這時候我們在選單中選擇Run -> Debug Configurations ,這時候開啟一個配置頁面。然後我們在C/C++ Application上雙擊滑鼠,這時在右側的頁面彈出了debug配置選項,然後我們在project一欄選擇 linux-kernel ,在

使用systemtap除錯Linux核心

最近在公司看Linux核心的nmi死鎖檢測功能的實現機制,當然,是因為它變了,所以我才看的,簡單來說就是在紅帽的某牛提交了一個核心patch:new nmi_watchdog using perf events,這個patch已經被合入到核心主線2.6.38版本,所以使用自該版本開始後核心的

使用gdb除錯linux核心

使用Gdb+qemu除錯核心: 我們除錯核心需要一個叫qemu的虛擬機器,qemu虛擬的一個好處便是可以讓cpu處於凍結狀態,從而讓作業系統處於暫停狀態,這樣我們才能很方便的除錯核心。首先使用qemu安裝一個作業系統,再將該作業系統的核心換成我們要除錯的。 安裝qemu

嵌入式linux 核心根檔案系統燒寫方式簡介

總體來說,嵌入式Linux核心和根檔案的引導與PC機差不多。嵌入式linux核心和根檔案系統可以存放在各種可能的儲存裝置中,一般情況下我們將核心和根檔案系統直接燒入到Flash中(包括NOR和NAND flash),這種方法的缺點是在核心和根檔案系統出現修改時我們就不得不得

在android模擬器中用gdb除錯linux kernel

首先需要建一個gdb.cmd裡邊存放一些初始化的命令: vim gdb.cmd set solib-absolute-prefix <linux kernel source path> target remote :1234 b start_kernel

Linux核心一個模組調另一個模組的函式

  前幾天,需要在一個核心模組A中新增一個新功能。這個新功能用到了另一個核心模組B中的函式C。我將相關的標頭檔案include之後,載入A模組時,總是出錯,說用到的那個函式C找不著。   怎麼回事?以前沒接觸過核心程式設計的,找了個小牛問了一下,原來是Linux2.6核心不

為什麼嵌入式LINUX核心根檔案系統分開存放

http://wxqxq520.blog.sohu.com/164207588.html  Flash 的分割槽可以根據需要劃分,uClinux 中支援Flash 儲存器的塊裝置驅動負責定義上述的分割槽。和PC 機下的Linux 不同,Flash 的分割槽把系統核心檔案

Qemu除錯Linux核心

Qemu是很有名的ARM虛擬程式,可以在Qemu中執行除錯ARM平臺Linux核心。編譯Qemu,Linux核心,busybox的環境是安裝ubuntu 10.4系統的virtualbox。  在安裝完ubuntu 10.4之後,最好先準備一下編譯環境。  首先需要安裝

ubuntu14.04下qemu除錯linux核心

if (buf_len > 2 * rsa->sizeof_g_packet) { rsa->sizeof_g_packet = buf_len ; for (i = 0; i < gdbarch_num_regs (gdbarch); i++)

QEMU+gdb除錯Linux核心全過程

1、編譯原始碼(Linux kernel 4.6.2) make menuconfig 執行make menuconfig時報錯缺少庫檔案 需要安裝依賴庫 sudo apt-get install aptitude sudo aptitude i

除錯linux核心環境搭建方法(ddd+busybox+qemu+linux3.5.4核心

環境搭建 1.1.準備工作 (1).qemu虛擬機器 (2).busybox軟體 (3).linux-3.5.4核心 (4).ddd 除錯工具(終端中輸入 sudo apt-get install ddd 安裝) 1.2.編譯核心 (1)建立工作目錄:mkdir -p ~

香橙派PC筆記-05-編譯linux核心UVC攝像頭驅動筆記

香橙派PC筆記-05-編譯linux核心和UVC攝像頭驅動筆記 我的筆記和資料全共享在雲盤: 沒有密碼,歡迎下載~~~~~~ 材料: 香橙派:orangepi PC TF卡:用原來的三星8G CLASS 10 TF卡裝LUBUNTU 電源介面卡:1A的帶

gdb除錯Linux核心

原理: gdb可以支援遠端的除錯,串列埠連線和tpc/ip網路連結兩種。 在Ubuntu 9.10Linux下面,virtualbox 作為虛擬機器,裝有待除錯的Linux系統。a.建立連結。 這裡選擇串列埠方式除錯。在virtualbox的虛擬機器配置中,把串列埠設

linux工具---用qemu除錯linux核心

一.qemu模擬x861.1 qemu的安裝        ubuntu 12.04下安裝qemu很簡單,         sudo apt-get install qemu1.2 linux核心的編譯    www.kernel.org 下載核心, 以linux-3.0.1為例    [email 

linux核心netfilter模組分析之:HOOKs點的註冊及呼叫

-1: 為什麼要寫這個東西?最近在找工作,之前netfilter 這一塊的程式碼也認真地研究過,應該每個人都是這樣的你懂 不一定你能很準確的表達出來。 故一定要化些時間把這相關的東西總結一下。 0:相

linux下qemu除錯linux核心

編譯核心 下載kernel原始碼 git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git cd linux-stable/ -配置核心 mak

NumPy Essentials 帶註釋原始碼 四、NumPy 核心模組

# 來源:NumPy Essentials ch4 步長 # 步長是每個維度相鄰兩個元素的偏移差值 import numpy as np x = np.arange(8, dtype = np.i