首页 > 编程语言 >C++调试方法总结(VS Code & VS & dbg)

C++调试方法总结(VS Code & VS & dbg)

时间:2023-03-22 13:45:47浏览次数:41  
标签:Code 查看 C++ gdb VS 断点 目录 调试

一、 VS Code C++程序调试


1.1 配置C++运行环境

安装C/C++插件后打开C++设置界面:

选择编译器、c和c++标准,以及inteliSenseMode之后会在当前.vscode目录下生成一个c_cpp_properties.json文件,打开后如下所示:
linux

windows

代码文件结构规定:

├── include
│   └── *.h
├── out
│   └── app.exe
└── src
    └── app.cpp

1.2 编写launch.json文件

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [

        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/../out/${fileBasenameNoExtension}", // 可执行文件所在目录
            "args": [], // 可添加可执行文件后的参数
            "stopAtEntry": false,
            "cwd": "${fileDirname}/..", // src所在目录
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build", 
		// 在dbg前需要进行一项构建任务,任务名叫build,因此在tasks.json中要定义label="build"的task
        }
    ]
}

1.3 编写tasks.json文件

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "build", // 根据launch.json可以指定不同的构建任务,名字应与前面的preLaunchTask一样
            "command": "g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-I",
                "include", // 需要包含的目录(头文件所在目录)
			// 如果用到静态库可以用-L指定静态库所在目录,-l指定要包含的静态库名称
                "-o",
                "${fileDirname}/../out/${fileBasenameNoExtension}" // 可执行文件输出目录
            ],
            "options": {
                "cwd": "${fileDirname}/.." //src所在目录
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}



二、 VS C++程序调试

思路同上,在解决方案的属性中设置一下,需要包含相应头文件目录、链接库目录lib or dll(.a or .so所在目录)、指定工程所需的静态链接名xx.lib or xx.a、动态链接库放在对应的位置,然后按F5调试即可。



三、 dbg 调试总结

3.1 breakpoint

打断点

b 行号
b 文件名:行号
b 函数名:行号
b 位置 if condition

i b # 查看断点
r # 运行
c # 继续

d 断点编号、断点范围、all全部断点 # 删除断点
clear 函数名、函数名带参数、行号、文件名:行号 # 删除断点
disable 断点编号(或者范围用n1-n2表示)
enable 断点编号或范围n1-n2
enable once 断点编号 # 只启用一次断点
enable count 数量n 断点编号 # 只启用n次断点
ignore 断点编号 次数n # 过断点n次后才启用

save breakpoints <file> # 保存断点
source <file> # 根据保存断点的文件恢复断点

3.2 examine

查看地址

x /2bx &cnt # 从cnt地址开始查看后面两个内存地址,用16进制表示
x /2bc &cnt # 用char表示,查看两个char字符
x /2bs &cnt # 用字符串,查看两个字符串,起点位置为&cnt

# 格式
x /<length><format> <address>

3.3 gdb执行命令

r # 启动
c # 继续
s # 单步进入
n # 单步跳出,下一步
finish # 完成本函数
where # 显示当前执行的具体函数和代码

kill # 停止程序
quit # 退出gdb,简写为q

attach 进程号 # 附加进程方式调试
detach # 退出附加调试

3.4 gdb查看命令

bt # backtrace 显示调用堆栈信息
bt 堆栈数 # 显示指定数量的堆栈
bt -堆栈数 # 从大到小的编号显示堆栈
bt full # 显示所有堆栈的局部变量
f # 显示当前栈帧
up n # 上移n个位置
down n # 下移n个位置
info locals # 查看当前帧的局部变量

print 变量名 # 查看变量值 (文件名:变量名)
ptype 变量 # 查看变量类型
ptype 数据类型 # 查看类型信息
set print pretty # 格式化结构体输出
set print array on/off # 数组友好显示与否

3.5 gdb远程调试

1. 启动gdbserver,指定端口号

gdbserver host:port program [arg1 arg2 ...]

2. 本地机器上打开gdb,连接到远程服务器

gdb program
target remote host:port
3. 本机上进行调试,和本地调试一样
(gdb) break main
(gdb) run
(gdb) next
(gdb) print variable
...

3.6 Release & Debug版本调试

g++ -g main.cpp -o main # 输出的为debug版本(无编译优化)
g++ main.cpp -o main # 输出的为release版本(release版本还会有编译优化的参数)

3.7 core文件调试分析

gcore xxx.core # 生成core文件
gdb debug模式下的可执行文件 core文件 (例: gdb ./debug/main xxx.core)
gdb对core文件调试分析:

  1. 用i thread查看线程情况;
  2. thread num切换到num编号的线程;
  3. f num打印num编号的栈帧信息,分析问题。

标签:Code,查看,C++,gdb,VS,断点,目录,调试
From: https://www.cnblogs.com/raiuny/p/17231742.html

相关文章

  • 【LeetCode贪心#12】图解监控二叉树(正宗hard题,涉及贪心分析、二叉树遍历以及状态转移)
    监控二叉树力扣题目链接(opensnewwindow)给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所......
  • C/C++手机通信录[2023-03-22]
    C/C++手机通信录[2023-03-22]程序设计题目5:手机通信录【问题描述】用C/C++设计出模拟手机通信系统,能实现对手机中的通信录进行添加、修改、查询等功能。【基本要求】......
  • C++数组类型中存入结构体类型对象
    最近看Binder机制的时候看到一个unsigned类型数组中不仅可以存放unsignedint类型还可以存放结构体对象,感到十分惊奇,下面我们来看一下uintptr_t类型和指针类型的区别uin......
  • 链表操作-leetcode23-删除倒数第几个节点
    给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例1:示例2:输入:head=[1],n=1输出:[]示例3:输入:head=[1,2],n=1输出:[1]提示:链表中结......
  • 踩坑纪实:UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 21-22:
    问题出现过程切换新的服务器之后,使用PyExecJS库报错...ctx=execjs.compile(js_str)version_obj=ctx.eval('exportObj')报错内容:UnicodeDecodeError:'utf-8'co......
  • LeetCode15. 三数之和
    题目描述:给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你......
  • C++ 字符串转16进制
    参考出处:https://blog.csdn.net/FinalCreed/article/details/71037420stringstring2hex(conststring&str){stringtemp;stringstreamss;stringresul......
  • Hbase报错ERROR: KeeperErrorCode = NoNode for /hbase/master
    场景在上面搭建Hadoop和Hbase的基础上,三台服务器全部重启了。再执行hbase的命令时提示:ERROR:KeeperErrorCode=NoNodefor/hbase/master 注:关注公众号霸道的程序猿获......
  • C++查询ip归属地(QT)
    以查询ip归属地的例子来学习C++的API接口调用。常见的API接口可能会给出post及get两种访问方法,我们先学习较为简单的get方法。首先是找到相关的接口,如https://ip.userage......
  • 【转载】C++ 有用的资源
    https://www.runoob.com/cplusplus/cpp-useful-resources.html C++ 有用的资源以下资源包含了C++有关的网站、书籍和文章。请使用它们来进一步学习C++的知识。C+......