嵌入式交叉编译GDB,结合vscode图形化调试C和C++代码 coredump定位段错误
第一部分:交叉编译GDB
GDB源码下载路径:
http://ftp.gnu.org/gnu/gdb/
遇到的主要难点:
选择合适的GDB源码版本
我的mips-linux交叉编译器不支持C++11特性,所以我选择较老的GDB版本
//是不是不太明白我在说啥?自己去试错就知道了。我之前选择了GDB9.1版本,编译途中遇到报该错。
//之后又下载了一个GDB版本来编译,make的时候有其他错误,我无法解决。
最终,我选择的合适版本是 gdb-7.12.1.tar.xz,建议读者也下载该版本。
//版本老点不要紧,够用就行。贪多嚼不烂。
编译前基本知识科普:
--prefix指定安装路径
后面的路径一般是我们自己新创建的用来存放目标程序(现在我们的目标程序就是GDB)的文件夹
--target --host 一般一样,指定为交叉编译器的前缀
(我当前mips平台的交叉编译器是mips-linux-gnu-gcc,所以这里后面写mips-linux-gnu)
CC指定交叉编译器
之后进行编译安装,参考的文档是:
正点原子的<< I.MX6U嵌入式Linux驱动开发指南V1.5.pdf>>第B3章节,
后续操作步骤只有几步,很简单。可转去参考该文档,不参考也可以,本博客也会详解步骤。
我的GDB源码,默认解压后得到的文件夹是gdb-7.12.1,cd进入该文件夹,就是进入了源码根目录。
1.1 在源码根目录下,执行交叉编译GDB并安装:
./configure --target=mips-linux-gnu --prefix=/home/lmw/open_lib/GDB/GDBStupHere
make
make install
留心点(point):
遇到的报错:
解决:
运行makeinfo --version,if下面的判断为 texinfo的版本为4.7以上的版本才行, 小于这个版本或者没有安装texinfo,需安装texinfo 后, 删除编译目录的所有文件,重新configure,make, make install,一切OK。
安装texinfo :
sudo apt-get install texinfo
如果失败,请参考: https://blog.csdn.net/jsf120/article/details/119911473?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-119911473-blog-50062189.235%5Ev29%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-119911473-blog-50062189.235%5Ev29%5Epc_relevant_default_base3&utm_relevant_index=10
1.2 进入源码根目录内的gdb/gdbserver子文件夹,执行交叉编译GDBServer:
./configure --target=mips-linux-gnu --host=mips-linux-gnu CC=mips-linux-gnu-gcc
make
其他备注:
0. 必须先保证开发板和ubuntu主机能ping通,我们在ubuntu主机内进行代码编写,
所以我的应用程序源码在ubuntu主机内。
1.
编译应用程序时要加[-g]选项,否则,GDB调试时会报错。
2.
ubuntu内执行:mips-linux-gnu-gdb Test_App 设备上执行 ./gdbserver 10.183.42.100:2001 Test_App 端口号随便 ubuntu内执行:target remote 10.183.42.100:2001 连接到设备上的gdbserver服务的正确端口 之后ubuntu内就可以敲打gdb的命令了: 例如 break 83 // 设置断点, 以停在main函数所在源文件的第位行 continue // 运行,直到有断点后停下
我的ubuntu情况展示:
第二部分: 结合vscode进行图形化调试
PS:
下图是图形化调试前需要在嵌入式板子上敲的命令:
之后我们点击linux系统内的vscode上的调试按钮就可以了:
第三部分: 段错误解决神器之coredump使用
Core Dump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。
我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,
例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。
core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
相关设置
如果没有进行core dump 的相关设置,默认是不开启的。可以通过ulimit -c查看是否开启。如果输出为0,则没有开启,
需要执行ulimit -c unlimited开启core dump功能。
编译应用程序源码时要加-g选项。
PS:需要注意,要通过menuconfig配置内核,使能core功能:
第四部分 调试CPP代码
![](https://img2020.cnblogs.com/blog/1124272/202010/1124272-20201020173524388-988070435.png)
.