表格: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); | 
| 调试器 | GDB | GNU调试器,用于设置断点、单步执行和查看变量值。 | gdb ./my_program | 
| 日志打印 | 自定义日志函数 | 在关键位置插入printf或fprintf语句,输出程序的执行状态和变量值。 | 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 自定义日志函数
 
- 描述:在关键位置插入
printf或fprintf语句,输出程序的执行状态和变量值。 - 示例:
 
 
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