一种基于VSCode的嵌入式开发的Windows平台可视化代码调试方法

关键字: VSCode、gdbserver、可视化调试、嵌入式开发

  • 案例简述

随着本组业务的扩大,新进组员的增多,在开发定制或者排查基线的问题时候,经常会遇到问题不是那么明显,不方便通过加打印的方式进行排查的问题,并且加打印排查的方式较为低效,使得调试过程极为痛苦。

可视化调试效率一直比命令行调试要方便和快捷很多,而嵌入式开发由于目标程序在开发板上,而不在编写代码本身的环境中,这样的程序运行环境和编译环境分离的情况,导致普通的集成开发环境并不能满足嵌入式开发可视化调试的需求。虽然嵌入式开发有gdbserver这种可以远程调试的工具,但由于部署环境较为复杂并且指令式的调试方法不友善等原因,一直鲜有人使用。

目前找到了一种基于VSCode的可视化嵌入式代码调试方式,可以近似于使用VS一样的进行代码调试,极大的增大了调试程序的便利性,使调试代码更加容易。

  • 案例分析和解决过程

环境部署:

  1. 交叉工具链需要支持gdb,gdbserver;
  2. 调试电脑上需要有VScode;
  3. 调试电脑上需要有arm-2014.05-29-arm-none-linux-gnueabi.exe,并且安装成功;
  4. 如果不满足上述第三条,也可以直接用VsCode的RemoteSSH的方式,如果不清楚可以去这里,VSCode加速自动补全和跳转语句,实现秒补全和秒跳转;这样电脑上无需安装上面的程序,直接使用交叉编译链里的对应的arm-xxxx-gnueabihf-gdb运行起来也可以。对应的选择不同的launch.json里面的不同配置就好

实际调试案例步骤:

  1. 用VSCode打开代码工程目录;
  2. 在VSCode自动生成的.vscode文件夹中新增launch.json文件,具体lanuch.json文件的配置方式如图2-1所示,其中:

miDebuggerServerAddress:这个地方填写的是板子的ip地址和在板子上需要启动的gdbserver启动参数中的端口号。

program:填写的必须是板子上运行的目标程序和工作文件夹之间的路径关系,最后虽然实际程序并不会运行,但是路径里最后的可执行文件必须和放到板子里的一致。

cwd:这个参数和program类似,但是不需要指定到具体的可执行文件上,而是可执行文件的所属目录。

miDebuggerPath:这个参数主要是填写环境部署中,arm-2014.05-29-arm-none-linux-gnueabi.exe这个程序安装好后,arm-none-linux-gnueabi-gdb.exe这个可执行程序的路径位置。

2-1  launch.json文件配置样例

         设置好后,将arm-at91-linux-gnueabi-gdbserver和目标程序一并加载至开发板中,在任意路径启动arm-at91-linux-gnueabi-gdbserver {主机ip:主机端口号} {目标程序路径},对于本例而言,即启动 arm-at91-linux-gnueabi-gdbserver 10.10.114.28:9001 ./hikTSC400。此事,板子上所有的操作完成,板子上会提示如图2-2的信息,并等待调试客户端连入。

         2-2  板子上启动gdbserver后提示

         此时,在设置好launch.json的VSCode客户端上,按F5进入调试模式即可连上板子并进行响应调试,可以发现板子上的程序开始执行。并且VSCode客户端中已经有相应的可视化调用栈,变量区域打印。

2-3  VSCode客户端开始调试时候的样例

值得说明的是,在可视化的模式下,也依旧支持命令行的方式进行控制,在DEBUG CONSOLE中依旧可以输入bt等常见gdb中指令,对代码进行调试。

备注:如果出现很多没有???的情况下,在图2-3输入-exec bt的地方,输入栏中加入如下字段,会有效果。

-exec set solib-search-path D:/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi/libc/lib

以上命令也可以直接在launch.json中加入以下语句,但务必要保证加在"miDebuggerPath"之前,这样就不必每次都输入-exec set solib-search-path了:

"additionalSOLibSearchPath": "D:/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi/libc/usr/lib;D:/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi/libc/lib",

备注:如果出现调用堆栈有函数入口名称但是不显示行号的时候,查看是否最后链接的时候用-g和在CXXFLAGS里加入-gstabs+

  • 经验总结、预防措施及建议
  1. 需要这样调试,必须是使用的交叉工具链带有gdb的功能,并且用–g选项对可执行程序进行编译。
  2. 对于一个已经进入死循环的程序,只要是-g模式编译的,一样可以在程序运行的过程中中途介入进行调试,方法为另启动一个shell,然后查看死循环程序的pid值,并运行arm-at91-linux-gnueabi-gdbserver {主机ip:主机端口号} –attach {PID号}的方式进行介入。
  • 从本文可导出的检查项(checklist)

对于arm-at91-linux-gnueabi-gdb启动报错的问题: arm-at91-linux-gnueabi-gdb: loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ??? 已放弃 (核心已转储)

需要在自己的bashrc中,新增export LC_ALL=C这个环境变量。然后重启vscode的服务端程序就好了。

暂无

  • 参考文献、标准、案例
  1. https://blog.csdn.net/zhaoxd200808501/article/details/77838933
  2. https://blog.csdn.net/wynter_/article/details/102481531

  • vscode  launch.json样例

{
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "at91_linux",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerServerAddress": "10.10.114.219:58975",
            "program": "${workspaceFolder}/monitor",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/",
            "preLaunchTask": "Environment Build",
            "externalConsole": true,
            "MIMode": "gdb",
            "targetArchitecture": "arm",  
            "additionalSOLibSearchPath": "/data1/xiaoyanyi/cross-tool/arm-at91-linux-gnueabi/arm-at91-linux-gnueabi/sysroot/lib/",
            "miDebuggerPath": "/data1/xiaoyanyi/cross-tool/arm-at91-linux-gnueabi/bin/arm-at91-linux-gnueabi-gdb",           
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
             
        },
        {
            "name": "imx6ul_linux",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerServerAddress": "10.10.114.220:58975",
            "program": "${workspaceFolder}/monitor",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}/",
            "externalConsole": false,
            "MIMode": "gdb",
            "targetArchitecture": "arm",  
            "additionalSOLibSearchPath": "/data1/xiaoyanyi/cross-tool/arm-imx6ul-linux-gnueabihf/arm-imx6ul-linux-gnueabihf/sysroot/lib/",
            "miDebuggerPath": "/data1/xiaoyanyi/cross-tool/arm-imx6ul-linux-gnueabihf/bin/arm-imx6ul-linux-gnueabihf-gdb",           
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        },
        {
            "name": "(gdb) pc启动",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerServerAddress": "10.10.117.251:9001",
            "program": "${workspaceFolder}/testccc",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}/",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "additionalSOLibSearchPath": "D:/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi/libc/usr/lib;D:/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi/libc/lib",
            "miDebuggerPath": "D:/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值