c++26新功能—debugging库

基于GCC/Eclipse的TI CC26xx/CC13xx无线MCU开源开发环境搭建与调试指南 在嵌入式系统开发中,GNU工具链(GCC/GDB)与Eclipse IDE的组合为开发者提供了高度自由、跨平台且透明的开发工作流。其核心原理在于利用GCC编译器将C/C++源码编译为目标文件,再通过链接器脚本精确控制代码和数据在芯片内存(如Flash和SRAM)中的布局,这是嵌入式程序能否正确启动和运行的关键。这套开源方案的技术价值在于,它打破了厂商专属IDE的束缚,让开发者能够深入理解从源码到二进制固件的完整构建过程,特别是对内存映射、启动流程和中断向量表的掌控,这对于优化资源受限的嵌入式系统至关重要。在 阅读详情

一、诊断库

最近在看欧洲战场的分析,很多军事相关的资料都提到了体系战。其实不光军事如此,其它的领域也是如此。在计算机的世界,特别是编程语言的环境中更是如此。语言要想发展,从标准到实现,从调试工具到编译链接的工具链等一系列的相关技术都得同步跟进和发展。所以谓军事上的体系,在这里其实可以叫做生态。
C++语言也无法脱离这个情况,从最初的标准到现在最新的标准,从没有IDE到有IDE,从使用命令调试到使用界面调试,从人工处理相关的代码检查到命令再到AI,凡此等等,其实都是各种技术互相促进发展的结果,是一个C++生态自己从动态变化到稳定再到动态变化并如此不断重复的过程。
C++发展到今天不是一两次暴发式的发展形成的,是不断的完善不断的创新的结果。在C++26中,推出了更加完善的诊断库的支持,主要包括标准库组件以及工具链的增强。引入诊断库后,可以更好的提高开发到调试以及错误控制的效率。
本文重点分析一下标准库引入的debugging库。

二、debugging库的主要内容

在C++26的标准库中主要引入了以下几个调试函数:

  1. breakpoint
    无条件断点(应用过GDB调试的就很容易理解),当调用时暂停正在运行的程序,它是自定义实现的。它会尝试临时停止程序并且无论是否检测到调试器都将会控制权转给调试器。其主要是对运行时通过断点进行控制,即使出现超调试器的范围也不能会导致程序的退出。
    此函数的标准化了很多已经现有的工具,如__builtin_debugtrap(LLVM),__debugbreak(Win32 API),debugger_break(boost.test), assert(false), _asm { int 3 } (MSVC) 和 asm(“int3”) (GCC/clang)等等(x86平台)。

  2. breakpoint_if_debugging
    类似于条件断点,会try临时暂停程序的运行并可以将相关控制权转移到调试器(假设存在的情况下,否则视为空操作),可由开发者自定义实现。如果 std::is_debugger_present 返回 true,则调用 std::breakpoint。等价于:

if (std::is_debugger_present())
    std::breakpoint();
  1. is_debugger_present
    检查程序是否在调试器的控制下运行,注意此函数是可替换的即可自定义实现。此函数允许自行定义和打印额外的诊断信息及执行相关的测试代码等,等于是给了开发者一个注入点。
    这三个函数的定义为:
namespace std {
  // debugging utility
  void breakpoint() noexcept;
  void breakpoint_if_debugging() noexcept;
  bool is_debugger_present() noexcept;
}

三、例程

看一个简单的例程:

//Linux环境
#include <debugging>
#include <string>
#include <iostream>
 
bool is_debugger_present() {
    std::ifstream status("/proc/self/status");
    std::string statusLine;
    while (std::getline(status, statusLine)) {
        if (statusLine.starts_with("TracerPid:")) {
            return statusLine.find("0") == std::string::npos;
        }
    }
    return false;
}
void printlnDumpState(){
  //输出相关信息
}
int main(){
    if (std::is_debugger_present()) {
       std::cerr << "start debugging...\n";
       printlnDumpState();
       std::breakpoint();
    }

return 0;
}

代码很简单,大家明白这个意思就可以了。

四、总结

现在人们都说世界是个草台班子,意思就是说大家不要把很多东西想得多么高大上,正如俗语“锦袍下全是虱子”,道理相通。其实确实如此,所有的事物都是如此发展变化的,只要努力前进,就会如庄子说的:其作始也简,其将毕也必巨!

【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL 生成器的任务是接收随机噪声向量作为输入,并尽可能生成与真实数据相似的样本,而判别器则是一个二分类器,旨在区分输入的样本是来自生成器生成的,还是来自真实数据。在训练过程中,生成器和判别器通过对抗学习的方式相互博弈,生成器的目标是生成足以欺骗判别器的样本,而判别器的目标则是尽可能准确地判断样本的真实性。GAN网络在多个领域展现了强大的能力,能够生成与训练数据分布相似的新数据,包括但不限于图像生成、图像风格转换、超分辨率、数据增强、视频生成、自然语言处理、医学图像处理以及游戏与虚拟现实等。 阅读详情

相关推荐

OpenWRT二级路由DHCP客户端配置:实现IPv4 WAN自动获取与网段隔离

本文详细讲解了如何将OpenWRT配置为二级路由器,重点在于设置其WAN口为DHCP客户端以自动获取IPv4地址,并修改LAN口网段实现与上级网络的隔离。文章提供了从网络拓扑规划、具体配置步骤到防火墙设置的完整指南,并分享了常见问题排查与避坑经验,帮助用户构建稳定且功能独立的家庭网络环境。

weixin_29268267的博客 293

C++26 新增 <debugging>:用标准库原生判断调试器并下断点

写 C++ 的人大多都干过这件事:为了排查一个问题,在代码里塞一堆 std::cerr << ...,或者手写 ifdef DEBUG 包起来的日志,甚至偷偷调用平台私有 API 判断"现在是不是被调

aifannihao的博客 148

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

况老师话竞赛&blog 2201

CppCon 2024 学习: C++26 Preview

以前只能写固定字符串C++26 可以动态生成信息:也可以用宏c_assert包装,提高可读性调试增强→ 动态,用户信息,调试器支持结构化绑定增强→ 条件语句中绑定、占位符、属性支持类型协议扩展→ complex 的 tuple 协议C++26 特性调试增强∪结构化绑定增强∪类型协议扩展\text{C++26 特性} = \text{调试增强} \cup \text{结构化绑定增强} \cup \text{类型协议扩展}C++26特性调试增强∪结构化绑定增强∪。

虾球 1022

Vivado ILA抓不到低频信号?试试Capture Control模式,保姆级配置教程(附PWM调试实例)

本文详细解析了Vivado ILA的Capture Control模式在低频信号捕获中的应用,特别针对PWM调试等场景提供保姆级配置教程。通过条件采样和时间拉伸技术,有效解决传统ILA采样在低频信号调试中的存储深度不足、关键信号丢失等问题,并附赠呼吸灯PWM的完整调试实例,帮助FPGA开发者提升调试效率。

weixin_42549451的博客 350

总结所有的池化(Pooling)方法

为什么池化? 池化(Pooling)层和卷积层、全连接层一样,都是卷积神经网络的组成部分。 卷积神经网络中的卷积层会将卷积Filter应用于输入图像,以便创建特征映射来总结输入中这些特征的存在。 卷积层被证明是非常有效的,在深层模型中叠加卷积层可以让接近输入的层学习低层特征(如线条),在模型中更深(高)的层用于学习高阶或者更抽象的特征,如形状或特定对象。 卷积层特征映射输入的一个局限性是它们只能精确记录特征在输入层的位置。这意味着在输入图像中特征位置的小幅移动将导致不同的特征映射。这可以随着重新裁剪

大脸猫的博客 1万+

VSCode 的扩展包C/C++ IntelliSense, debugging, and code browsing的IntelliSense功能无法使用

文章目录1.说明2.结论 1.说明 在公司内网条件下,即出现以下的错误,就是不能连接微软的相关网站,从github上更新离线vs code扩展包的结果就是,扩展包安装完毕,却不能完全使用。 eg:C/C++ IntelliSense, debugging, and code browsing(VSCode Cpptools)内网条件下,依赖包可能不能更新完全,代码的跳转等功能不能使用,这是扩展包...

喜欢打篮球的普通人 1万+

汽车软件工程师必看:ASPICE开发流程全解析(附各阶段交付物清单)

本文全面解析了汽车行业广泛采用的ASPICE开发流程,详细介绍了从需求挖掘到系统架构设计、软件工程及测试验证各阶段的关键操作和交付物清单。针对汽车软件工程师,提供了实用的协作指南和工具推荐,帮助团队提升开发效率并降低项目风险,是掌握ASPICE标准的必备指南。

weixin_30733003的博客 647

Modern-CPP-Programming 课程指南:29 讲从 C++03 到 C++26 的现代 C++ 知识体系

Modern-CPP-Programming 是一套开源、开放获取的现代 C++ 编程课程,由软件工程师 Federico Busato 编写并持续维护,面向已经熟悉 C 语言与面向对象编程、希望系统进阶到 C++ 熟练水平的开发者。本文基于仓库根目录的 [README.md](https://link.gitcode.com/i/55bab206767388d7f812218083cc3894)

gitblog_00823的博客 212

Java对接(BSC)币安链 | BNB与BEP20的开发实践(三)水龙头 WEB3

这一节我们讲一个币安测试链如何获取到BNB、USDT等BEP20数字货币(水龙头)来让我们前期测试开发。如图:我们将创建的地址填入相应输入框,来获取到测试BNB以及其他BEP20数字币。发币可能需要交易等待,请耐心等待即可,交易完成后,币会到达您的地址内。上一节我们用代码来实现BNB转账、BEP20转账、链上交易监控。2.MetaMask(小狐狸)浏览器插件 🪜。使用EDGE浏览器可以在浏览器直接打开。使用Chrome浏览器,请使用🪜打开。基本工作就绪后,即可进行开发测试。3. 测试区块链浏览器 🪜。

大猩猩的专栏 2790

FPGA/IC 秋招笔试/面试题总结(续)

FPGA/IC 秋招笔试/面试题总结(续)来啦… 文章目录二十七、状态机1. Moore/Mealy状态机2.一、二、三段式状态机 二十七、状态机 1. Moore/Mealy状态机 (1)Moore状态机: 输出只由当前状态决定,即次态=f(现态。输入),输出=f(现态) Moore型状态机的输出信号是直接由状态寄存器译码得到的。 Moore型状态机检测序列1101如下 Moore型状态机输出函数只由状态变量决定,想要输出Z=1,必须S4状态形成,即寄存器中的1101都打进去后才可以。输出Z=1会在

Crazzy_M的博客 2万+

LoaderLock错误:Managed Debugging Assistan(MDA)

原文地址 http://blog.sina.com.cn/s/blog_5afaebf50100ag26.html

vivianshen0406的专栏 589

【系统分析师】2026年上半年真题:论文及解题思路

四篇论文围绕系统与开发实践展开: 安全架构设计强调数据加密(国密算法)、零信任访问控制及容灾架构,以某医疗云平台为例,实现RTO<5分钟的高可用保障。 架构风格应用解析微服务/事件驱动等风格选型,结合电商平台案例,通过服务拆分与异步通信提升扩展性。 需求评审机制提出正式评审与走查结合的方法,在金融系统中减少30%返工,解决业务规则二义性问题。 LLM测试生成利用大模型从需求/代码生成用例,辅以人工校验,使测试效率提升50%,覆盖边缘场景。 各篇均遵循“背景-理论-实践”结构,突出

数据知道的博客 784

CppCon 2025 学习:Debugging C++ Coroutines in GDB

C++ 协程调试难点状态机复杂性调试器需要追踪暂停点和 promise异步调用栈不连续GDB 支持改进基本调试功能可用局部变量、参数和 promise 可见悬挂协程和 async 调用仍然麻烦实际应用协程非常适合处理流式数据、异步事件和松耦合算法例如 Knuth 的字符串解码问题Input/Output 协程拆分In()负责生成解码字符Out()负责按规则格式输出协程优点无需显式管理缓冲区和循环字符逐个产生,按需消费 →惰性生成易处理复杂输出分组。

虾球 702

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VS10异常.[_ITERATOR_DEBUG_LEVEL][_HAS_ITERATOR_DEBUGGING]

1、今天(20190117)在编译 Debug版本的时候 报错:   qtmaind.lib(qtmain_win.obj):-1: error: LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(main.obj 中)   ZC:我记得是 在之前的项目中 使用 C++ STL 容器的时候,Debug版本的哪个容器 有BUG。   Z...

weixin_30455661的博客 737

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《Effective C++》资源管理:条款26-条款27

条款26尽可能延后变量定义式的出现时间。这个条款来讲明,如何高效定义变量。 条款27尽量少做转型动作条款。这个条款讲明,类型转换中要注意的问题。

KangRoger的专栏 2767

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++性能之巅m7姿

33. **调试代码技巧**:调试是定位修复bug的艺术。有效技巧包括:使用断点逐步执行、查看变量状态、阅读错误堆栈信息、打印日志(Logging)、单元测试隔离问题、以及使用Rubber Duck Debugging(小黄鸭调试法)理清思路。

2511_93063391的博客 852

UVA 11736 Debugging RAM

模拟题; 比赛的时候忘记把1变成64位的1了,跪了好久; 1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<string> 5 using namespace std; 6 7 unsigned long long val[250...

weixin_30797199的博客 94

shadPS4 macOS 源码构建指南:Xcode 26 + Homebrew 环境搭建、KosmicKrisp Vulkan 驱动与 CMake 编译运行全流程

本篇指南面向希望在 macOS 上从源码编译 shadPS4(C++ 编写的 PlayStation 4 模拟器)的开发者与进阶用户,完整覆盖从安装 Xcode、Homebrew 与依赖工具,到递归克隆仓库、配置 CMake 构建目录、并行编译,再到以 `eboot.bin` 启动游戏的可复现全流程。读完本篇,你将掌握 shadPS4 在 Apple Silicon Mac 上的构建原理、`ENA

gitblog_01004的博客 195

Debugging with GDB阅读[1]

Debugging with GDB已经有一份中文翻译,在这边中文翻译的基础上将文档中新增的部分以及没有翻译的后继部分进行翻译,对gdb达到一个质的应用。 这是第10部分的选出来的一些技巧 10.4 模糊表达式表达式有时会包含一些模糊的元素。例如,一些编程语言(特别是Ada,C++和Objective-C语言)允许一个简单的函数名在不同的语境中被定义多次。这就是所谓的重载。涉及Ada的另一个例...

weixin_33824363的博客 374

C/C++基础知识点面试题

目录 一、虚函数的数据结构,如何工作? 二、const与define的区别? 三、指针与引用的区别? 四、指针与数据的区别? 五、不用临时变量实现两个变量的交换 七、一个C++源文件从文本到可执行文件经历的过程 八、C++11新特性 九、C++和C的不同 十、malloc的原理 十一、内存泄漏、野指针 十二、static 十三、union和struct 十四、new与ma...

找个特立不独行的名的博客 2万+

如何给 AI 编码代理装护栏:Grok Plan Mode 与权限系统的场景化指南

我让 Grok 重构一个模块,代理还没探查完,就要跑一条危险清理命令、顺手直接推到远端,我后背一凉。Grok Plan Mode 与权限系统就是给 AI 编码代理装的护栏:这篇文章讲三件事——审批频率怎么调、危险操作怎么上锁、大任务怎么先画图纸再施工。 ## 如何调节 AI 代理的审批频率:Grok 权限模式全解 先说结论:权限系统本质上只回答一个问题——Grok 可以多久打断你一次。六个权限

gitblog_01086的博客 226

STM32裸机C++工程实战:从编译到GDB调试全链路

嵌入式C++并非简单将.cpp替换.c即可运行,其核心在于理解C++运行时在资源受限环境下的底层约束。在STM32等MCU上,需主动剥离异常处理、RTTI和动态内存依赖,通过编译选项(-fno-exceptions/-fno-rtti)、链接脚本定制(.init_array段)、new/delete重载及GDB深度调试等手段构建可验证、可量产的C++落地路径。技术价值体现在模块化封装能力提升、驱动复用性增强与调试可观测性改善;典型应用场景包括HAL库外设类封装、传感器管理器抽象、RTOS任务对象建模等。本文

weixin_34248487的博客 402

C++26 Contracts实战入门到高阶:手把手实现可调试、可优化、可测试的契约驱动开发(含GCC 14/Clang 18实测对比数据)

C++26合约编程实战教程入门到精通教程,助你系统掌握Contracts语法与工程落地方法。涵盖断言设计、编译期检查、运行时调试及GCC 14/Clang 18实测对比,实现可调试、可优化、可测试的契约驱动开发。值得收藏!

FuncTide的博客 156

UVA11736_Debugging RAM

题目绝对够水,我就不详细说明了。 直接上代码吧。只是提示一下要用 unsigned long long。 (不知道我不用字典树为什么会超时,肿么搞的) #include <iostream> #include <cstdio> #include <cstring> #define maxn 2300 #define ll uns...

weixin_30617737的博客 73

Tfs私有工程技术白皮书

非docker环境内编译需要的头文件可在编译时到docker内查找,通常位于/tmp/TfsBuild/e53bbb0b0da4e26d24b415310219b953/external路径下;

厉力文武 457
上一篇: 设计心得——如何架构选型
下一篇: c++26新功能—可观测检查点
fpcc
fpcc 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄22年 4040粉丝 1189原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值