VS Code + gdbserver 嵌入式arm远程调试

0. 背景

海思sdk编译出文件系统中的gdb不支持回删,非常难用。想用一个比较靠谱且方便的调试方式,找了一些资料,发现vscode + gdbserver是不错的选择。使用这种方式,可以暂停程序运行,直接在代码上打断点,直观的看到当前的堆栈信息,查看每个变量的当前值和内存地址等等,目前所支持的功能还未发掘完毕,应该还有其他妙用。。。

1. 准备gdbserver

  • 先找一下当前宿主主机的交叉编译(++目前项目使用的交叉编译器是aarch64-himix100-linux-g++++)环境中是否自带gdbserver,如果没有就需要自己 去交叉编译。

    可喜的是,当前交叉编译环境是存在gdbserver的,目录为/opt/hisi-linux/x86-arm/aarch64-himix100-linux/host_bin/gdbserver,这个文件可以直接拷贝到板子中使用,不过这个文件稍微有点大。可以先调用aarch64-himix100-linux-strip gdbserver瘦瘦身,这个不强求。

  • 但是如果没有现成gdbserver的话,必须得自己编译一个了。

    • 下载gdb源码
      $$ 下载链接

    因为gdb源码中的几个函数和交叉编译环境中的几个头文件定义有冲突,所以需要修改源码,建议用我改好的。

    • 配置并编译
      cd gdb/gdbserver/; ./configure --host=aarch64-himix100-linux --prefix=/your dircetory/(建议选择个人用户目录,不要污染系统)
      修改Makefile配置,编译选项加上 -static,如图:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传img-TNtvqi3O-1570688443866

    https://i.imgur.com/2O5aUhQ.png
    $$ make && make install

2. 准备vscode

下载vscode,并安装

下载远程开发插件https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode-remote/vsextensions/vscode-remote-extensionpack/0.14.0/vspackage

离线安装插件如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhZdcCRr-1570707921852)(https://i.imgur.com/zIJ3ATX.png)]
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtPwu57W-1570707857150)(https://i.imgur.com/zIJ3ATX.png)]

3. 配置vscode和嵌入式设备

  • 配置vscode 插件进行远程ssh开发
    参考: https://www.jianshu.com/p/0f2fb935a9a1

  • vscode配置launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "process_name",
            "type": "cppdbg",
            "request": "launch",
            "program": "process_name",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++ build active file",
            "miDebuggerPath": "/opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-gdb",
            "miDebuggerServerAddress": "192.168.11.124:1234"
        }
    ]
}

主要修改项:

  • name: 调试的项目名
  • program: 应用程序路径,这个最好放在共享目录,和板子用同一个文件
  • cwd: 程序源代码路径,这个千万不要搞错了,要不调试的时候找不到源代码文件
  • miDebuggerPath: 交叉编译工具中的gdb
  • miDebuggerServerAddress: 远程gdbserver服务,根据自己设备对应修改

4. 运行

  • 嵌入式设备端

在共享目录中,gdbserver打开目标文件

# gdbserver :1234 ./process_name

这个端口号和launch.json中的端口号保持一致

  • vscode端

通过之前配置好的远程方式登录开发主机,打开项目对应的文件夹。按f5可以开始调试。如果发现报错直接继续调试,不必理会。如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传img-M4uzIMuL-1570688443876
https://i.imgur.com/WCSLTFg.png

可以看到,程序在运行中:

  1. 可以直接暂停程序运行
  2. 可以在将代码直接加在断点上
  3. 可以看到当前函数中的所有变量,内存地址等
  4. 可以看到当前所在的线程和堆栈信息

5. 总结

参考1:https://my.oschina.net/shelllife/blog/167914

参考2:https://www.jianshu.com/p/d532d196c89f

你可能感兴趣的:(Linux,C/C++)