IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> c++跨平台软件 vscode 各个平台下的debug教程 -> 正文阅读

[开发工具]c++跨平台软件 vscode 各个平台下的debug教程

相关概念

一般来说我们分析BUG,大概分为两种

  • 根据软件内部已有的插桩日志,记录关键节点信息、重要函数的输入输出,根据这些信息判断bug
  • 调试(Debug),让代码一步一步执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据,根据这些信息分析bug。

日志

日志这种方式,优点在于离线,但更多基于完备的日志信息,依赖代码内部的插桩日志的详尽程度,如果现存日志未捕获bug信息的日志的话,那么bug分析的形式就变成了如下,中间反复验证猜测编译及bug复现实际上是效率非常低的。

Created with Rapha?l 2.3.0 开始分析 加日志 复现bug 确认现有日志是否可定位问题? 结束 yes no

调试

调试(Debug)是软件开发的基石之一,调试则依赖调试器(debugger)
常见的debugger有以下几种

名称特点
Visual Studio windows Debugger如名,windows 平台常见debugger
GDBLinux 下使用最多的一款调试器,各个平台都有其实现
LLDBMac OS 常用调试器

总的来说,gdb主要用于以下几个功能

  • 程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量;
  • 可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试;
  • 程序执行过程中,可以改变某个变量的值,从而尝试复现bug或者修改程序中出现的逻辑错误。

基础的概念了解到这里,下面进入实操。

实操

vscode C++插件

在这里插入图片描述

切换debug模式

基本类似gcc里面的-g -O0,注意不同编译器可能不同实现

windows平台

由于windows平台我们各个sdk编译器使用的都是msvc,windows平台使用的debug为Visual Studio windows Debugger。
我们可以直接使用vs这个ide直接进行debug,不需要任何配置,也可以使用vscode 配置c++插件 进行debug,由于ide debug很简单,再加上个人主要以vscode主力开发工具,本文也主要以vscode为例。

点击侧边栏运行与调试、添加配置
在这里插入图片描述
添加windows debugger,附加启动选择看需求

  • 附加:附加到已运行的程序进行调试
  • 启动:新启动一个程序从main开始调试
    在这里插入图片描述
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(Windows) 启动",  
            "type": "cppvsdbg",   //调试器类型  vs windows debugger
            "request": "launch",  //调试类型  启动
            "program": "${workspaceFolder}/build/install/app/tutorial_cpp.exe",  //启动程序
            "args": [],  //程序入参
            "stopAtEntry": true,   //   在main函数入口停止
            "cwd": "${workspaceFolder}/build/install/app/",   //工作路径,影响程序相对路径,sdk内部lic获取和log日志生成路径为相对路径
            "environment": [],                 //环境变量
            "console": "externalTerminal"      //控制台
        }
    ]
}

F5开始调试,基本的断点,条件断点,堆栈,寄存器,变量监控,堆栈显示都支持

x86 linux

与windows大同小异,只是vscode c++插件的 lanuch配置有稍许区别,选择GDB 启动

        {
            "name": "(gdb) 启动",
            "type": "cppdbg",   // gdb
            "request": "launch",
            "program": "${workspaceFolder}/build/linux/install/app/tutorial_cpp",  
            "args": ["astraplus_intrinsic.txt","0"],  
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}/build/install/app/",
            "environment": [],
            "externalConsole": false,  
            "MIMode": "gdb",   // gdb
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }

F5开始调试

其他

需要注意,linux使用的是gdb,vscode除了自身的一些debug支持,还另外支持gdb的命令,在调试控制台输入-exec <command>

gdb也是一个功能非常强大的调试系统,比如 内存读写断点,这个在分析堆栈溢出或者数组越界读写导致的一些莫名奇妙的bug非常有效。
除此之外还有很多内容,可以按需自行了解。
在这里插入图片描述

AM、HSI、RK等嵌入式 linux

嵌入式设备调试依赖gdb和gdbserver远程调试,gdb和gdbserver一般作为交叉编译链的一部分。

直接将对应嵌入式设备的gdbserve拷贝到板端,设置PATH或者直接gdbserver丢到bin/目录下。

注意debug模式

gdbserver 10.10.71.195:9995 ./tutorial_cpp 1 1 1 astraplus_intrinsic.txt 0

ip指定为板端ip,端口自定,tutorial_cpp 为执行app,后面的为app参数
板端会提示如下信息

Process ./tutorial_cpp created; pid = 7501
Listening on port 9995

接下来配置,编译端的launch配置

        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/install/app/cli",
            "args": ["1","1","1","astraplus_intrinsic.txt","0"],  
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}/build/install/app/",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/home/keras/wangcc/toolchains/gcc-linaro-aarch64-linux-gnu-7.3.1-2018.05/bin/aarch64-linux-gnu-gdb",   // 需要自行添加,gdb的路径 
            "miDebuggerServerAddress": "10.10.71.195:9995",    //自行添加板端gdbserver ip和端口
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }

F5开始调试,载入dll后,板端就会提示如下信息

Listening on port 9555
Remote debugging from host 1.1.1.1

debug方法,与x86 linux没有本质区别,只是加上了gdbserver以支持远程调试。

调试的不足

如上文,debug主要依赖编译器生成的调试信息以及低优化等级(-g -O0),来获取较好的调试体验,但是生产环境优化等级都为-O3,也就是生产环境和测试环境的不一致,在某些bug类型会导致生产环境容易复现,测试无法复现的问题,比如性能类bug,虽然可以把debug版本调整优化等级,以尽可能与生产环境一致,但这种调试体验可能较差,编译器指令乱序、寄存器优化,有可能会导致调试时代码并没有按源代码顺序执行,变量无法读取的问题。基本属于核心不可调和的矛盾,这种时候只能日志及调试各种方式都利用上了。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:08:05  更:2021-09-01 12:10:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/22 22:54:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码