目录
实验目的:
- 了解操作系统开发实验环境
- 熟悉命令行方式的编译、调试工程
- 掌握基于硬件模拟器的调试技术
- 熟悉C语言编程和指针的概念
- 了解X86汇编语言
开始实验:(报告内容主要是一些环境配置步骤)
熟悉命令行方式的编译、调试工程
1.编译——gcc的使用
①编写程序test_gcc.c并gcc编译生成可执行目标文件test_gcc.o
选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。
②最后运行程序test_gcc.o
2.调试——gdb使用
gdb 是功能强大的调试程序,可完成如下的调试任务:
- 设置断点
- 监视程序变量的值
- 程序的单步(step in/step over)执行
- 显示/修改变量的值
- 显示/修改寄存器
- 查看程序的堆栈情况
- 远程调试
- 调试线程
在可以使用 gdb 调试程序之前,必须使用 -g 或 –ggdb编译选项编译源文件。运行 gdb 调试程序时通常使用如下的命令:gdb progname
break FILENAME:NUM | 在特定源文件特定行上设置断点 |
clear FILENAME:NUM | 删除设置在特定源文件特定行上的断点 |
run | 运行调试程序 |
step | 单步执行调试程序,不会直接执行函数 |
next | 单步执行调试程序,会直接执行函数 |
backtrace | 显示所有的调用栈帧。该命令可用来显示函数的调用顺序 |
where continue | 继续执行正在调试的程序 |
display EXPR | 每次程序停止后显示表达式的值,表达式由程序定义的变量组成 |
file FILENAME | 装载指定的可执行文件进行调试 |
help CMDNAME | 显示指定调试命令的帮助信息 |
info break | 显示当前断点列表,包括到达断点处的次数等 |
info files | 显示被调试文件的详细信息 |
info func | 显示被调试程序的所有函数名称 |
info prog | 显示被调试程序的执行状态 |
info local | 显示被调试程序当前函数中的局部变量信息 |
info var | 显示被调试程序的所有全局和静态变量名称 |
kill | 终止正在被调试的程序 |
list | 显示被调试程序的源代码 |
quit | 退出 gdb |
代码例子:
报错:Segment fault 段错误
①下面用gdb来调试:
运行 “gdb test_gdb” ,加载 test_gdb可执行文件;
[2] 执行装入的 test_gdb命令;
[3] 使用 where 命令查看程序出错的地方;
[4] 利用 list 命令查看调用 gets 函数附近的代码;
[5] 在 gdb 中,我们在第 11 行处设置断点,看看是否是在第11行出错;
[6] 程序重新运行到第 11 行处停止,这时程序正常,然后执行单步命令next
[7] 程序确实出错,能够导致 gets 函数出错的因素就是变量 string。重新执行测试程,用 print 命令查看 string 的值;
[8] 问题在于string指向的是一个无效指针,修改程序,在10行和11行之间增加一条语句 “string=buff; ”,重新编译程序,然后继续运行,将看到正确的程序运行结果。
②"layout src"命令查看源代码:
用gdb查看源代码可以用list命令,但是这个不够灵活。可以使用"layout src"命令,或者按Ctrl-X再按A,就会出现一个窗口可以查看源代码。也可以用使用-tui参数,这样进入gdb里面后就能直接打开代码查看窗口。
其他代码窗口相关命令:
info win | 显示窗口的大小 |
layout next | 切换到下一个布局模式 |
layout prev | 切换到上一个布局模式 |
layout src | 只显示源代码 |
layout asm | 只显示汇编代码 |
layout split | 显示源代码和汇编代码 |
layout regs | 增加寄存器内容显示 |
focus cmd/src/asm/regs/next/prev | 切换当前窗口 |
refresh | 刷新所有窗口 |
tui reg next | 显示下一组寄存器 |
tui reg system | 显示系统寄存器 |
update | 更新源代码窗口和当前执行点 |
winheight name +/- line | 调整name窗口的高度 |
tabset nchar | 设置tab为nchar个字符 |
[1]
[2] 用b linenumber添加三个断点,并用info b查看断点信息:
[3] 使用display跟踪变量i
熟悉基于硬件模拟器的调试技术
安装硬件模拟器QEMU
解压源代码:tar xvJf qemu-4.1.0.tar.xz
进入qemu目录内:cd qemu-4.1.0
配置qemu,可模拟X86-32硬件环境
编译qemu
安装qemu
在/usr/local/bin下看到安装的qemu程序
建立符号链接文件qemu