2017-03-01 39 views
0

我想從linux內核中的函數start_kernel()調試linux內核。調試linux內核時gdb中的問號符號4.10

這基本上就是我已經做了

從kernel.org 下載4.10內核源提取源後:

make menuconfig後:更改的設置內核調試

make -j4:編譯內核

沒有任何FS

QEMU系統-x86_64的-kernel Linux的4.10 /拱只需發出的命令/ 86 /引導/ bzImage的-append根=的/ dev /零-s -S QEMU的採空因爲它應該:

接着,在另一端,我開始GDB

GDB的vmlinux:和輸出如下

... ...

從vmlinux中讀取符號...完成。

(GDB)目標遠程:使用1234 遠程調試:在?? 1234 0x0000fff0() (GDB)列表

1 /* 
2 * 
3 * Copyright (C) 1991, 1992 Linus Torvalds 
4 * 
5 * Enhanced CPU detection and feature setting code by Mike Jagdis 
6 * and Martin Mares, November 1997. 
7 */ 
8 
9 .text 
10 #include <linux/threads.h> 

這意味着調試符號的存在。 現在,當我使用命令

(GDB)b的start_kernel

斷點1在0xc1ba986e:文件的init/main.c中,線483

我擊中C(繼續) ,它不會達到斷點。

我在做什麼錯?

謝謝

回答

0

您應該使用硬件斷點而不是軟件斷點。

您可以使用hbreak插入硬件斷點。 hbreakbreak有類似的用法。此外,您可以使用help hbreak來顯示更多信息。

我猜測軟件斷點無效的原因是在繼續QEMU後加載內核映像時,會覆蓋由軟件斷點插入的INT3指令。

但是由於處理器模式改變會發生一些麻煩。 This給出了一些有用的答案。