C++代码调试的学习笔记

Posted songyuc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++代码调试的学习笔记相关的知识,希望对你有一定的参考价值。

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++代码调试的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

EPLAN 学习笔记

EPLAN 学习笔记

爬虫学习笔记(二十)—— 字体反爬

C++谷歌开源项目glog学习笔记

jmeter学习笔记——一个简单的接口测试

python学习笔记012——pdb调试