C语言中常用的调试宏和函数总结(__LINE__、__FUNCTION__)

表格:C语言调试工具

类别工具描述示例代码
预定义宏__LINE__表示当前源代码的行号。printf("Error occurred at line %d\n", __LINE__);
__FILE__表示当前源代码文件的名称。printf("Error occurred in file %s\n", __FILE__);
__func__表示当前函数的名称。printf("Current function: %s\n", __func__);
__DATE__表示源代码文件的编译日期。printf("Compiled on: %s\n", __DATE__);
__TIME__表示源代码文件的编译时间。printf("Compiled at: %s\n", __TIME__);
标准输入输出printf格式化输出函数,用于在标准输出设备上显示信息。printf("Debug message: %d\n", variable);
fprintf格式化输出函数,用于将信息输出到指定的文件。fprintf(stderr, "Error: %s\n", error_message);
断言函数assert在条件不满足时终止程序并输出错误信息。assert(x == 5);
错误处理函数perror输出与错误相关的消息。perror("Error opening file");
exit终止程序的执行,并返回一个状态码。exit(EXIT_FAILURE);
内存管理函数malloc用于动态内存分配。int* ptr = malloc(sizeof(int) * 10);
calloc用于动态内存分配并初始化为零。int* ptr = calloc(10, sizeof(int));
free用于释放动态分配的内存。free(ptr);
调试器GDBGNU调试器,用于设置断点、单步执行和查看变量值。gdb ./my_program
日志打印自定义日志函数在关键位置插入printffprintf语句,输出程序的执行状态和变量值。printf("Entering function %s\n", __func__);
条件编译#ifdef 和 #endif用于控制调试代码的编译。#ifdef DEBUG printf("Debug mode enabled.\n"); #endif

详细解释与示例
1. 预定义宏
1.1 __LINE__
  • 描述:返回当前源代码的行号。
  • 示例
printf("Current line: %d\n", __LINE__);
  • 输出
Current line: 10
1.2 __FILE__
  • 描述:返回当前源代码文件的名称。
  • 示例
printf("Current file: %s\n", __FILE__);
  • 输出
Current file: main.c
1.3 __func__
  • 描述:返回当前函数的名称。
  • 示例
void debug_info() 
{ printf("Current function: %s\n", __func__);
}
  • 输出
Current function: debug_info
1.4 __DATE__ 和 __TIME__
  • 描述:分别返回源代码文件的编译日期和时间。
  • 示例
printf("Compiled on: %s at %s\n", __DATE__, __TIME__);
  • 输出
Compiled on: Sep 4 2024 at 14:30:22
2. 标准输入输出函数
2.1 printf
  • 描述:格式化输出函数,用于在标准输出设备上显示信息。
  • 示例
int num = 42; printf("The value of num is: %d\n", num);
  • 输出
The value of num is: 42
2.2 fprintf
  • 描述:格式化输出函数,用于将信息输出到指定的文件。
  • 示例
FILE* log_file = fopen("debug.log", "w"); 
if (log_file != NULL) 
{ fprintf(log_file, "Debug message: %s\n", "Program started");fclose(log_file);
}
  • 文件内容
Debug message: Program started
3. 断言函数
3.1 assert
  • 描述:在条件不满足时终止程序并输出错误信息。
  • 示例
#include <assert.h> 
int x = 5; 
assert(x == 5); // 条件满足,程序继续运行 
assert(x == 6); // 条件不满足,程序终止并输出错误信息
  • 输出
Assertion failed: x == 6, function main, file main.c, line 15.
4. 错误处理函数
4.1 perror
  • 描述:输出与错误相关的消息。
  • 示例
#include <errno.h> 
#include <stdio.h> 
FILE* file = fopen("nonexistent.txt", "r"); 
if (file == NULL) 
{ perror("Error opening file"); 
}
  • 输出
Error opening file: No such file or directory
4.2 exit
  • 描述:终止程序的执行,并返回一个状态码。
  • 示例
#include <stdlib.h> 
if (error_condition) 
{ printf("Error occurred. Exiting...\n"); exit(EXIT_FAILURE); 
}
  • 输出
Error occurred. Exiting...
5. 内存管理函数
5.1 malloc
  • 描述:用于动态内存分配。
  • 示例
int* ptr = malloc(sizeof(int) * 10); 
if (ptr == NULL) 
{ printf("Memory allocation failed.\n"); exit(EXIT_FAILURE); 
} // 使用 ptr... free(ptr);
5.2 calloc
  • 描述:用于动态内存分配并初始化为零。
  • 示例
int* ptr = calloc(10, sizeof(int)); 
if (ptr == NULL) 
{ printf("Memory allocation failed.\n"); exit(EXIT_FAILURE); 
} // 使用 ptr... free(ptr);
6. 调试器
6.1 GDB
  • 描述:GNU调试器,用于设置断点、单步执行和查看变量值。
  • 示例
  • gdb ./my_program
  • 在GDB提示符下,可以输入以下命令:
    • break main:在main函数处设置断点。
    • run:启动程序。
    • next:单步执行。
    • print variable:查看变量值。
7. 日志打印
7.1 自定义日志函数
  • 描述:在关键位置插入printffprintf语句,输出程序的执行状态和变量值。
  • 示例
void my_function() 
{ printf("Entering function %s\n", __func__); // 函数体... printf("Exiting function %s\n", __func__); 
}
8. 条件编译
8.1 #ifdef 和 #endif
  • 描述:用于控制调试代码的编译。
  • 示例
#define DEBUG 
#ifdef DEBUG printf("Debug mode enabled.\n"); #endif

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

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

相关文章

DotnetCore开源库SampleAdmin源码编译

1.报错: System.Net.Sockets.SocketException HResult0x80004005 Message由于目标计算机积极拒绝&#xff0c;无法连接。 SourceSystem.Net.Sockets StackTrace: 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, C…

如何使用切片操作来处理序列数据

1 问题 本文主要探究 Python 中切片操作的原理和应用。具体来说&#xff0c;我们将分析切片的基本语法、切片的步长和切片的边界&#xff0c;并通过示例代码展示如何使用切片操作来处理序列数据。 2 方法 为了更好地理解切片操作&#xff0c;我们采用如下的思路学习python中的切…

java(二):java的运算和流程控制

java中单引号和双引号区别和用法 区别1&#xff1a;java中的单引号表示字符&#xff0c;双引号表示字符串。 区别2&#xff1a;单引号引的数据一般是char类型的&#xff1b;双引号引的数据 是String类型的。 区别3&#xff1a;java中单引号里面只能放一个字母或数字或符号&…

Android envsetup与Python venv使用指南

Android envsetup 和 Python venv 是两种完全不同的环境配置工具&#xff0c;分别服务于不同的开发场景。以下是对它们的详细解释及使用方法&#xff1a; 1. Android envsetup 用途&#xff1a; Android envsetup 是 Android 源码开发中的环境配置脚本&#xff08;envsetup.sh…

游戏引擎学习第222天

回顾昨天的过场动画工作 我们正在制作一个游戏&#xff0c;目标是通过直播的方式完成整个游戏的开发。在昨天的工作中&#xff0c;我享受了制作过场动画的过程&#xff0c;所以今天我决定继续制作多个层次的过场动画。 昨天我们已经开始了多层次过场动画的基本制作&#xff0…

Leedcode刷题 | Day31_贪心算法05

一、学习任务 56. 合并区间代码随想录738. 单调递增的数字968. 监控二叉树 二、具体题目 1.56合并区间56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,1…

app逆向专题五:新快报app数据采集

app逆向专题五:新快报app数据采集 一、抓包寻找数据接口二、编写代码三、完整代码一、抓包寻找数据接口 打开charles,并在手机端打开新快报app,点击“广州”或者“经济”等选项卡,抓包,寻找数据接口,如图所示: 二、编写代码 这里介绍一种简便的代码编写方法,在数据…

Java面试黄金宝典45

1. 非对称加密 RSA 定义:RSA 是一种广泛使用的非对称加密算法,其安全性基于大整数分解的困难性。它使用一对密钥,即公钥和私钥。公钥可公开用于加密消息,而私钥必须保密,用于解密由相应公钥加密的消息。要点: 公钥公开,私钥保密,二者成对出现。加密和解密使用不同的密钥…

提权实战!

就是提升权限&#xff0c;当我们拿到一个shell权限较低&#xff0c;当满足MySQL提权的要求时&#xff0c;就可以进行这个提权。 MySQL数据库提权&#xff08;Privilege Escalation&#xff09;是指攻击者通过技术手段&#xff0c;从低权限的数据库用户提升到更高权限&#xff…

在虚拟机上修改saprk的版本

之前安装的spark版本是3.4&#xff0c;现在实验需要的版本是2.4。现在需要更改spark的版本。 方法很简单&#xff1a; 直接将原有的spark3.4的文件删除&#xff0c;再安装2.4版本。 安装过程之后再写。Spark2.1.0入门&#xff1a;Spark的安装和使用_厦大数据库实验室博客

文献分享: DESSERT基于LSH的多向量检索(Part3.2.外部聚合的联合界)

原论文 文章目录 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的内容 1.1. \textbf{1.1. } 1.1. 一些符号 1.2. \textbf{1.2. } 1.2. 定理内容 3. \textbf{3. } 3. 联合界限 Ps. \textbf{Ps. } Ps. 运行时间分析 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的内容 1.1. \t…

MIPI协议介绍

MIPI协议介绍 mipi 协议分为 CSI 和DSI,两者的区别在于 CSI用于接收sensor数据流 DSI用于连接显示屏 csi分类 csi 分为 csi2 和 csi3 csi2根据物理层分为 c-phy 和 d-phy, csi-3采用的是m-phy 一般采用csi2 c-phy 和 d-phy的区别 d-phy的时钟线和数据线是分开的,2根线一对…

【中间件】nginx反向代理实操

一、说明 nginx用于做反向代理&#xff0c;其目标是将浏览器中的请求进行转发&#xff0c;应用场景如下&#xff1a; 说明&#xff1a; 1、用户在浏览器中发送请求 2、nginx监听到浏览器中的请求时&#xff0c;将该请求转发到网关 3、网关再将请求转发至对应服务 二、具体操作…

在3ds Max中视口显示为黑色或深灰色

在3ds Max中视口显示为黑色或深灰色 Autodesk Support 2023年10月8日 涵盖的产品和版本 问题&#xff1a; 在3ds Max中&#xff0c;使用“深”UI方案时视口显示为完全黑色&#xff0c;使用“浅”UI方案时视口显示为深灰色。 原因&#xff1a; 已为用户界面禁用Gamma校正。…

Vue.js 中 v-if 的使用及其原理

在 Vue.js 的开发过程中&#xff0c;条件渲染是一项极为常见的需求。v-if指令作为 Vue.js 实现条件渲染的关键手段&#xff0c;能够根据表达式的真假来决定是否渲染某一块 DOM 元素。它在优化页面展示逻辑、提升用户体验等方面发挥着重要作用。接下来&#xff0c;我们就深入探讨…

Verilog:LED呼吸灯

模块接口说明 信号方向描述clk输入系统时钟&#xff08;100MHz&#xff0c;周期10ns&#xff09;rst_n输入低电平有效的异步复位信号led_en输入总使能信号&#xff08;1开启呼吸灯&#xff0c;0关闭&#xff09;speed_en输入呼吸速度调节使能信号speed[2:0]输入呼吸速度分级&a…

我的计算机网络(总览篇)

总览--网络协议的角度 在一个庞大的网络中&#xff0c;该从哪里去了解呢&#xff1f;我先细细的讲一下我们访问一个网站的全部流程&#xff0c;当我们的电脑连上网络的时候&#xff0c;就会启动DHCP协议&#xff0c;来进行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…

开源的PMPI库实现及示例代码

开源的PMPI库实现及示例代码 PMPI (Profiling MPI) 是MPI标准中定义的接口&#xff0c;允许开发者通过拦截MPI调用进行性能测量和调试。以下是几个常用的开源PMPI库实现&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…

Unity 基于navMesh的怪物追踪惯性系统

今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享&#xff1a; 怪物基类代码&#xff1a; ​ using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …

PyTorch进阶学习笔记[长期更新]

第一章 PyTorch简介和安装 PyTorch是一个很强大的深度学习库&#xff0c;在学术中使用占比很大。 我这里是Mac系统的安装&#xff0c;相比起教程中的win/linux安装感觉还是简单不少&#xff08;之前就已经安好啦&#xff09;&#xff0c;有需要指导的小伙伴可以评论。 第二章…