在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