当我们退出nemu时会发现有一个报错,如果此时去追踪报错位置来排除错误会十分麻烦。我选择的是使用gdb来进行调试来寻找错误。
首先我们gdb模式下运行nemu
make gdb
然后调出TUI
layout split
界面如下
我们可以发现main函数返回后执行了is_exit_status_bad 很明显问题就在这个函数里面,通过打断点等方式我们可以发现该函数的声明文件为 src/utils/state.c
该文件引用了头文件 utils.h
而此时 is_exit_status_bad 函数的内容已经非常清楚了,然后我们在gdb中输出good的值,发现为0,所以我们假设要使good的值为1才是优雅地退出。运行nemu时我们发现直接退出MEMUState.state的值为1,而运行程序后退出为2,分别对应NEMU_STOP和NEMU_END,而且halt_ret的值始终为0,所以我们将NEMU_QUIT更改为NEMU_STOP应该可以修复问题。更改后发现nemu退出没有再发生报错。
但是我在做后面的实验时发现了一个更优美的解决办法(我认为这才是标准答案),就是在
src/monitor/sdb/sdb.c 文件内对 q 指令进行修改
可以看到该指令之返回了-1,并未对nemu_state.state进行修改,所以我们只需要将其修改为NEMU_QUIT,照样可以优雅地退出。