调试linux内核4.10时{g}中的问号符号

时间:2017-03-01 05:10:53

标签: debugging linux-kernel remote-debugging

我正试图从linux内核中的函数start_kernel()调试linux内核。

这基本上就是我所做的

从kernel.org下载4.10的内核源代码 提取源后:

  
    

make menuconfig:更改了内核调试的设置

         

make -j4:编译内核

  

简单地发出没有任何FS的命令

  

qemu-system-x86_64 -kernel linux-4.10 / arch / x86 / boot / bzImage -append root = / dev / zero -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(继续),它没有击中断点。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:0)

您应该使用硬件断点而不是软件断点。

您可以使用hbreak插入硬件断点。 hbreakbreak具有相似的用法。此外,您可以使用help hbreak来显示更多信息。

我想软件断点无效的原因是,在继续QEMU后加载内核映像时,软件断点插入的INT3指令会被覆盖。

但是由于处理器模式的改变会出现一些麻烦。 This提供了一些有用的答案。

答案 1 :(得分:0)

尝试禁用CONFIG_DEBUG_RODATA和CONFIG_RANDOMIZE_BASE。