在本学期(2017-2018学年第二学期)的操作系统实验课的作业时编写操作系统,在调试过程中遇到了极大问题,下面总结一下debug工具和方法。
我使用的是bochs+nasm+Mingw(主要是其中的gcc、objdump、objcopy、ld)。
对于bochs调试,我就不说了,不会的同学进入bochsdbg.exe后输入help一下,对某个指令help一下(help [name])可以看该指令的详细信息,推荐熟悉使用print-stack指令查看栈空间,xxp查看内存,u查看反汇编指令,b和c端点调试等等,最主要的是xxp和print-stack查看栈和内存空间。
重点来了,是不是觉得看着bochs的反汇编不知道运行到哪里去了(特别是C语言那些部分),下面提出一个解决方法:
在gcc编译的时候加入-g选项生成带调试信息的elf文件(注意,不要二进制文件),然后使用objdump来将该elf文件反汇编,选项是-Sl,当然还要加上其他指明机器框架之类的选项。
下面是效果:
_main():
:21
short *FAT;
struct Process processTable[Len];
int curId;
int _main() {
11: 66 56 push esi
13: 66 53 push ebx
15: 66 83 ec 18 sub esp,0x18
:22
curId = 0;
19: 66 c7 06 c0 50 00 00 mov DWORD PTR ds:0x50c0,0x0
20: 00 00
:23
initialScreen(1);
22: 67 66 c7 04 24 01 00 mov DWORD PTR [esp],0x1
29: 00 00
2b: 66 e8 ea 12 00 00 call 131b <_initialScreen>
:24
initialFile();
31: 66 e8 f8 1d 00 00 call 1e2f <_initialFile>
:25
initialProcessTable();
37: 66 e8 b0 22 00 00 call 22ed <_initialProcessTable>
3d: e9 e0 02 jmp 320 <__file_alignment__+0x120>
一条C语言程序对应一段汇编代码。