【zz】使用Bochs和GDB对内核进行源代码级调试

简介: 使用Bochs和GDB对内核进行源代码级调试Written by YY   Wednesday, 21 April 2010 12:49http://osfromscratch.
使用Bochs和GDB对内核进行源代码级调试
Written by YY   
Wednesday, 21 April 2010 12:49
1. 安装 Bochs

编译 Bochs 要加入 --enable-gdb-stub 选项:

$ ./configure --enable-gdb-stub $ make $ sudo make install
2. 生成内核
修改 Makefile
  1. 将 CFLAGS 加入 -g 选项,以便加入调试符号

    CFLAGS = -I include/ -I include/sys/ -c -g -fno-builtin -Wall
  2. 由于加了调试符号之后 kernel.bin 太大,所以将其 strip 之后在拷贝入磁盘映像

    sudo cp -fv kernel.bin /mnt/floppy

    改为:

    strip kernel.bin -o kernel.bin.stripped sudo cp -fv kernel.bin.stripped /mnt/floppy/kernel.bin

    如此一来,在 bochs 虚拟机里面执行的 kernel.bin 是 strip 之后的,过会儿用来交给 gdb 的 kernel.bin 是带调试符号的。

编译内核

$ make image

3. 启动 Orange'S
修改 bochsrc

加入这么一行:

gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
运行
$ bochs -q -f bochsrc.gdb # 注意必须用加入了 --enable-gdb-stub 编译选项的 bochs
4. 用 gdb 调试

打开另一控制台,运行 gdb

$ gdb
在 gdb 中调试
(gdb) file kernel.bin ← 注意这里的 kernel.bin 必须是加入了 -g 编译选项的带调试符号的内核 Reading symbols from /home/forrest/local/src/osfs/oranges/phases/chapter11/a/kernel.bin...done. (gdb) target remote localhost:1234 Remote debugging using localhost:1234 0x0000fff0 in ?? () (gdb) b start.c:26 Breakpoint 1 at 0x14a6: file kernel/start.c, line 26. (gdb) c Continuing. Breakpoint 1, cstart () at kernel/start.c:26 26 disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----\"cstart\" begins-----\n"); (gdb) n 29 memcpy( &gdt, /* New GDT */ (gdb)
.gdbinit

由于每次都需要执行 file kernel.bin 和 target remote localhost:1234 两个命令,所以可以建立一个 .gdbinit 文件,比如:

$ vi .gdbinit file kernel.bin target remote localhost:1234 set disassembly-flavor intel b start.c:26 b kernel/main.c:183

这样下次直接执行 gdb 这个文件里的命令即可自动执行。

.gdbinit 可以做许多事,比如上例中就加了俩断点。

在 .gdbinit 中自定义函数

在 .gdbinit 中可添加自定义函数,比如:

define lsproc set $count = 16 set $idx = 0 printf "The first %d TASKS/PROCS:\n",$count while($idx 这样在 gdb 中执行一个 lsproc,便可打印出所有进程的信息,巨方便:(gdb) lsproc The first 16 TASKS/PROCS: [ 0] TASK: TTY p_flags: 4h [ 1] TASK: SYS p_flags: 4h [ 2] TASK: HD p_flags: 4h [ 3] TASK: FS p_flags: 4h [ 4] TASK: MM p_flags: 4h [ 5] PROC: INIT p_flags: Ch [ 6] PROC: TestA p_flags: 0h [ 7] PROC: TestB p_flags: 0h [ 8] PROC: TestC p_flags: 0h [ 9] PROC: INIT_9 p_flags: 4h [10] PROC: INIT_10 p_flags: 4h

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
67 10
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
112 3
|
4月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
178 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
121 0
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
49 1
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
36 0
|
6月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
6月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
6月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试
|
7月前
|
NoSQL Ubuntu 测试技术
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
99 1