Enable debug information
问题如上。
在menuconfig将 Enable debug information 选项打开,编译时会产生什么变化?
从选项上看是打开了支持调试的选项,编译时应该是添加了支持编译的参数,具体看代码。
首先,我们先看 make menuconfig 这条命令做了什么?
找到 scripts/config.mk 文件,看到如下:
menuconfig: $(MCONF) $(CONF) $(FIXDEP)
$(Q)$(MCONF) $(Kconfig)
$(Q)$(CONF) $(silent) --syncconfig $(Kconfig)
这部分的作用:
1、首先生成conf、mconf、fixdep文件;
2、运行 mconf 程序,传入 $(Kconfig) 文件;
3、运行 conf 程序根据用户在 menuconfig 中的选择,同步 .config 文件,生成auto.conf文件
接下来在 tools 文件夹下的 .config 文件,include 下的 auto.conf文件,以及可以看到:
CONFIG_CC_DEBUG=y
可以看到DEBUG选项被置成y;
这时就可以知道在make时是将该选项加入了编译。
因此在nemu的文件夹下找到Makefile文件,有如下:
.
.
.
-include $(NEMU_HOME)/include/config/auto.conf
-include $(NEMU_HOME)/include/config/auto.conf.cmd
.
.
.
CFLAGS_BUILD += $(if $(CONFIG_CC_DEBUG),-Og -ggdb3,)
.
.
.
得知首先是载入了auto.conf文件,之后判断 CONFIG_CC_DEBUG ,如果为y则将 -Og -ggdb3 加入到 CFLAGS_BUILD 中,即加入到编译选项中,打开了调试支持的选项。
键入q退出
首先,看源代码能看出以下的函数调用顺序:
main();[nemu_main.c] → engine_start();[ src/engine/interpreter/init.c ] → sdb_mainloop();[src/monitor/sdb.c] → cmd_q();[src/monitor/sdb.c]
然后倒过来一步一步往上看:
cmd_q();
static int cmd_q(char *args) {
return -1;
}
cmd_q 就是直接返回“-1”;
sdb_mainloop();
int i;
for (i = 0; i < NR_CMD; i ++) {
if (strcmp(cmd, cmd_table[i].name) == 0) {
if (cmd_table[i].handler(args) < 0) { return; }
break;
}
}
当 cmd 与 cmd_table[i].name 匹配时,执行 cmd_table[i].handler(args) 函数,即 cmd_q 函数;有上面可知 cmd_q 返回“-1”,即 cmd_table[i].handler(args) < 0 成立;然后return到调用它的函数engine_start(),
void engine_start() {
#ifdef CONFIG_TARGET_AM
cpu_exec(-1);
#else
/* Receive commands from user. */
sdb_mainloop();
#endif
接着返回到main()函数。
int main(int argc, char *argv[]) {
/* Initialize the monitor. */
#ifdef CONFIG_TARGET_AM
am_init_monitor();
#else
init_monitor(argc, argv);
#endif
/* Start engine. */
engine_start();
return is_exit_status_bad();
}
而main函数返回了is_exit_status_bad();函数
再打开is_exit_status_bad();函数
int is_exit_status_bad() {
int good = (nemu_state.state == NEMU_END && nemu_state.halt_ret == 0) ||
(nemu_state.state == NEMU_QUIT);
return !good;
}
这是nemu的退出状态的判断;
运行程序时,nemu_state的状态是NEMU_END且程序正常结束halt_ret = 0时,或者没有运行程序时nemu_state = NEMU_QUIT时表示程序需要退出,此时good = 1,表示程序正常退出。
当good = 0时,程序就是非正常退出。
当我们在终端输入q时,因为没有运行程序无法改变nemu_state的状态为NEMU_END且无法将halt_ret置零。
我们在终端输入q时属于没有运行程序,应该将nemu_state的状态变为NEMU_QUIT即可正常退出。