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