表格: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