我正试图从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(继续),它没有击中断点。
我做错了什么?
由于
答案 0 :(得分:0)
您应该使用硬件断点而不是软件断点。
您可以使用hbreak
插入硬件断点。 hbreak
和break
具有相似的用法。此外,您可以使用help hbreak
来显示更多信息。
我想软件断点无效的原因是,在继续QEMU后加载内核映像时,软件断点插入的INT3
指令会被覆盖。
但是由于处理器模式的改变会出现一些麻烦。 This提供了一些有用的答案。
答案 1 :(得分:0)
尝试禁用CONFIG_DEBUG_RODATA和CONFIG_RANDOMIZE_BASE。