嵌入式八股文3 编译与调试
1.编译过程(预编译(展开宏定义,处理预编译指令生成.i文件),编译(把.c或.cpp编译汇编指令,生成.S文件),汇编(把汇编编译成二进制文件.o),链接(链接所有的.o文件和库文件,生成可执行文件)
2.编译器优化(编译器会自动优化一部分代码,比如提高性能,减少冗余的代码内容,去掉不需要执行的代码等,对gcc用-O来开启优化,一般有3个优化等级,-O0表示不优化)
3.gcc如何开启调试信息(编译时加上-g选项)
4.gdb操作(gdb a.out进入gdb模式,run运行程序,b打断点,s单步调试,n单步调试进入子函数,thread_info查看线程,bt查看堆栈信息,f进入具体的栈帧,disassemble查看反汇编)
5.linux如何查内存泄漏(valgrind等工具,或者自己加日志埋点)
6.linux如何查程序崩溃(打断点或者打印大法或者gdb在崩溃后查coredump文件,找到堆栈信息,查看停在哪里)
7.makefile和cmake(makefile是make用来编译的规则,但是由于跨平台性不足及编写难度偏大,于是有了cmake工具。语法较多不展开多说,本质上是先把Cmakelist.txt的文本内容通过cmake转为makefile,然后编译器再根makefile进行编译)
8.动态链接和静态链接(动态链接是把依赖库单独放在一边,可执行文件中只有符号表没有二进制内容,因此是在程序执行时再去找二进制内容。静态链接是把所有依赖打包整合到可执行文件。动态链接的可执行文件小,更新灵活,可移植强,但需要运行时去搜索,性能相对差一点。静态链接缺点是可执行文件占用空间大,编译慢,优点是运行速度快,不依赖环境)
9.C++的'extern C'的作用(让C++程序正确调用C代码,因为C++虽然兼容C语法,但编译器生成的函数符号是不一样的,可能导致链接出错或者执行时出现undefined reference等提示)
10.编译时undefined reference出现原因(包含了头文件并调用了某个函数,但该函数没有被实现,只有声明没有定义。一般来说可能是没有对函数体进行编写,或者没有把对应的.c文件加入到编译工程。其次也可能是虚函数没有得到重写,找不到虚表等)
11.C程序函数参数入栈顺序(从右到左依次入栈)
2.编译器优化(编译器会自动优化一部分代码,比如提高性能,减少冗余的代码内容,去掉不需要执行的代码等,对gcc用-O来开启优化,一般有3个优化等级,-O0表示不优化)
3.gcc如何开启调试信息(编译时加上-g选项)
4.gdb操作(gdb a.out进入gdb模式,run运行程序,b打断点,s单步调试,n单步调试进入子函数,thread_info查看线程,bt查看堆栈信息,f进入具体的栈帧,disassemble查看反汇编)
5.linux如何查内存泄漏(valgrind等工具,或者自己加日志埋点)
6.linux如何查程序崩溃(打断点或者打印大法或者gdb在崩溃后查coredump文件,找到堆栈信息,查看停在哪里)
7.makefile和cmake(makefile是make用来编译的规则,但是由于跨平台性不足及编写难度偏大,于是有了cmake工具。语法较多不展开多说,本质上是先把Cmakelist.txt的文本内容通过cmake转为makefile,然后编译器再根makefile进行编译)
8.动态链接和静态链接(动态链接是把依赖库单独放在一边,可执行文件中只有符号表没有二进制内容,因此是在程序执行时再去找二进制内容。静态链接是把所有依赖打包整合到可执行文件。动态链接的可执行文件小,更新灵活,可移植强,但需要运行时去搜索,性能相对差一点。静态链接缺点是可执行文件占用空间大,编译慢,优点是运行速度快,不依赖环境)
9.C++的'extern C'的作用(让C++程序正确调用C代码,因为C++虽然兼容C语法,但编译器生成的函数符号是不一样的,可能导致链接出错或者执行时出现undefined reference等提示)
10.编译时undefined reference出现原因(包含了头文件并调用了某个函数,但该函数没有被实现,只有声明没有定义。一般来说可能是没有对函数体进行编写,或者没有把对应的.c文件加入到编译工程。其次也可能是虚函数没有得到重写,找不到虚表等)
11.C程序函数参数入栈顺序(从右到左依次入栈)
全部评论
相关推荐