亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8337 | 回復: 17
打印 上一主題 下一主題

使用GDB與QEMU調試內核時的問題分析 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-02-19 13:42 |只看該作者 |倒序瀏覽
使用QEMU+GDB能夠實現(xiàn)源代碼級的內核調試,但是,存在一個問
題──當內核允許中斷時,單步命令(n與s)會進入時鐘中斷。通過
瀏覽QEMU的源代碼,大體把原因找了出來。 單步命令(n與s)在
gdb遠程調試通訊協(xié)議中是s(參看info gdb),qemu的gdb stub
在受到s命令后將虛擬CPU進入單步狀態(tài),但是在接收到s命令前,
qemu的虛擬CPU是停止的(在等待gdb的命令),注意,這個時
候,虛擬時鐘計時并沒有停止,所以,很可能在qemu的虛擬CPU還
沒開始的時候就需要觸發(fā)時鐘中斷了,但是虛擬CPU還在停止狀態(tài),
中斷無法觸發(fā)。接收到s命令后,虛擬CPU開始執(zhí)行指令。這時,如
果內核允許中斷,虛擬時鐘就將觸發(fā)中斷,所以s命令執(zhí)行一條指令
后停止在時鐘中斷處理程序的開始處,而不是希望的函數(shù)中下一條指
令處。

  現(xiàn)在看一下問題的解決方法。在我看來,需要修改gdb遠程調試內核
時單步命令的語義。有兩個方向。
1.在gdb上修改。在處理用戶的n與s命令時不是發(fā)送協(xié)議中的s命令,
而是分兩步。首先確定下一條指令的開始位置(或者下一行源程序對應
的指令的開始位置)。對于有些RISC機器機器指令固定為某個長度,那
么確定這個位置比較簡單,但是對于像x86這樣的變長指令的體系結構
就需要稍微麻煩一點(需要確定當前指令的長度等)。然后假如第一步
確定的地址是naddr,F(xiàn)在像處理用戶的tbreak *naddr一樣處理就可
以了,接著發(fā)送繼續(xù)運行命令c就可以了。
2.在qemu的gdb stub上修改協(xié)議命令s的處理方法。接收到s命令后
不是讓虛擬CPU進入單步執(zhí)行狀態(tài),而是確定在沒有中斷的情況下,下
一條指令的位置(注意對于當前是跳轉指令的情況處理比較復雜),然
后在這個位置設置臨時斷點,在虛擬CPU到達這個斷點進入gdb stub
后立即將其取消。

這兩種處理方法中,我認為1比較好,實現(xiàn)起來清晰明了,但是需要對
gdb的代碼比較熟悉。2方法比較復雜,尤其是在當前指令是跳轉指令
時,不太容易確定臨時斷點的位置。

另外作為暫時的權宜之計,我們可以只使用tbreak +offset來代替n
與s命令。

原來的patch在Linux下沒有作用,我因為最近才調試Linux內核才發(fā)現(xiàn)。
下面的patch已經完全可以用了。調試Linux kernel不會再進入中斷了。

[ 本帖最后由 mingyanguo 于 2006-4-17 15:08 編輯 ]

qemupatch.tar.gz

1.55 KB, 下載次數(shù): 139

論壇徽章:
0
2 [報告]
發(fā)表于 2006-02-19 15:22 |只看該作者
兄弟, 這個確實有價值研究一下, xfocus的watercloud和alert7都在使用qemu時遭遇這個問題, 最后向郵件列表發(fā)送了BUG Report了事…我則是干脆放棄qemu了……

論壇徽章:
0
3 [報告]
發(fā)表于 2006-02-19 16:09 |只看該作者
原帖由 albcamus 于 2006-2-19 15:22 發(fā)表
兄弟, 這個確實有價值研究一下, xfocus的watercloud和alert7都在使用qemu時遭遇這個問題, 最后向郵件列表發(fā)送了BUG Report了事…我則是干脆放棄qemu了……

以我現(xiàn)在的理解,感覺不是qemu的問題,而且在qemu的gdb stub中
修改的話,感覺不怎么優(yōu)雅而且麻煩。等等先看看gdb的代碼吧,如果
能修改一下的話,改改試試。

論壇徽章:
0
4 [報告]
發(fā)表于 2006-02-20 13:07 |只看該作者
mingyanguo兄, 仔細看了文章, 覺得還是在qemu上修改比較好; qemu最大的優(yōu)點之一是提供了一個gdb server, 倘使改動gdb的話, 一則gdb太過復雜(不知道跟qemu比起來如何), 二則好象也是破壞了這個特性。
這個問題我也很感興趣,你能留個MSN或者Email,我們聯(lián)系一下嗎?

論壇徽章:
0
5 [報告]
發(fā)表于 2006-02-20 14:32 |只看該作者
非常感謝。!

有個好的調試工具太重要了。

論壇徽章:
0
6 [報告]
發(fā)表于 2006-02-20 14:44 |只看該作者
原帖由 guotie 于 2006-2-20 14:32 發(fā)表
非常感謝!。

有個好的調試工具太重要了。

汗~期望值太高容易失望的! 我們也不是高手, 只是往里鉆鉆看而已呀

論壇徽章:
0
7 [報告]
發(fā)表于 2006-02-20 15:30 |只看該作者
原帖由 albcamus 于 2006-2-20 13:07 發(fā)表
mingyanguo兄, 仔細看了文章, 覺得還是在qemu上修改比較好; qemu最大的優(yōu)點之一是提供了一個gdb server, 倘使改動gdb的話, 一則gdb太過復雜(不知道跟qemu比起來如何), 二則好象也是破壞了這個特性。
這個 ...

不要那么客氣,我沒你大,應該我稱呼你兄才是。

我得mail guomingyan At gmail.com
MSN也不穩(wěn)定,經常沒法用。

GDB確實太大了,現(xiàn)在還沒找到頭緒那。其實,在GDB上改的話,可以新加個命令,保留原來的n,s。
QEMU規(guī)模要比GDB小吧(瀏覽了一點,感覺而已)。
QEMU上改的話,我又想了個思路就是在虛擬CPU因為debug停止的時候讓虛擬時鐘也停止計數(shù),這樣虛擬CPU再次運行的時候,虛擬時鐘中斷就不會立即觸發(fā)了。

論壇徽章:
0
8 [報告]
發(fā)表于 2006-02-22 21:26 |只看該作者

一個簡單的解決方法

通過對qemu的源代碼進行簡單的修改,找到了一個絕大部分時候可行的解決方法(我實驗時很少跟進中斷)──在gdb單步執(zhí)行的時候禁止所有的虛擬中斷。

修改的地方很少,我是對qemu-snapshot-2005-07-17_23版本在打了FreeBSD ports的補丁的基礎上修改的。0.8的版本應該差不多。
可是說修改很無關大局。
下面是修改

XXX============================XXXXXXX


--- /home/prime/gdbstub.c       Wed Feb 22 21:15:05 2006
+++ gdbstub.c   Sun Jul  3 04:59:33 2005
@@ -45,7 +45,7 @@
};
/* XXX: This is not thread safe.  Do we care?  */
static int gdbserver_fd = -1;
-int    gdbstep;
+
typedef struct GDBState {
     enum RSState state; /* parsing state */
     int fd;
@@ -444,7 +444,6 @@
#ifdef DEBUG_GDB
     printf("command='%s'\n", line_buf);
#endif
-    gdbstep = 1;
     p = line_buf;
     ch = *p++;
     switch(ch) {
@@ -470,7 +469,6 @@
#else
         vm_start();
#endif
-       gdbstep = 0;
        return RS_IDLE;
     case 's':
         if (*p != '\0') {
@@ -721,7 +719,6 @@
         qemu_del_fd_read_handler(s->fd);
         qemu_free(s);
         vm_start();
-       gdbstep = 0;
     } else {
         for(i = 0; i < size; i++)
             gdb_read_byte(s, cpu_single_env, buf[i]);

XXXXX=============================================XXXXXXX
--- /home/prime/gdbstub.h       Wed Feb 22 21:15:05 2006
+++ gdbstub.h   Wed Apr 27 04:42:36 2005
@@ -8,5 +8,5 @@
void gdb_exit(CPUState *, int);
#endif
int gdbserver_start(int);
-extern int     gdbstep;
+
#endif
XXXX================================================XXXXXX
--- vl.c        Wed Feb 22 21:14:14 2006
+++ /home/prime/vl.c    Wed Feb 22 21:19:52 2006
@@ -871,9 +871,12 @@
         last_clock = ti;
     }
#endif
-    if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
-                           qemu_get_clock(vm_clock)) ||
-        qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
+    if ((qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
+                           qemu_get_clock(vm_clock))
+#ifdef CONFIG_GDBSTUB
+                           &&(gdbstep == 0)
+#endif
+       )||qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
                            qemu_get_clock(rt_clock))) {
         /* stop the cpu because a timer occured */
         cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
@@ -2818,6 +2821,9 @@
#endif

         if (vm_running) {
+#ifdef CONFIG_GDBSTUB
+               if(gdbstep == 0)
+#endif
             qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
                             qemu_get_clock(vm_clock));
             /* run dma transfers, if any */

論壇徽章:
0
9 [報告]
發(fā)表于 2006-02-23 09:22 |只看該作者
我沒有FreeBSD環(huán)境, 你加入qemu的mailing list了嗎? CLF有幾個人一直在用qemu也許可以討論下。
這么強的貼子, 先加為精華

論壇徽章:
0
10 [報告]
發(fā)表于 2006-02-23 12:11 |只看該作者
原帖由 albcamus 于 2006-2-23 09:22 發(fā)表
我沒有FreeBSD環(huán)境, 你加入qemu的mailing list了嗎? CLF有幾個人一直在用qemu也許可以討論下。
這么強的貼子, 先加為精華

mailing list的鏈接前幾天我打不開
正在試著加入呢。
其實這個改動很小,與FreeBSD的ports的補丁不相干。

[ 本帖最后由 mingyanguo 于 2006-2-23 12:25 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP