如何突破在写pintos 过程中遇到的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
突破写pintos项目中的各种问题
在写pintos project中难免会出现很多问题。
下面是我总结的一些解决问题的方法:
A.百度谷歌下晚到的问题。
B.看下别人写好的代码,网上有,可以下载。
C.问一下其他人,队友,老师等。
D.以上几个方法都不行的情况下,只能靠自己了。
终极方法:调试。
没有调试解决不了的问题。
下面着重介绍用gdb调试的方法。
包括了调试核心代码和用户程序
1.怎么开始调试?
打开一个终端, 进入到src/threads/ 或者src/userprog
或者src/threas/build 或者src/userprog/build
下面默认进入了src/threads/
输入:pintos --gdb -- run alarm-multiple
请注意:--gbd中--与gdb之间没有空格; -- run 中--与run 之间必须有空格
出现:
再打开一个终端:进入到src/threads/build/中输入:pintos-gdbkernel.o
出现:
输入debugpintos
出现:
现在就可以调试了,具体怎么用gdb调试程序在网上有很多资料。
l -------------------------这是小写L, list列出代码
b x ---------------- 在x处设置断点, b--break
如 b 10 在第10行设置断点
b main 在函数main开始处设置断点
b *0x12345 在内存地址0x12345处设置断点
b process.c:start_process在process.c文件中的start_process函数入口处设置断点
c --------------continue 开始运行到下一个断点处delete ------------- 删除断点
p x ---------------显示变量x的值
x /20wx 0x7c000 ----------- 显示20个内存地址0x7c000处的值,w-表示显示4字节,x表示用16进制显示
q ------------------------quit 退出调试
s --------------- step单步进入函数中
n ----------------next 跳过函数
还有很多……
进入第二章后还要调试用户程序,调试方法可以在gdb-macros 中找到。
关键在导入用户程序的符号表,这样做:gdb>loadusersymbols echo
下面演示调试用户程序echo
1.进入src/example/中
输入make
编译好就ok
2.进入src/userprog/中
输入make
编译成功
3.进入src/userprog/build/中
1.制作虚拟硬盘
pintos-mkdiskfilesys.dsk–filesys-size=2
2.格式化虚拟硬盘filesys.dsk
pintos–f –q
3.复制../../example/中的echo文件到当前文件夹中
cp ../../example/echo echo
4.将echo 放入到虚拟硬盘中
pintos -p echo -a echo -- -q
5.开始启动调试
打开一个终端,进入到src/userprog/build中
输入命令:pintos --gdb -- run echo
打开另一个终端,也进入到src/userprog/build/中
输入命令:pintos-gdbkernel.o
进入gdb界面:
gdb>debugpintos
gdb>loadusersymbols echo
此时出现:
显然,.text_addr = 0x80480e0就是echo main 函数的入口地址
设置断点:gdb>b echo.c:main
再输入gdb>c
运行到echo.c的main()函数入口处
如下图:
OK,接下来就好调试了。