【问题标题】:Question mark symbols in gdb while debugging linux kernel 4.10调试linux内核4.10时gdb中的问号符号
【发布时间】:2017-07-20 07:19:51
【问题描述】:

我正在尝试直接从 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 qem 应该停止了:

接下来在另一个终端,我启动了 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

0xc1ba986e 处的断点 1:文件 init/main.c,第 483 行。

然后我按 c(继续),它没有达到断点。

我做错了什么?

谢谢

【问题讨论】:

    标签: debugging linux-kernel remote-debugging


    【解决方案1】:

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

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

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

    但是会因为处理器模式的改变而出现一些麻烦。 This 给出了一些有用的答案。

    【讨论】:

      【解决方案2】:

      尝试禁用 CONFIG_DEBUG_RODATA 和 CONFIG_RANDOMIZE_BASE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 2019-09-30
        • 1970-01-01
        • 2021-01-16
        • 2020-03-14
        • 1970-01-01
        • 2012-04-21
        相关资源
        最近更新 更多