一、Debug和Release
1.1 Debug版本
在软件开发过程中可以使用Debug版本软件进行调试,调试版本中包含很多调试信息,易于发现问题,如果出现问题,Debug版本软件所提供的调试信息可以帮助我们以最快的速度解决问题。
1.2 Release版本
当软件开发完成后,我们为了增加程序运行效率,此时会编译一个Release版本的程序,里面不包含调试信息,一旦出现问题之后我们想要对其进行调试,就没有那么容易了。
1.3 区别
下面是Release版本查看栈回溯的信息,由于没有符号信息,在输出的时候只打印了地址,无法直观的看到函数调用位置。
除此外,还包含优化等级的差异,将同样的程序编译成汇编代码之后就会体现出来,每一条汇编指令就对应了一条CPU指令,CPU按照对应的指令进行执行。
Debug模式下可以使用断言,但是在Release模式下断言无效,当条件不满足的时候继续往下执行。
在经过优化后,编译器可能会直接从寄存器中取值,而不从内存中进行取值。
在嵌入式系统中存储容量有限,调试版本可能无法保存到存储器中进行运行,下面是他们的对比:
-rwxrwxr-x 1 lhq lhq 83568 11月 20 15:15 debug
drwxrwxr-x 18 lhq lhq 4096 11月 18 17:47 EOS
-rw-rw-r-- 1 lhq lhq 632 11月 19 22:41 main.cpp
-rwxrwxr-x 1 lhq lhq 25936 11月 20 15:14 release
从上面的对比来看,对程序进行优化后发布运行是非常有必要的。
二、使用GDB调试Release 版本程序
使用版本控制工具进行管理代码,每次发布一个版本在出问题之后都可以及时通过源码分析问题。
由于在Release版本中不包含调试信息,所以调试起来难度比较大,但是我们可以使用发行版本的源码生成一个携带调试信息的版本来进行调试。
第一种方式是从调试版本软件中提取符号表,利用Binutils工具获取符号表:
objcopy --only-keep-debug debug debug.symbol
获取到符号表后使用gdb指定符号文件:
gdb --symbol=debug.symbol -exec=release
加载成功之后就可以像debug版本一样设置断点和查看局部变量信息。
第二种方式是直接指定从调试版本中获取符号:
gdb --symbol=debug -exec=release
然后就可以像Debug版本一样使用了