【C语言】调试宏:进阶篇

前言

调试是软件开发过程中不可或缺的一部分。使用宏可以帮助我们在编译时就植入调试信息,从而在运行时捕获关键的数据点或者行为。这些宏通常用于打印变量的值、跟踪函数调用、检查断言等。

基础调试宏

1. 打印变量的值

宏定义

#define DEBUG_PRINT(x) printf("DEBUG: %s = %d\n", #x, x)

使用案例

假设我们有一个简单的函数 `calculate`,它计算两个数的和。
#include <stdio.h>

void calculate(int a, int b) {
    DEBUG_PRINT(a);
    DEBUG_PRINT(b);
    int sum = a + b;
    DEBUG_PRINT(sum);
}

int main() {
    calculate(5, 10);
    return 0;
}

输出
DEBUG: a = 5
DEBUG: b = 10
DEBUG: sum = 15

2. 跟踪函数调用

宏定义

#define FUNCTION_ENTER() printf("Entering function %s\n", __FUNCTION__)
#define FUNCTION_EXIT() printf("Exiting function %s\n", __FUNCTION__)

使用案例

让我们扩展之前的 `calculate` 函数,添加函数调用的跟踪。
#include <stdio.h>

void calculate(int a, int b) {
    FUNCTION_ENTER();
    DEBUG_PRINT(a);
    DEBUG_PRINT(b);
    int sum = a + b;
    DEBUG_PRINT(sum);
    FUNCTION_EXIT();
}

int main() {
    FUNCTION_ENTER();
    calculate(5, 10);
    FUNCTION_EXIT();
    return 0;
}

输出
Entering function main
Entering function calculate
DEBUG: a = 5
DEBUG: b = 10
DEBUG: sum = 15
Exiting function calculate
Exiting function main

进阶调试宏

3. 断言检查

宏定义

#define ASSERT(condition) do { \
    if (!(condition)) { \
        fprintf(stderr, "Assertion failed: %s in %s:%d\n", #condition, __FILE__, __LINE__); \
        abort(); \
    } \
} while (0)

使用案例

现在我们将使用 `ASSERT` 来确保传入 `calculate` 的参数是非负数。
#include <stdio.h>
#include <stdlib.h>

void calculate(int a, int b) {
    FUNCTION_ENTER();
    ASSERT(a >= 0);
    ASSERT(b >= 0);
    DEBUG_PRINT(a);
    DEBUG_PRINT(b);
    int sum = a + b;
    DEBUG_PRINT(sum);
    FUNCTION_EXIT();
}

int main() {
    FUNCTION_ENTER();
    calculate(-5, 10); // This will trigger an assertion failure
    FUNCTION_EXIT();
    return 0;
}

输出
Entering function main
Entering function calculate
Assertion failed: a >= 0 in filename.c:13
Aborted

4. 动态调试级别

宏定义

#ifndef DEBUG_LEVEL
#define DEBUG_LEVEL 0
#endif

#define LOG(level, fmt, ...) do { \
    if (level <= DEBUG_LEVEL) { \
        printf(fmt, ##__VA_ARGS__); \
    } \
} while (0)

#define LOG_INFO(fmt, ...) LOG(1, fmt, ##__VA_ARGS__)
#define LOG_WARNING(fmt, ...) LOG(2, fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...) LOG(3, fmt, ##__VA_ARGS__)

使用案例

我们可以根据不同的调试级别来控制输出的信息量。
#include <stdio.h>

void calculate(int a, int b) {
    FUNCTION_ENTER();
    LOG_INFO("Calculating with a = %d and b = %d\n", a, b);
    int sum = a + b;
    LOG_INFO("Sum is %d\n", sum);
    FUNCTION_EXIT();
}

int main() {
    FUNCTION_ENTER();
    LOG_INFO("Starting calculation\n");
    calculate(5, 10);
    LOG_INFO("Calculation complete\n");
    FUNCTION_EXIT();
    return 0;
}

设置 `DEBUG_LEVEL` 为 1 来查看 `LOG_INFO` 级别的输出。

输出
Entering function main
Starting calculation
Entering function calculate
Calculating with a = 5 and b = 10
Sum is 15
Exiting function calculate
Calculation complete
Exiting function main

以上就是本篇关于 C 语言调试宏的内容。这些宏可以帮助你在开发过程中更好地理解和追踪你的代码执行情况。请记得,在实际项目中,你应该根据具体需求调整宏的功能,以适应不同的调试要求。

 

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

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

相关文章

CSS的配色

目录 1 十六进制2 CSS中的十六进制2.1 十六进制颜色的基本结构2.2 十六进制颜色的范围2.3 简写形式2.4 透明度 3 CSS的命名颜色4 配色4.1 色轮4.2 互补色4.3 类似色4.4 配色工具 日常在开发小程序中&#xff0c;客户总是希望你的配色是美的&#xff0c;但是美如何定义&#xff…

基于 RNN 的语言模型

基于 RNN 的语言模型 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类网络连接中包含环路的 神经网络的总称。 给定一个序列&#xff0c;RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度&#xff0c;历史状态被循环累积&#xff0c;并作为…

【软考网工笔记】网络基础理论——物理层

文章目录 贝尔系统 T1 载波光纤 - SFP接口差分&&曼彻斯特编码网桥MAC-in-MACQ-in-QIPv6的链路本地地址CRC校验与计算E1载波编码效率对称xDSL坚持算法-CSMAUDP头部字段万兆以太网标准 IEEE 802.3ae海明码-纠错码ARP帧中的目标MAC地址快速以太区网物理层标准 100BASE-TXM…

现代Web开发:TypeScript 深入解析与最佳实践

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;TypeScript 深入解析与最佳实践 现代Web开发&#xff1a;TypeScript 深入解析与最佳实践 现代Web开发&a…

HCIP MPLS基础

一、 实验拓扑 二、 实验需求及解法 本实验模拟BGP路由黑洞环境&#xff0c;使用MPLS LDP解决路由黑洞。 完成以下需求&#xff1a; 1.设备IP地址配置&#xff0c;请测试直连。 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0interface Loop…

Kubernetes架构及核心组件

一、基本架构 Kubernetes集群可以被看作是一个工厂,而各个组件则是这个工厂里的不同部门: Kubernetes API服务器:就像是这个工厂的总经理,负责接收所有的请求并将它们分配给相应的部门进行处理。 etcd:就像是这个工厂的记事本,负责记录所有的配置信息和状态信息,以便其…

移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记

目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…

聊聊基于BERT模型实现多标签分类任务的实践与思考

概述 以预训练大模型为基座神经网络模型&#xff0c;通过模型预训练后的泛化能力与微调后的领域能力&#xff0c;作为NLP任务的解决方案。 在github上找了一个简单的仓库——multi_label_classification&#xff0c;该仓库基于BERT预训练大模型实现了多分类任务。通过对该仓库…

C语言 【大白话讲指针(中)】

在之前的文章中我们已经知道了指针的概念&#xff0c;指针就是一个变量&#xff0c;用来存放地址&#xff0c;地址指向唯一一块内存空间。指针的大小是固定的4/8个字节&#xff08;32为机器/64位机器&#xff09;。指针是有类型的&#xff0c;指针的类型决定了指针加减整数的步…

大数据分析在市场营销中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 引言 大数据分析概述 定义与原理 发…

启明云端触觉智能与您相约2024年慕尼黑国际电子元器件博览会,不见不散!

展会信息 展会日期: 2024年11月12-15日 展馆名称: 慕尼黑国际展览中心 MesseMnchen exhibition center 展馆地址: Messegelnde 81829 Mnchen Germany 启明云端&触觉智能展位号&#xff1a;B6-351 诚邀您莅临我司展位&#xff0c;让我们在慕尼黑不见不散&#xff01; …

OPPO开源Diffusion多语言适配器—— MultilingualSD3-adapter 和 ChineseFLUX.1-adapter

MultilingualSD3-adapter 是为 SD3 量身定制的多语言适配器。 它源自 ECCV 2024 的一篇题为 PEA-Diffusion 的论文。ChineseFLUX.1-adapter是为Flux.1系列机型量身定制的多语言适配器&#xff0c;理论上继承了ByT5&#xff0c;可支持100多种语言&#xff0c;但在中文方面做了额…

【JavaEE初阶】网络原理(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 网络层 > IP协议 IP协议报头结构 4位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节数), 16位标识 3位标志位 13位片偏移 8位生存时间(TTL) 8位协议 16位首部…

树莓派上安装与配置 Nginx Web 服务器教程

在树莓派上配置 Nginx 作为 Web 服务器的步骤如下&#xff1a; 1. 更新树莓派 首先&#xff0c;确保你的树莓派系统是最新的。打开终端并执行以下命令&#xff1a; sudo apt update sudo apt upgrade -y2. 安装 Nginx 在树莓派上安装 Nginx&#xff1a; sudo apt install …

Android Studio 中关于com.github.barteksc:android-pdf-viewer 无法正确加载的问题

Android Studio 的app 模块下&#xff0c;添加依赖&#xff1a; implementation com.github.barteksc:android-pdf-viewer:3.2.0-beta.1 运行程序报错&#xff1a; Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveEx…

[JAVA]Maven项目标准结构介绍

什么是Maven&#xff1f; Maven 是一个强大的项目管理和构建自动化工具&#xff0c;在Java开发中&#xff0c;一个项目通常会依赖许多外部的库&#xff0c;比如开发一个Web应用可能需要依赖Servlet APL&#xff0c;Spring框架等&#xff0c;和需要引入大量的Jar包。往往一个Ja…

Ansys EMC Plus:MHARNESS 串扰演示

Ansys EMC Plus 是一款强大的工具&#xff0c;专门用于分析电磁场及其影响&#xff0c;涵盖电磁兼容性和雷电效应分析等领域。 在本演示中&#xff0c;我们将探讨建立 MHARNESS 仿真的基础知识。这包括构建基本电缆线束、创建 MHARNESS 源和设置 MHARNESS 探针的过程。 概述 …

星环大数据平台--TDH部署

1.1 准备一台虚拟机 正常安装一台新的虚拟机&#xff0c; 内存16G&#xff0c;cpu8核&#xff0c;硬盘50G 1.2 安装前系统配置改动 修改/etc/hosts文件&#xff0c;确保hostname该文件包含节点的hostname和IP地址的映射关系列表。 hostname由数字、小写字母或“-”组成&am…

B+树与聚簇索引以及非聚簇索引的关系

B树、聚簇索引和非聚簇索引是数据库系统中非常重要的概念&#xff0c;它们共同决定了数据的存储和查询效率。本文将详细解释B树的结构&#xff0c;以及聚簇索引和非聚簇索引的区别和联系&#xff0c;使读者能够更好地理解这些概念。 1.B树简介 B树是一种多路平衡树&#xff0c;…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…