当前位置: 首页 > news >正文

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

相关文章:

  • Swift的学习笔记(一)
  • 学生考勤管理系统(jsp+ssh+mysql5.x)含文档
  • 【清华大学】DeepSeek与AI幻觉
  • AIGC-文生图与图生图
  • Vision Mamba修改为自己的目标检测数据集
  • linux多线(进)程编程——(2)身外化身fork()
  • 概率论与数理统计核心知识点与公式总结(就业版)
  • C++进阶——异常
  • 计算机组成原理-系统总线
  • Hibernate(JPA) 和 MyBatis 的对比
  • Java基础关键_036_Stream
  • 使用Python实现矢量路径的压缩、解压与可视化
  • Python | 在Pandas中按照中值对箱形图排序
  • 二叉树的最近公共祖先二叉搜索树的最近公共祖先
  • 25届双非控制硕士求职回顾
  • ARM架构FFmpeg极致优化交叉编译指南
  • Linux:DNS服务配置(课堂实验总结)
  • 怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改
  • instructor 库实现缓存
  • 【C#】.NET 8适配器模式实战:用C#实现高可用系统集成与接口桥接艺术
  • 查幽门螺杆菌的这款同位素长期被海外垄断,秦山核电站实现突破
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛暨七猫第六届百万奖金现实题材征文大赛征稿启事
  • 新任美国驻华大使庞德伟抵京履职,外交部回应
  • 蚊媒传染病、手足口病……上海疾控发布近期防病提示
  • 巴方:印度上周导弹袭击造成至少40名平民死亡
  • 王毅谈中拉论坛十年成果