您的位置:首页 > 教育 > 培训 > 平面设计网课推荐_怎么建设网页_常宁seo外包_seo课程培训班

平面设计网课推荐_怎么建设网页_常宁seo外包_seo课程培训班

2025/5/18 17:03:02 来源:https://blog.csdn.net/weixin_45041054/article/details/142328594  浏览:    关键词:平面设计网课推荐_怎么建设网页_常宁seo外包_seo课程培训班
平面设计网课推荐_怎么建设网页_常宁seo外包_seo课程培训班

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_AMcpu_exec(-1);
#else/* Receive commands from user. */sdb_mainloop();
#endif

接着返回到main()函数。

int main(int argc, char *argv[]) {/* Initialize the monitor. */
#ifdef CONFIG_TARGET_AMam_init_monitor();
#elseinit_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即可正常退出。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com