c++代码调试的学习笔记(代码片段)

songyuc songyuc     2023-01-06     777

关键词:

1. IO输出调试:输出重定向

在《第八期-C++基础与深度解析》课程中,老师使用了“输出重定向”的语句来查看coutcerr的结果:

./HelloWorld >txt1 2>txt2

代码含义:将程序HelloWorld的标准输出stdout重定向至文件txt1,将标准错误输出stderr定向至文件txt2

Note
这里“2>”中的“2”指的是stderr文件描述索引号2。

2. 常量代码展开:if constexpre

#include <iostream>

constexpr bool value = false;

auto fun() 
	if constexpr(value) 	
		return 1;
	 else 
		return 3.14;
	


int main() 

13.3 Compiler Explorer:可以查看编译生成的汇编代码

8.1.1 界面介绍

打开汇编分析器

操作路径:C++ sourceAdd new...Compiler;

8.2 VSCode调试

8.2.0 Variable substitution:变量代号

官方文档:Visual Studio Code Variables Reference

8.2.1 Launch.json:运行配置

Auto-generated demo


    "version": "0.2.0",
    "configurations": [
        
            "name": "C/C++: g++ 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "$fileDirname/$fileBasenameNoExtension",
            "args": [],
            "stopAtEntry": false,
            "cwd": "$fileDirname",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerArgs": "-q -ex quit; wait()  fg >/dev/null; ; /usr/bin/gdb -q --interpreter=mi",
            "setupCommands": [
                
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                ,
                
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                
            ],
            "preLaunchTask": "C/C++: cpp 生成活动文件",
            "miDebuggerPath": "/usr/bin/gdb"
        ,
        // the second config...
    ]

name:配置名称

name字段用来设置当前配置的名称,会出现在运行设置按钮的下拉列表中,不过目前并没有发现name会作为配置项的唯一标识符;

type:编译器类型

Systemtype-string
Ubuntucppdbg
Windowscppvsdbg

官方文档:Configure launch.json for C/C++ debugging in VSCode | type

request:指令类型

requesttype-string
launchlaunch the program
attachto attach a running instance

additionalSOLibSearchPath:搜索.so文件的路径

告诉GDB或LLDB要在哪些路径中搜索.so文件。使用分号;来分隔多个路径。例如:/Users/user/dir1;/Users/user/dir2

externalConsole:使用外部控制台

当声明为true时,表示产生一个外部控制台来运行程序。

关于为什么"miDebuggerArgs": "-q -ex quit; wait() fg >/dev/null; ; /usr/bin/gdb -q --interpreter=mi",可以屏蔽输出的猜想

这里其实用了两条gdb调试命令,第二个/usr/bin/gdb屏蔽了 VSCode-miDebugger隐含的gdb调试命令,并且同时屏蔽第一条 miDebugger-gdb的输出(-q)、之后退出(quit),并且用fg将此程序至于后台,然后重启开启一个gdb命令(/usr/bin/gdb)来用作真正输出时的gdb命令,有点偷梁换柱的味道;

不推荐使用"miDebuggerArgs": "-q -ex quit; wait() fg >/dev/null; ; /usr/bin/gdb -q --interpreter=mi",来清理VSCode的输出信息

从上面我们可以看到,这种“清理信息”实质上是替换了VSCode原有的调试命令,这种方式遵循VSCode原生的设计意图,于是其效果可能是不稳定的,这里不推荐使用;

8.2.2 Tasks.json:任务配置

Auto-generated demo


    "tasks": [
        
            "type": "cppbuild",
            "label": "C/C++: cpp 生成活动文件",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "$file",
                "-o",
                "$fileDirname/$fileBasenameNoExtension"
            ],
            "options": 
                "cwd": "$fileDirname"
            ,
            "problemMatcher": [
                "$gcc"
            ],
            "group": 
                "kind": "build",
                "isDefault": true
            ,
            "detail": "调试器生成的任务。"
        ,
        // the second task...
    ],
    "version": "2.0.0"

label:标签标识符

label关键字是当前task的唯一标识符(ID),用来区别不同的task。

options:设置环境选项,cwd, env, shell

官方文档:Tasks in Visual Studio Code | options
示例:

"options": 
	"cwd": "$fileDirname"

表示将工作目录设置为当前运行文件所在的目录。

problemMatcher:错误匹配器

VSCode-C/C++插件已经实现用于C++调试的problemMatcher,我们直接使用"$gcc"即可。

8.2.3 C_cpp_properties.json:C++项目配置

includePath:源代码路径

includePath的作用类似于CMake中include_directories
配置之后,VSCode会检索这些目录中包含的符号和函数,这样在使用include<>时包含第三方工具库时,语法检查就不会有红色波浪线的标号;

c++基础学习笔记(代码片段)

一、简介C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。二、基本语法1、注释#include<iostream>usingnamespacestd;intmain()/*这是注释*//*C++注释也可以*跨行*... 查看详情

c++异常处理的学习笔记(代码片段)

异常处理模板:try //输入一些代码catch(...) //捕获异常后,进行相关的处理关于C++中进行异常处理代码优化的讨论,可以参考《C++中错误处理的困境——OneFlow中的错误处理:Maybe》 查看详情

8086debug调试学习笔记(代码片段)

8086DEBUG调试学习笔记安装路径:D:\\DOSBox①mountcD:\\DOSBox②输入c:③再输入masm④输入汇编的文件名(如test)⑤link⑥再输入汇编的文件名⑦debugtest.exe-r查看寄存器-a-q使用Q命令来退出debug调试-t单步调试DATASEGMENTBUFDB'HELLO... 查看详情

c++学习笔记——递增运算符的重载(代码片段)

黑马C++课程学习笔记#include<iostream>#include<string>usingstd::cin;usingstd::cout;usingstd::endl;usingstd::string;usingstd::ostream;//重载递增运算符//自定义整形类,以实现对该类的递增运算操作classMyInteger fri 查看详情

c++学习笔记——递增运算符的重载(代码片段)

黑马C++课程学习笔记#include<iostream>#include<string>usingstd::cin;usingstd::cout;usingstd::endl;usingstd::string;usingstd::ostream;//重载递增运算符//自定义整形类,以实现对该类的递增运算操作classMyInteger fr 查看详情

c++基础知识的学习笔记(代码片段)

1常见术语Term中文解释Declare声明cv-qualification(const-and-volatile-qualification)cv限定Dangling悬挂Delegateconstructor委托构造函数Cv-qualification:const-and-volatile-qualification用的比较多的就是const限定符;2Namespace࿱ 查看详情

c++模板的学习笔记(代码片段)

1.函数模板1.1模板参数模板参数的确定顺序:显式指定隐式推导默认类型1.1.1函数模板特化特化示例:templatevoidfun(int)/templatevoidfun(int)Notetemplate关键字不能省略。2.类模板2.2偏特化有点类似于“模板式的函数重载”3.Q&A&#x... 查看详情

《c++多线程编程》学习笔记(代码片段)

文章目录线程安全的对象生命期管理当析构函数遇上多线程对象的创建对象池线程同步精要互斥器(mutex)条件变量(conditionvariable)慎用读写锁多线程服务器的适合模型与常用编程模型oneloopperthread+threadpool进... 查看详情

c++常见第三方扩展库的学习笔记(代码片段)

1.DALI依赖的第三方库-[DALI/third_party]Boost:C++功能性增强protobuf:数据序列化 查看详情

01梦开始的地方,阿仁的c++学习笔记(p2~)(代码片段)

 出于对未来职业需要的考虑和受大佬室友的影响,实习之余,本菜鸡将开始学习c++。用的是bilibil播放量最多的那个c++入门课程,环境是vscode,开此贴为笔记之用。1、第一个helloworld程序1#include<iostream>2usingnamespacestd;34intma... 查看详情

c++并发学习笔记(代码片段)

基础的定义略过,这里只记录一些细节。std::async自动创建一个线程(或从内部线程池中挑选)和一个promise对象。然后将std::promise对象传递给线程函数,并返回相关的std::future对象当我们传递参数的函数退出时,它的值将... 查看详情

c++学习笔记(代码片段)

C++学习笔记C++简介C++基本语法C++修饰符类型C++运算符C++数据类型C++变量类型C++变量C++常量C++循环C++判断C++函数C++数字C++数组C+ 查看详情

c++学习笔记ide配置的学习笔记(代码片段)

...Shift+Delete快捷面板F1VSCode推荐插件ErrorLens:可以在代码行旁边显示错误提示。PlantUML插件安装插件依赖:Java运行环境可能存在的依赖:graphviz关于PlantUML插件的安装和环境配置,请参考《vscode配置plantuml》2.CLion快... 查看详情

c++语法学习笔记(代码片段)

一、智能指针unique_ptrunique_ptr是C++11提供的用于防止内存泄漏的智能指针。1.1、unique_ptr的实现原理实现方式:unique_ptr对象封装了一个原始指针,并管理了他的生命周期,即当该对象被销毁时,会自动在其析... 查看详情

c++学习笔记:c++11新特性学习(代码片段)

C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++TechnicalReport1(TR1&# 查看详情

c++文本处理的学习笔记(代码片段)

1.使用内存字符流来加速字符串拼接我们可以使用ostringstream来加速多次字符串的拼接操作,因为string内部是用字符数组实现的,直接使用+操作符进行字符串拼接,会导致频繁的数组的内存申请和数据复制,从... 查看详情

c++基础学习笔记c++语法之引用(代码片段)

文章目录引用引用概念引用的使用方式:引用特性常引用使用场景传值、传引用效率比较引用和指针的区别引用引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空... 查看详情

c++链表学习笔记(代码片段)

如果要保存一些数据类型相同的变量,比如n个int类型的变量,就可以存放在一个数组中,然后通过下标方便的访问。可是数组的缺点也比较多,第一个就是在声明数组的时候,数组的长度必须是明确的,... 查看详情