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
  1. 程序试图从用户空间访问哪个虚拟地址导致它崩溃?
    0xc0000008
  2. 导致崩溃的指令的虚拟地址是什么?
    0x80488ee
  3. 要进行调查,请使用 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>
  1. 找到您在上面确定的函数的 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)); }
  1. 为什么您在 #3 中确定的指令尝试访问您在 #1 中确定的虚拟地址处的内存?不要用寄存器的值来解释这个;我们正在寻找更高层次的解释。
    此时指令想要将参数 argv 作为调用 main 函数的参数,而 ebp 指向它的旧值,ebp + 4 指向返回地址,ebp + 8 指向 argc,ebp + 12 指向 argv,因此该指令试图访问该虚拟地址。

2.2 单步调试崩溃

  1. 进入进程执行功能。运行此函数的线程的名称和地址是什么?目前 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}
  1. 当前线程的回溯是什么?从 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);
  1. 在 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}
  1. 单步执行 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}
  1. 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. 自制青蛙跳台阶小游戏~

    青蛙跳台阶小游戏 1.概念(concept)文档 楔子(Setting):千百年来,人们在贬低别人时,常用井底之蛙来描述那个人,但这却让青蛙不开心了,于是青蛙决定跳出井底,为自己讨一个公道. 玩法(G ...

  2. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  3. [FaceBook]测试、发布和分享小游戏

    FaceBook小游戏 测试.发布和分享小游戏 对于小游戏,您现在可以十分轻松地在本地测试开发版本,自动完成发布流程,以及与团队分享编译版本.本文档会详细说明这些步骤. 通过本地服务器测试游戏 小游戏 ...

  4. OPPO小游戏vConsole开启方法

    OPPO小游戏是不会报红色错误的,要开启vConsole,要在首场景脚本内onLoad里加上以下代码: qg.setEnableDebug({enableDebug: true, // true 为打 ...

  5. unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程

    本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...

  6. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  7. 用c++写一个猜数字的小游戏

    代码都很简单,就不细细说了,值得注意的一些就是: 对于初学c++的小伙伴来说,c++很多基础东西都和c语言有着一定的区别,例如头文件的写法,读入和输出的写法都不一样.例如下面这个小游戏中囊括了time ...

  8. 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv + mediapipe 创建一个AI视觉小游戏,先放图看效果. 游戏规则,用手按下屏幕上的圆形按钮,每按一次后松开,按钮就随机出现在屏幕上的一个位 ...

  9. 微信小游戏创业,究竟是红海还是死海?

    "跳一跳"."弹球王者"."海盗来了"."斗地主"等等微信小游戏,你是不是很眼熟呢?这些都是前段时间被刷了屏的小游戏,以 ...

  10. cocos creator 安卓原生平台环境_竞技对抗小游戏单挑篮球开发历程 | Cocos技术派第12期...

    本文来自于"Cocos 荣耀讲师"征稿活动第1期,最先发表于 Cocos 中文社区,作者 ID:蟹老板,2017年加入社区,文章作品包括<猎头专家的开发历程>等. Co ...

最新文章

  1. LINUX安装ORACLE 9204 报错解决!!
  2. Linux SO_KEEPALIVE属性,心跳
  3. Flask+uwsgi+Nginx环境搭建
  4. npm 报错 Module build failed: Error: No PostCSS Config found in:
  5. 软硬计算机电缆的区别,电线也有软硬之分,两者有什么区别?
  6. 怎样才算是一个好的老师???
  7. 微众银行--java面试题一
  8. 【免费】搜狗站长URL自动推送工具1.4.1
  9. TypeError: can only concatenate list (not “int“) to list
  10. 4位先行进位加法器_第4章 C语言基础以及流水灯的实现
  11. dpbs和pbs的区别_简单问题:PBS缓冲液到底是什么?
  12. 计算机桌面背景设置,电脑桌面背景设置图文教程
  13. QGIS编译(跨平台编译)之三十九:QCA编译、QCA安装(Windows、Linux、MacOS环境下编译、安装)
  14. 使用 Vscode 编写 HTML 文档竟然可以自动写代码(2)
  15. OpenCV入门——基本图像操作
  16. 网站WebSite如何添加WebAPI
  17. 雷神台式计算机型号,【雷神台式机】雷神911黑武士III台式机评测,雷神台式机装机教程_什么值得买...
  18. Paper:机器学习、深度学习常用的国内/国外引用(References)论文参考文献集合(建议收藏,持续更新)
  19. SOT-563(tvs瞬态抑制二极管)产品详情
  20. 编码前准备——Cmder学习

热门文章

  1. 会计中运用计算机知识点,电算化会计知识点..doc
  2. 锋迷商城项目介绍(一)
  3. 利用微信公共号的带参数二维码做(扫码登录)
  4. 13-SQLite之group by
  5. 采用蒙特卡罗方法求解π值
  6. html网页中如何给文字加入下划线
  7. 统计信息:SQL执行优化之密钥
  8. 不用露脸,现在做自媒体还晚不晚?推荐这3个新手适合做的领域
  9. 煤炭传送带状态检测系统-python
  10. 链游StarSharks(星鲨)全方位介绍