yale_OS(2)——OS-xv6的源代码的调试
来源:互联网 发布:用python进行量化分析 编辑:程序博客网 时间:2024/05/01 04:03
xv6源代码的调试(源代码的下载,编译,运行如:yale_OS(1)——OS-xv6的源代码的下载,编译和运行所示)
在QEMU下远程调试xv6.(学习课程地址如下:http://zoo.cs.yale.edu/classes/cs422/2011/lec/l2-hw)
1.打开一个终端,进入xv6目录下,运行如下命令:make qemu-gdb
此时qemu进入等待状态,如下:
administrator@ubuntu:~/xv6$ make qemu-gdb
*** Now run 'gdb'.
qemu -serial mon:stdio -hdb fs.img xv6.img -smp 2 -S -gdb tcp::26000
等待gdb远程连接到该qemu.
2.然后打开另一个终端,进入相同的目录,运行如下命令:gdb kernel
此时进入了调试状态,如下:
administrator@ubuntu:~/xv6$ gdb kernel
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/administrator/xv6/kernel...done.
+ target remote localhost:26000
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()
+ symbol-file kernel
(gdb)
3.一旦GDB成功连接上QEMU的远程调试,它将会显示远程的QEMU程序停在何处。
如下所示:
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()
4.在exec处设置断点,命令如下:b exec
5.然后继续运行,继续的命令如下:c
运行结果如下:
(gdb) c
Continuing.
[New Thread 2]
[Switching to Thread 2]
The target architecture is assumed to be i386
=> 0x100930 <exec>: push %ebp
Breakpoint 1, exec (path=0x1c "/init", argv=0xff1ee4) at exec.c:11
11 {
(gdb)
在此处,机器正运行在32bit模式下,xv6已经进行了自身的初始化,其将加载和运行它的第一个用户模式下的进程——/init程序,
6.然后继续运行,继续的命令如下:c
(gdb) c
Continuing.
[Switching to Thread 1]
=> 0x100930 <exec>: push %ebp
Breakpoint 1, exec (path=0x83c "sh", argv=0xff0ee4) at exec.c:11
11 {
(gdb)
此处第二次调用exec函数,
7.当继续在gdb下敲入命令:c,此时在QEMU下出现等待输入命令状态,此时,在QEMU下输入如下命令:
$ cat README
此处gdb调试终端下出现如下状态:
(gdb) c
Continuing.
[Switching to Thread 2]
=> 0x100930 <exec>: push %ebp
Breakpoint 1, exec (path=0x1460 "cat", argv=0xfe4ee4) at exec.c:11
11 {
(gdb)
通过如下命令来检查exec函数调用时的参数:
1)p argv[0]
结果为:
(gdb) p argv[0]
$1 = 0x1460 "cat"
2)p argv[1]
结果为:
(gdb) p argv[1]
$2 = 0x1464 "README"
3)p argv[2]
结果为:
(gdb) p argv[2]
$3 = 0x0
8.在gdb调试终端下,输入命令:up,可以检查上下文哪个函数调用了exec
如下:
(gdb) up
#1 0x001041a8 in sys_exec () at sysfile.c:366
366 return exec(path, argv);
(gdb) up
#2 0x00103f86 in syscall () at syscall.c:133
133 proc->tf->eax = syscalls[num]();
(gdb) up
#3 0x00104e2d in trap (tf=0xfe4fb4) at trap.c:41
41 syscall();
9.使用gdb中的list或l命令,可以查看当下调用exec函数的上下文的源代码。
在QEMU下远程调试xv6.(学习课程地址如下:http://zoo.cs.yale.edu/classes/cs422/2011/lec/l2-hw)
1.打开一个终端,进入xv6目录下,运行如下命令:make qemu-gdb
此时qemu进入等待状态,如下:
administrator@ubuntu:~/xv6$ make qemu-gdb
*** Now run 'gdb'.
qemu -serial mon:stdio -hdb fs.img xv6.img -smp 2 -S -gdb tcp::26000
等待gdb远程连接到该qemu.
2.然后打开另一个终端,进入相同的目录,运行如下命令:gdb kernel
此时进入了调试状态,如下:
administrator@ubuntu:~/xv6$ gdb kernel
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/administrator/xv6/kernel...done.
+ target remote localhost:26000
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()
+ symbol-file kernel
(gdb)
3.一旦GDB成功连接上QEMU的远程调试,它将会显示远程的QEMU程序停在何处。
如下所示:
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()
4.在exec处设置断点,命令如下:b exec
5.然后继续运行,继续的命令如下:c
运行结果如下:
(gdb) c
Continuing.
[New Thread 2]
[Switching to Thread 2]
The target architecture is assumed to be i386
=> 0x100930 <exec>: push %ebp
Breakpoint 1, exec (path=0x1c "/init", argv=0xff1ee4) at exec.c:11
11 {
(gdb)
在此处,机器正运行在32bit模式下,xv6已经进行了自身的初始化,其将加载和运行它的第一个用户模式下的进程——/init程序,
6.然后继续运行,继续的命令如下:c
(gdb) c
Continuing.
[Switching to Thread 1]
=> 0x100930 <exec>: push %ebp
Breakpoint 1, exec (path=0x83c "sh", argv=0xff0ee4) at exec.c:11
11 {
(gdb)
此处第二次调用exec函数,
7.当继续在gdb下敲入命令:c,此时在QEMU下出现等待输入命令状态,此时,在QEMU下输入如下命令:
$ cat README
此处gdb调试终端下出现如下状态:
(gdb) c
Continuing.
[Switching to Thread 2]
=> 0x100930 <exec>: push %ebp
Breakpoint 1, exec (path=0x1460 "cat", argv=0xfe4ee4) at exec.c:11
11 {
(gdb)
通过如下命令来检查exec函数调用时的参数:
1)p argv[0]
结果为:
(gdb) p argv[0]
$1 = 0x1460 "cat"
2)p argv[1]
结果为:
(gdb) p argv[1]
$2 = 0x1464 "README"
3)p argv[2]
结果为:
(gdb) p argv[2]
$3 = 0x0
8.在gdb调试终端下,输入命令:up,可以检查上下文哪个函数调用了exec
如下:
(gdb) up
#1 0x001041a8 in sys_exec () at sysfile.c:366
366 return exec(path, argv);
(gdb) up
#2 0x00103f86 in syscall () at syscall.c:133
133 proc->tf->eax = syscalls[num]();
(gdb) up
#3 0x00104e2d in trap (tf=0xfe4fb4) at trap.c:41
41 syscall();
9.使用gdb中的list或l命令,可以查看当下调用exec函数的上下文的源代码。
- yale_OS(2)——OS-xv6的源代码的调试
- yale_OS(1)——OS-xv6的源代码的下载,编译和运行
- yale_OS(6)——xv6中boot loader的学习
- yale_OS(7)——xv6中的文件系统(File System)
- xv6的main.c源代码
- yale_OS(5)——BIOS提供的服务
- xv6的buddy系统的源代码
- yale_OS(4)——Intel IA32架构CPU的汇编编程
- xv6的buddy(伙伴)系统源代码之buddy.h
- xv6的interrupt实验 trapasm.S源代码分析
- yale_OS(3)——Intel IA32架构
- xv6的main.c
- xv6的中断分析
- xv6—cha 0
- xv6对硬盘的操作
- [OS] Xv6 System Calls
- [OS] Xv6 CPU Alarm
- xv6 Shell & OS organization
- 写注释
- JVM内存模型及垃圾收集简介
- VC访问数据库程序 在编译器中执行正确 debug文件时无法访问数据库 提示“对象关闭时,无法访问数据库”
- Java像素级的操作
- 左式堆的实现
- yale_OS(2)——OS-xv6的源代码的调试
- 【小李木耳】2012年5月高兴事:哈尔滨集散中心成立、商标正式申请!
- 环境变量,include搜索路径,lib库搜索路径
- java用enum实现singleton的方法
- poj 1001 java大数类
- javascript Math 对象介绍
- javascript Date 对象介绍
- Java项目经验——程序员成长的关键
- javascript Array 对细介绍