Project0:小游戏
2.1 找到故障指令
FAIL
Test output failed to match any acceptable form.Acceptable output:do-nothing: exit(162)
Differences in `diff -u' format:
- do-nothing: exit(162)
+ Page fault at 0xc0000008: rights violation error reading page in user context.
+ do-nothing: dying due to interrupt 0x0e (#PF Page-Fault Exception).
+ Interrupt 0x0e (#PF Page-Fault Exception) at eip=0x80488ee
+ cr2=c0000008 error=00000005
+ eax=00000000 ebx=00000000 ecx=00000000 edx=00000000
+ esi=00000000 edi=00000000 esp=bfffffe4 ebp=bffffffc
+ cs=001b ds=0023 es=0023 ss=0023
- 程序试图从用户空间访问哪个虚拟地址导致它崩溃?
0xc0000008 - 导致崩溃的指令的虚拟地址是什么?
0x80488ee - 要进行调查,请使用 objdump 反汇编 do-nothing 二进制文件。程序崩溃时所在的函数的名称是什么?,并确定程序崩溃的指令。
080488e8 <_start>:80488e8: 55 push %ebp80488e9: 89 e5 mov %esp,%ebp80488eb: 83 ec 18 sub $0x18,%esp80488ee: 8b 45 0c mov 0xc(%ebp),%eax ;argv80488f1: 89 44 24 04 mov %eax,0x4(%esp)80488f5: 8b 45 08 mov 0x8(%ebp),%eax ;argc80488f8: 89 04 24 mov %eax,(%esp)80488fb: e8 94 f7 ff ff call 8048094 <main>8048900: 89 04 24 mov %eax,(%esp)8048903: e8 d3 21 00 00 call 804aadb <exit>
- 找到您在上面确定的函数的 C 代码(提示:它是在用户空间中执行的,因此它位于 do-nothing.c 或 proj-pregame/src/lib 或 proj-pregame/src/lib/user 中的文件之一)。对于 #3 中反汇编函数中的每条指令,用几句话解释为什么它是必要的和/或它试图做什么。提示:参见 80x86 调用约定。
向 main 函数传递参数。80x86 的函数参数都是通过栈传送,而80x86_64 的前 6 个参数通过寄存器传送。
//proj-pregame/src/lib/user/entry.c
#include <syscall.h>int main(int, char* []);
void _start(int argc, char* argv[]);void _start(int argc, char* argv[]) { exit(main(argc, argv)); }
- 为什么您在 #3 中确定的指令尝试访问您在 #1 中确定的虚拟地址处的内存?不要用寄存器的值来解释这个;我们正在寻找更高层次的解释。
此时指令想要将参数 argv 作为调用 main 函数的参数,而 ebp 指向它的旧值,ebp + 4 指向返回地址,ebp + 8 指向 argc,ebp + 12 指向 argv,因此该指令试图访问该虚拟地址。
2.2 单步调试崩溃
- 进入进程执行功能。运行此函数的线程的名称和地址是什么?目前 Pintos 中还有哪些其他线程?复制他们的线程结构。
名称为 main,地址为 0xc000e000
pintos-debug: dumplist #0: 0xc000e000 {tid = 1, status = THREAD_RUNNING, name = "main", '\000' <repeats 11 times>, stack = 0xc000e
dbc "\001", priority = 31, allelem = {prev = 0xc0039cf8 <all_list>, next = 0xc0104020}, elem = {prev = 0xc0039ce8 <fifo_ready_list
>, next = 0xc0039cf0 <fifo_ready_list+8>}, pcb = 0xc010500c, magic = 3446325067}
pintos-debug: dumplist #1: 0xc0104000 {tid = 2, status = THREAD_BLOCKED, name = "idle", '\000' <repeats 11 times>, stack = 0xc0104
f14 "", priority = 0, allelem = {prev = 0xc000e020, next = 0xc0039d00 <all_list+8>}, elem = {prev = 0xc0039ce8 <fifo_ready_list>,
next = 0xc0039cf0 <fifo_ready_list+8>}, pcb = 0x0, magic = 3446325067}
- 当前线程的回溯是什么?从 GDB 复制回溯作为您的答案,并复制对应于每个函数调用的 C 代码行。
#0 process_execute (file_name=0xc0007d50 "do-nothing") at ../../userprog/process.c:55
#1 0xc0020a19 in run_task (argv=0xc0039bec <argv+12>) at ../../threads/init.c:317
#2 0xc0020b8f in run_actions (argv=0xc0039bec <argv+12>) at ../../threads/init.c:390
#3 0xc00203d9 in main () at ../../threads/init.c:138
process_wait(process_execute(task));
a->function(argv);
run_actions(argv);
- 在 start_process 处设置断点并继续运行到该点。运行此函数的线程的名称和地址是什么?目前 Pintos 中还有哪些其他线程?复制他们的结构线程。
do-nothing,0xc010b000。
pintos-debug: dumplist #0: 0xc000e000 {tid = 1, status = THREAD_BLOCKED, name = "main", '\000' <repeats 11 times>, stack = 0xc000e
e7c "", priority = 31, allelem = {prev = 0xc0039cf8 <all_list>, next = 0xc0104020}, elem = {prev = 0xc003b718 <temporary+4>, next
= 0xc003b720 <temporary+12>}, pcb = 0xc010500c, magic = 3446325067}
pintos-debug: dumplist #1: 0xc0104000 {tid = 2, status = THREAD_BLOCKED, name = "idle", '\000' <repeats 11 times>, stack = 0xc0104
f14 "", priority = 0, allelem = {prev = 0xc000e020, next = 0xc010b020}, elem = {prev = 0xc0039ce8 <fifo_ready_list>, next = 0xc003
9cf0 <fifo_ready_list+8>}, pcb = 0x0, magic = 3446325067}
pintos-debug: dumplist #2: 0xc010b000 {tid = 3, status = THREAD_RUNNING, name = "do-nothing\000\000\000\000\000", stack = 0xc010bf
d4 "", priority = 31, allelem = {prev = 0xc0104020, next = 0xc0039d00 <all_list+8>}, elem = {prev = 0xc0039ce8 <fifo_ready_list>,
next = 0xc0039cf0 <fifo_ready_list+8>}, pcb = 0x0, magic = 3446325067}
- 单步执行 start_process 函数,直到您跨过对 load 的调用。注意 load 设置 if_ 结构中的 eip 和 esp 字段。打印出 if_ 结构的值,以十六进制显示值(提示: p/x if )。
{edi = 0x0, esi = 0x0, ebp = 0x0, esp_dummy = 0x0, ebx = 0x0, edx = 0x0, ecx = 0x0, eax = 0x0, gs = 0x23, fs = 0x23, es = 0x2
3, ds = 0x23, vec_no = 0x0, error_code = 0x0, frame_pointer = 0x0, eip = 0x80488e8, cs = 0x1b, eflags = 0x202, esp = 0xc0000000, s
s = 0x23}
- asm volatile 语句中的第一条指令将堆栈指针设置为 if_ 结构的底部。第二条指令跳转到 intr_exit。代码中的注释解释了这里发生了什么。单步执行 asm volatile 语句,然后单步执行指令。当您逐步执行 iret 指令时,观察到函数“返回”到用户空间。为什么在执行此函数时处理器会切换模式?请随时根据 iret 时内存和/或寄存器中的值来解释这一点执行,以及 iret 指令的功能。
intr_exit:52│ /* Restore caller's registers. */53│ popal54│ popl %gs55│ popl %fs56│ popl %es57│ popl %ds58│59│ /* Discard `struct intr_frame' vec_no, error_code,60│ frame_pointer members. */61│ addl $12, %esp
Project0:小游戏相关推荐
- 自制青蛙跳台阶小游戏~
青蛙跳台阶小游戏 1.概念(concept)文档 楔子(Setting):千百年来,人们在贬低别人时,常用井底之蛙来描述那个人,但这却让青蛙不开心了,于是青蛙决定跳出井底,为自己讨一个公道. 玩法(G ...
- 用Construct 2制作入门小游戏~
今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...
- [FaceBook]测试、发布和分享小游戏
FaceBook小游戏 测试.发布和分享小游戏 对于小游戏,您现在可以十分轻松地在本地测试开发版本,自动完成发布流程,以及与团队分享编译版本.本文档会详细说明这些步骤. 通过本地服务器测试游戏 小游戏 ...
- OPPO小游戏vConsole开启方法
OPPO小游戏是不会报红色错误的,要开启vConsole,要在首场景脚本内onLoad里加上以下代码: qg.setEnableDebug({enableDebug: true, // true 为打 ...
- unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程
本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...
- python井字棋_用Python做一个井字棋小游戏
井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...
- 用c++写一个猜数字的小游戏
代码都很简单,就不细细说了,值得注意的一些就是: 对于初学c++的小伙伴来说,c++很多基础东西都和c语言有着一定的区别,例如头文件的写法,读入和输出的写法都不一样.例如下面这个小游戏中囊括了time ...
- 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码
各位同学好,今天和大家分享一下如何使用 opencv + mediapipe 创建一个AI视觉小游戏,先放图看效果. 游戏规则,用手按下屏幕上的圆形按钮,每按一次后松开,按钮就随机出现在屏幕上的一个位 ...
- 微信小游戏创业,究竟是红海还是死海?
"跳一跳"."弹球王者"."海盗来了"."斗地主"等等微信小游戏,你是不是很眼熟呢?这些都是前段时间被刷了屏的小游戏,以 ...
- cocos creator 安卓原生平台环境_竞技对抗小游戏单挑篮球开发历程 | Cocos技术派第12期...
本文来自于"Cocos 荣耀讲师"征稿活动第1期,最先发表于 Cocos 中文社区,作者 ID:蟹老板,2017年加入社区,文章作品包括<猎头专家的开发历程>等. Co ...
最新文章
- LINUX安装ORACLE 9204 报错解决!!
- Linux SO_KEEPALIVE属性,心跳
- Flask+uwsgi+Nginx环境搭建
- npm 报错 Module build failed: Error: No PostCSS Config found in:
- 软硬计算机电缆的区别,电线也有软硬之分,两者有什么区别?
- 怎样才算是一个好的老师???
- 微众银行--java面试题一
- 【免费】搜狗站长URL自动推送工具1.4.1
- TypeError: can only concatenate list (not “int“) to list
- 4位先行进位加法器_第4章 C语言基础以及流水灯的实现
- dpbs和pbs的区别_简单问题:PBS缓冲液到底是什么?
- 计算机桌面背景设置,电脑桌面背景设置图文教程
- QGIS编译(跨平台编译)之三十九:QCA编译、QCA安装(Windows、Linux、MacOS环境下编译、安装)
- 使用 Vscode 编写 HTML 文档竟然可以自动写代码(2)
- OpenCV入门——基本图像操作
- 网站WebSite如何添加WebAPI
- 雷神台式计算机型号,【雷神台式机】雷神911黑武士III台式机评测,雷神台式机装机教程_什么值得买...
- Paper:机器学习、深度学习常用的国内/国外引用(References)论文参考文献集合(建议收藏,持续更新)
- SOT-563(tvs瞬态抑制二极管)产品详情
- 编码前准备——Cmder学习