高级操作系统实验-1-使用gdb调试qume

查看run脚本

cat run

高级操作系统实验-1-使用gdb调试qume_第1张图片

 

 可以看到,使用的内核为: qemu-system-i386 -nographic -kernel $LINUX/arch/i386/boot/bzImage,使用的硬盘为:-initrd rootfs/rootfs.img.gz

如果在启动时加“-s”可以启动调试模式

 

运行run,进入虚拟机

./run

(退出qume虚拟机:reboot -f)

查看bin文件,如下图,可以看到,只有busybox是有效的二进制可执行文件,其他的都是对busybox的符号链接。

 busybox在执行的时候,敲任何命令,结果都是在执行busybox。

高级操作系统实验-1-使用gdb调试qume_第2张图片

 

 高级操作系统实验-1-使用gdb调试qume_第3张图片

 

 

退出虚拟机,用调试模式重新打开

高级操作系统实验-1-使用gdb调试qume_第4张图片

 

 

再建一个终端操作。

建立符号链接cur指向ubuntu中的内核源码,并查看内核根目录。就不用把大文件放到虚拟机了,速度会受影响。

高级操作系统实验-1-使用gdb调试qume_第5张图片

 

 

左边启动虚拟机,等待调试。右边打开gdb调试器,从内核源码里面读取符号。

高级操作系统实验-1-使用gdb调试qume_第6张图片

 

 

 用gdb连接到qume虚拟机。

target remote localhost:1234

高级操作系统实验-1-使用gdb调试qume_第7张图片

 

 

把busybox可执行文件读进来,后面是起始地址。

高级操作系统实验-1-使用gdb调试qume_第8张图片

 

 

加断点,这是执行命令解释器时候的入口。

ash_main

再加ls命令的断点。如下图

高级操作系统实验-1-使用gdb调试qume_第9张图片

 

 

右侧执行c,左侧即开始运行

高级操作系统实验-1-使用gdb调试qume_第10张图片

 

 

显示当前进程的进程号

display   $lx_current().pid

高级操作系统实验-1-使用gdb调试qume_第11张图片

 

 查看当前进程是由哪个可执行文件引发的。

高级操作系统实验-1-使用gdb调试qume_第12张图片

 

 

继续执行,看到964号进程又执行了命令解释器。可见,启动过程中,ash_main执行了两次,在两个进程中运行的。

高级操作系统实验-1-使用gdb调试qume_第13张图片

 

 

用strace查看ls执行的系统调用,新开一个终端。

高级操作系统实验-1-使用gdb调试qume_第14张图片

 

 

上面是Ubuntu下执行的系统调用,那么虚拟机的呢,内核版本不一样,故执行的系统调用也不一样。

在系统调用的总控函数位置设置一个断点。b entry_SYSENTER_32

系统调用的实现函数进行跳转的时候,看看是哪个系统调用,也设一个断点

高级操作系统实验-1-使用gdb调试qume_第15张图片

 

 

跳转到系统调用实现函数的数组,包含的是系统调用实现函数的入口地址,所以只需要往前走一步,s,就会进入到相应的实现函数,可以看到,第一个实现函数是time

高级操作系统实验-1-使用gdb调试qume_第16张图片

 

继续执行,走一步到主控函数的入口,再走一步到跳转,再单步执行,重新回到系统调用实现函数。如下图

高级操作系统实验-1-使用gdb调试qume_第17张图片

 

 

退出调试,先kill,再quit

 高级操作系统实验-1-使用gdb调试qume_第18张图片

 

你可能感兴趣的:(高级操作系统实验-1-使用gdb调试qume)