![220635489fb6ebd828adcb1bc685d01f.png](https://i-blog.csdnimg.cn/blog_migrate/3fc5be0690aec26d1169238d3edfad4f.jpeg)
背景:
在开发ARM嵌入式端C/C++程序时,一般会在PC上编写代码,在Linux服务器上编译,然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题,在不使用gdb的情况下,经常在代码中添加打印,编译,然后在开发板上再次运行,查看结果。添加打印、编译麻烦费时不谈,想要监视局部变量、断点执行这种方式还不支持。而使用gdb工具时,习惯了使用UI界面的人来说,基本上很难适应。这里将使用VS Code,结合gdb与gdbserver,可视化远程调试arm开发板上的linux C/C++程序。
由于写这篇文件的时候,手上并没有arm开发板,这里就直接使用windows桌面端PC作为替代,其基本实现过程是一致的,只需要在编译gdb时更改编译工具链即可。
实验环境:windows桌面端,Linux服务器,VS Code(使用了Remote-SSH插件)
实验目标:在Linux服务器上编译gdb工具,编译windows可执行程序,然后在Linux平台调试Windows程序。
正文:
编译GDB源码
在进行远程调试linux C/C++程序时,需要在远程端运行gdbserver,在本地端运行gdb,两者进行通信完成调试过程。大多数情况下,ARM开发板的编译工具链是定制化的,很难在网上下载到能够直接使用的配套gdb与gdbserver工具,因此需要手动编译源码得到对应的工具。
到Index of /gnu/gdb页面下载gdb源码包,这里推荐下载7.12.1版本包gdb-7.12.1.tar.xz(写下这篇文章是2020年11月,gdb已更新到10.1版本了,但是经过日常使用测试时发现8.x版本经常崩溃,9.x与10.x版本未测试)。下载完成后,将gdb-7.12.1.tar.xz上传到服务器上(挂载、scp、ftp等各种方式自选),并解压。
tar -xf gdb-7.12.1.tar.xz
到gdb-7.12.1目录下,新建build文件夹,配置、编译gdb程序。
cd gdb-7.12.1
mkdir build
" --host=x86_64-linux-gnu"指gdb要运行的平台为x86_64架构的linux系统,"--target=i686-w64-mingw32"指gdb要调试的程序运行在x86_64架构的windows平台。编译时,请根据实际情况修改要使用的编译工具链前缀,例如编译64位arm平台linux程序,可以使用使用工具链aarch64-linux-gnu。
编译完成后,build/gdb目录下会生成gdb程序。
编译GDB Server源码
gdb server源码存放在gdb-7.12.1/gdb/gdbserver目录下,到此目录下,新建build文件夹,配置、编译gdbserver程序。
cd ../gdb/gdbserver
mkdir build
运行完上面命令之后,不要关键使用make命令编译。因为目标运行平台可能没有安装对应的库支持,导致运行gdbserver时找不到对应的动态链接库。因此打开生成的Makefile文件,搜索"CFLAGS"(大概在136行),在编译选项CFLAGS、CXXFLAGS、CPPFLAGS中添加"-static"字段,优先链接静态库。
![48b55cd873a3c2c07b370988e824e400.png](https://i-blog.csdnimg.cn/blog_migrate/4470ac0fc81e3e542e0593e9691af954.png)
然后执行make命令,完成gdbserver的编译工作。
make
编译要调试的程序
使用交叉编译工具链编译要调试的程序,需要注意的是去掉编译选项中的"-O2"或"-O1"选项(某些代码被优化了之后,断点无法生效),并加上"-g"选项,在生成的可执行程序中包含调试信息。
这里编写了一个简单程序,依次打印数字,以便调试。执行make命令直接编译。
![4499c2fdf5fe3bd097ca859a16f985bb.png](https://i-blog.csdnimg.cn/blog_migrate/c30bd36038b51b89eba8584e531a1ab9.jpeg)
开始调试
将编译好的gdbserver.exe与生成的被调试程序test.exe复制到Windows PC中,打开cmd终端,运行下面的命令,启动gdbserver。":14399"是指gdbserver监听的端口号是14399(可以配置成其它端口号),用于与gdb通信,冒号":"不可省略,"test.exe"是要被调试的程序。如果程序带有运行参数,直接依次写在test.exe后面。
./gdbserver.exe :14399 test.exe
在打开测试程序源代码工程的VS code窗口中,新建一个launch.json配置。如果已经有了launch.json配置,则直接打开,添加gdb调试配置。
![35cbf31065db2df6f13bbb00f9e188ab.png](https://i-blog.csdnimg.cn/blog_migrate/f420e2fd18b73834237a00ac5d42979e.jpeg)
![c6ea22a210c4eea16e37147f37dcd074.png](https://i-blog.csdnimg.cn/blog_migrate/286cf029712cb6c0a19181192421c730.png)
在launch.json中修改program字段,填写生成的test.exe文件路径。添加"miDebuggerPath"字段,填写刚刚编译生成的gdb路径。添加"miDebuggerServerAddress"字段,填写Windows PC的IP与gdbserver监听的端口号。
![9dae3bba5fb86f6094a62e925ac43a7b.png](https://i-blog.csdnimg.cn/blog_migrate/e452953e0d64c54bf9fefb6d431bcf71.jpeg)
在文件中打上断点,监视窗口中添加想要监视的变量值,点击运行按钮,即可开始调试过程。
![6abc8af95981318933d54ff15b08e129.png](https://i-blog.csdnimg.cn/blog_migrate/698068310f8319e30fc359db0905749b.jpeg)