2017-03-01 38 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给出了一些有用的答案。