使用Bochs和GDB对内核进行源代码级调试
来源:互联网 发布:数据结构查找算法总结 编辑:程序博客网 时间:2024/05/20 22:36
http://w.osfromscratch.org/articlescn/5-articlecn/16-bochsgdb
1. 安装 Bochs
编译 Bochs 要加入 --enable-gdb-stub 选项:
$ ./configure --enable-gdb-stub$ make$ sudo make install
2. 生成内核
修改 Makefile
将 CFLAGS 加入 -g 选项,以便加入调试符号
CFLAGS = -I include/ -I include/sys/ -c -g -fno-builtin -Wall
由于加了调试符号之后 kernel.bin 太大,所以将其 strip 之后在拷贝入磁盘映像
将
sudo cp -fv kernel.bin /mnt/floppy
改为:
strip kernel.bin -o kernel.bin.strippedsudo 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:1234Remote debugging using localhost:12340x0000fff0 in ?? ()(gdb) b start.c:26Breakpoint 1 at 0x14a6: file kernel/start.c, line 26.(gdb) cContinuing.Breakpoint 1, cstart () at kernel/start.c:2626disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----\"cstart\" begins-----\n");(gdb) n29memcpy(&gdt, /* New GDT */(gdb)
.gdbinit
由于每次都需要执行 file kernel.bin 和 target remote localhost:1234 两个命令,所以可以建立一个 .gdbinit 文件,比如:
$ vi .gdbinitfile kernel.bintarget remote localhost:1234set disassembly-flavor intelb start.c:26b 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 < $count) if(proc_table[$idx].p_flags != 0x20) if($idx < 5)printf "[%2d] TASK: %8s",$idx,proc_table[$idx].nameprintf "\t p_flags: %8Xh\n",proc_table[$idx].p_flags elseprintf "[%2d] PROC: %8s",$idx,proc_table[$idx].nameprintf "\t p_flags: %8Xh\n",proc_table[$idx].p_flags end end set $idx++ endend
这样在 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
- 使用Bochs和GDB对内核进行源代码级调试
- 利用GDB和Bochs调试内核源代码
- 使用bochs对内核进行调试
- 使用bochs和gdb联合调试Linux内核
- 利用GDB和Bochs调试内核源代码 中文版权所有: OldLinux论坛
- fedora17下用gdb和bochs调试linux-0.11内核
- Bochs + GDB 源码级调试C语言内核
- bochs和gdb联合使用调试程序_开始
- gdb和bochs联调linux-0.11内核
- bochs 2.2.6 编译和GDB调试
- 使用virtualbox和gdb调试内核
- bochs+gdb源码级调试Linux 0.12内核测试环境构建
- bochs gdb 联合调试
- 使用gdb进行编译和调试
- 如何使用Eclipse和GDB对JNI代码进行调试(JAVA和C)
- 使用GDB进行调试
- 使用gdb进行调试
- 使用gdb对core dump问题进行调试
- MySQL学习笔记5:修改表(alter table)
- JavaScript Object Notation
- Linux SHELL if 命令参数说明
- 浅析为什么char类型的范围是 —128~+127
- Windows Server 2012无共享存储实现实时迁移
- 使用Bochs和GDB对内核进行源代码级调试
- 1020 小白鼠:哈夫曼树
- 工作6年多的码农ios职位面试总结(续)
- 登录 之 GUI层(续:验证码)
- linux Slob内存管理小析
- perf部署注意事项
- physicsFS for iOS
- C++ Primer第一章学习笔记——C++初邂逅
- expdp ORA-39181:Only Partial Table Data Exported Due To Fine Grain Access Control