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

news2024/11/16 23:56:31

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<>时包含第三方工具库时,语法检查就不会有红色波浪线的标号;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百趣代谢组学分享:从SWATH到MRM:一种新型高覆盖度靶向代谢组学技术

百趣代谢组学文献分享&#xff0c;SWATHtoMRM: Development of High-Coverage Targeted Metabolomics Method Using SWATH Technology for Biomarker Discovery&#xff0c;是由中国科学院生物与化学交叉研究中心&#xff0c;Dr. Zheng-Jiang Zhu课题组发表在AC上的一篇技术型文…

verilog学习笔记- 3)SignalTap II 软件的使用

目录 SignalTap II简介&#xff1a; SignalTap II使用&#xff1a; SignalTap II简介&#xff1a; SignalTap II 全称 SignalTap II Logic Analyzer&#xff0c;是第二代系统级调试工具&#xff0c;可以捕获和显示实时信号&#xff0c;是 一款功能强大且极具实用性的 FPGA 片…

IO模型详解

什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll跟IO模型有什么关系?有几种经典IO模型呢?BIO、NIO、AIO到底有什么区别的? 什么是IO呢? IO,英文全称是Input/Output,翻译过来就是输入/输出。平时我们听得挺多,就是什么磁盘IO,网络I…

LCHub:2023年低代码开发平台市场规模将增长25%至100亿美元

随着企业希望变得更加敏捷、业务流程更加自动化,并创建新的Web和移动应用来满足消费者的需求,自动化开发工具正在成为关键因素,尤其在IT人才持续短缺的情况下。 根据调研机构最近进行的一项研究,面对持续的IT技能短缺,低代码和无代码平台等能够实现流程自动化并使员工能…

便捷生活,你我共享 | 美格智能Cat.1模组为共享经济赋能

近年来&#xff0c;共享经济在国内的兴起&#xff0c;主要基于两大优势&#xff0c;一是资源共享&#xff0c;为人们的生活带来便捷&#xff1b;二是绿色低碳&#xff0c;符合社会的发展潮流。作为近年来经济发展的新业态&#xff0c;共享经济的快速普及&#xff0c;以及带来的…

SpringMVC的请求参数传递

1&#xff0c;简单参数类型 单个参数 发送&#xff1a; http://localhost/commonParam?nameitcast接收&#xff1a; Controller public class UserController {RequestMapping("/commonParam")ResponseBodypublic String commonParam(String name){System.out.pr…

LeetCode:12. 整数转罗马数字

12. 整数转罗马数字1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 罗马数字包含以下七种字符&#xff1a;I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V …

带有数字化伪装外观,全新ID.7轿车即将全球首发

一切就绪&#xff0c;ID.7即将出场&#xff01;今年的CES展会将于2023年1月5日至8日在拉斯维加斯举行。展览期间&#xff0c;大众汽车集团&#xff08;美国&#xff09;将展出基于模块化电驱动平台&#xff08;MEB&#xff09;打造的首款纯电三厢轿车。展车将采用智能伪装外观&…

Vue3+TS封装axios

1.实现最基础的封装 将其封装为一个类&#xff0c;而不是一个函数的原因是因为类可以创建多个实例&#xff0c;适用范围更广&#xff0c;封装性更强一些。 index.ts // index.ts import axios from axios import type { AxiosInstance, AxiosRequestConfig } from axiosclas…

爬虫学习-selenium模块

与爬虫的关联可以便携的获取网站中动态加载的数据便携实现模拟登录基于游览器自动化的一个模块&#xff08;按键精灵脚本&#xff09;使用流程环境安装pip install selenium下载一个游览器的驱动程序&#xff1a;谷歌浏览器驱动安装 - 琳达的博客 - 博客园 (cnblogs.com)from s…

测试开发 | TestNG 与 Junit 对比,测试框架如何选择?

TestNG 和 Junit 作为两大流行的测试框架&#xff0c;有哪些区别&#xff1f;各有哪些优缺点&#xff1f;该如何选择呢&#xff1f;这里简要总结下&#xff1a;1. Junit 更适合隔离性比较强的单元测试&#xff1b;2. TestNG 是比 Junit 涵盖功能更全面的测试框架&#xff0c;具…

世界第一虚拟乐队举办了一场 AR 音乐会 #Gorillaz

“世界第一虚拟乐队” 是谁&#xff1f;23 年前&#xff0c;一支名为 Gorillaz 的乐队在英国埃塞克斯横空出世。和当时主流乐队形式不同的是&#xff0c;这支乐队以虚拟形象出现&#xff0c;凭借着过硬的音乐制作实力和别具一格的虚拟乐队形象&#xff0c;不久后就席卷了全球&a…

如何打造敏捷项目管理团队?【金曼说4】

曾经乔布斯说过他此生最骄傲的事不是创造了苹果&#xff0c;而且团队。由此也说明团队的重要性。一支优秀的团队能打造出无数优秀的产品和项目。无论是在商场还是战场上&#xff0c;快速反应和适应能力都至关重要&#xff0c;在技术和干扰性力量导致变革速度加快的时代更是如此…

HTML 常见面试题

一、HTML5&#xff08;超文本标记语言&#xff0c;第五次重大修改&#xff09;二、HTML5新特性①&#xff1a;新的语义标签 header footer nav aside article section②&#xff1a;新的表单控件 calendar date time email url search③&#xff1a;音频、视频&#xff08; aud…

地产2022价值启示录:房企必须闯过的“三重门”

回顾2022年&#xff0c;中国最大的经济变向之一&#xff0c;无疑就是地产增量时代的落幕。过去一整年&#xff0c;地产行业在“冷热交替”中前行。上半年&#xff0c;疫情、交付延期、停贷潮等阴霾萦绕在众多房企头顶上&#xff0c;市场需求疲软之下业绩下滑&#xff0c;难以看…

《MySQL系列-InnoDB引擎10》InnoDB关键特性-异步IO

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 异步IO 为…

在外打工好久不回老家,用python为家里贴上新年春联

每逢春节&#xff0c;无论城市还是农村&#xff0c; 家家户户都要挑漂亮的红春联贴于门上&#xff0c;辞旧迎新&#xff0c;增加喜庆的节日气氛。 唠叨神话 据说这一习俗起于宋代&#xff0c;在明代开始盛行&#xff0c; 到了清代&#xff0c;春联的思想性和艺术性都有了很…

SpringBoot @ConfigurationProperties使用详解

SpringBoot ConfigurationProperties使用详解 目录SpringBoot ConfigurationProperties使用详解1.1 简述1.2 场景一1.3 场景二1.4 场景三1.5 聊聊EnableConfigurationProperties1.1 简述 在Spring Boot中注解ConfigurationProperties有三种使用场景&#xff0c;而通常情况下我…

51单片机学习笔记_6 IO通信:电脑与单片机之间的通信

通信 单片机还可以通过IO口实现多种通信。 串行通信&#xff1a;一条数据线&#xff0c;一次发1bit&#xff0c;发很久。 并行通信&#xff1a;多条数据线&#xff0c;同时发送&#xff0c;发的速度快多了但是费用高、接收困难、抗干扰性差。 异步通信&#xff1a;发送和接…