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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值