错误排查与调试是每个程序员必须掌握的核心技能。东巴文(db-w.cn) 将带你系统学习如何快速定位和解决程序中的错误。
💡 东巴文观点:调试能力是区分新手和专家的重要标志。掌握系统化的调试方法,能让你事半功倍。
#include <stdio.h>
// 东巴文编译错误示例
void compilationErrors() {
printf("=== 东巴文编译错误 ===\n\n");
printf("常见编译错误类型:\n\n");
printf("1. 语法错误(Syntax Error):\n");
printf(" ❌ int x = // 缺少分号\n");
printf(" ✅ int x = 10;\n\n");
printf(" ❌ if (x > 5 // 缺少右括号\n");
printf(" ✅ if (x > 5)\n\n");
printf(" ❌ printf(\"hello\" // 缺少右括号\n");
printf(" ✅ printf(\"hello\");\n\n");
printf("2. 类型错误(Type Error):\n");
printf(" ❌ int x = \"hello\"; // 类型不匹配\n");
printf(" ✅ char *x = \"hello\";\n\n");
printf(" ❌ int *p = 100; // 整数赋给指针\n");
printf(" ✅ int *p = NULL;\n\n");
printf("3. 声明错误(Declaration Error):\n");
printf(" ❌ printf(\"%d\", x); // 未声明\n");
printf(" ✅ int x = 10;\n");
printf(" printf(\"%d\", x);\n\n");
printf("4. 头文件错误:\n");
printf(" ❌ #include <stdio> // 错误的头文件名\n");
printf(" ✅ #include <stdio.h>\n");
}
int main() {
compilationErrors();
return 0;
}
#include <stdio.h>
// 东巴文链接错误示例
void linkingErrors() {
printf("=== 东巴文链接错误 ===\n\n");
printf("常见链接错误类型:\n\n");
printf("1. 未定义的引用(Undefined Reference):\n");
printf(" 错误信息:undefined reference to `func'\n");
printf(" 原因:\n");
printf(" - 函数声明了但未实现\n");
printf(" - 函数名拼写错误\n");
printf(" - 忘记链接库文件\n\n");
printf(" 解决方法:\n");
printf(" // 确保函数已实现\n");
printf(" int func() { return 0; }\n\n");
printf("2. 重复定义(Multiple Definition):\n");
printf(" 错误信息:multiple definition of `var'\n");
printf(" 原因:\n");
printf(" - 变量在头文件中定义\n");
printf(" - 多个源文件定义同名全局变量\n\n");
printf(" 解决方法:\n");
printf(" // header.h\n");
printf(" extern int var; // 声明\n\n");
printf(" // source.c\n");
printf(" int var = 0; // 定义\n\n");
printf("3. 库文件缺失:\n");
printf(" 错误信息:cannot find -lm\n");
printf(" 解决:gcc main.c -lm // 链接数学库\n");
}
int main() {
linkingErrors();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 东巴文运行时错误示例
void runtimeErrors() {
printf("=== 东巴文运行时错误 ===\n\n");
printf("常见运行时错误类型:\n\n");
printf("1. 段错误(Segmentation Fault):\n");
printf(" 原因:访问非法内存\n\n");
printf(" ❌ 空指针解引用:\n");
printf(" int *p = NULL;\n");
printf(" *p = 10; // 段错误\n\n");
printf(" ❌ 数组越界:\n");
printf(" int arr[5];\n");
printf(" arr[10] = 100; // 越界访问\n\n");
printf(" ❌ 栈溢出:\n");
printf(" int arr[1000000]; // 栈空间不足\n\n");
printf(" ✅ 正确做法:\n");
printf(" int *p = malloc(sizeof(int));\n");
printf(" if (p != NULL) {\n");
printf(" *p = 10;\n");
printf(" free(p);\n");
printf(" }\n\n");
printf("2. 内存泄漏(Memory Leak):\n");
printf(" ❌ 忘记释放内存:\n");
printf(" void func() {\n");
printf(" int *p = malloc(100);\n");
printf(" // 忘记 free(p)\n");
printf(" }\n\n");
printf(" ✅ 正确做法:\n");
printf(" void func() {\n");
printf(" int *p = malloc(100);\n");
printf(" // 使用内存\n");
printf(" free(p);\n");
printf(" }\n\n");
printf("3. 除零错误:\n");
printf(" ❌ int result = 10 / 0;\n");
printf(" ✅ if (divisor != 0) {\n");
printf(" int result = dividend / divisor;\n");
printf(" }\n");
}
int main() {
runtimeErrors();
return 0;
}
#include <stdio.h>
// 东巴文逻辑错误示例
void logicalErrors() {
printf("=== 东巴文逻辑错误 ===\n\n");
printf("常见逻辑错误类型:\n\n");
printf("1. 条件判断错误:\n");
printf(" ❌ if (x = 5) // 赋值而非比较\n");
printf(" ✅ if (x == 5) // 正确的比较\n\n");
printf(" ❌ if (x = 0) // 永远为假\n");
printf(" ✅ if (x == 0) // 正确的比较\n\n");
printf("2. 循环条件错误:\n");
printf(" ❌ for (int i = 0; i <= 10; i++) {\n");
printf(" arr[i] = 0; // 可能越界\n");
printf(" }\n\n");
printf(" ✅ for (int i = 0; i < 10; i++) {\n");
printf(" arr[i] = 0; // 正确\n");
printf(" }\n\n");
printf("3. 运算符优先级错误:\n");
printf(" ❌ int result = x & 0x0F == 0;\n");
printf(" // 等价于 x & (0x0F == 0)\n\n");
printf(" ✅ int result = (x & 0x0F) == 0;\n");
printf(" // 先位运算后比较\n\n");
printf("4. 边界条件错误:\n");
printf(" ❌ for (int i = 0; i < n; i++) {\n");
printf(" if (arr[i] > arr[i+1]) // i+1可能越界\n");
printf(" }\n\n");
printf(" ✅ for (int i = 0; i < n-1; i++) {\n");
printf(" if (arr[i] > arr[i+1]) // 安全\n");
printf(" }\n");
}
int main() {
logicalErrors();
return 0;
}
#include <stdio.h>
// 东巴文GDB调试示例
// 编译时加入调试信息:gcc -g program.c -o program
void gdbDebugging() {
printf("=== 东巴文GDB调试 ===\n\n");
printf("GDB基本命令:\n\n");
printf("1. 启动调试:\n");
printf(" gdb ./program # 启动GDB\n");
printf(" run # 运行程序\n");
printf(" run arg1 arg2 # 带参数运行\n\n");
printf("2. 断点操作:\n");
printf(" break main # 在main函数设置断点\n");
printf(" break 20 # 在第20行设置断点\n");
printf(" break func # 在func函数设置断点\n");
printf(" info break # 查看所有断点\n");
printf(" delete 1 # 删除断点1\n");
printf(" disable 1 # 禁用断点1\n");
printf(" enable 1 # 启用断点1\n\n");
printf("3. 执行控制:\n");
printf(" next (n) # 执行下一行(不进入函数)\n");
printf(" step (s) # 执行下一行(进入函数)\n");
printf(" continue (c) # 继续执行到下一个断点\n");
printf(" finish # 执行到当前函数结束\n");
printf(" until 30 # 执行到第30行\n\n");
printf("4. 查看变量:\n");
printf(" print var # 打印变量值\n");
printf(" print *ptr # 打印指针指向的值\n");
printf(" print arr[0]@10 # 打印数组前10个元素\n");
printf(" display var # 自动显示变量\n");
printf(" info locals # 显示局部变量\n");
printf(" info args # 显示函数参数\n\n");
printf("5. 查看调用栈:\n");
printf(" backtrace (bt) # 显示调用栈\n");
printf(" frame 1 # 切换到栈帧1\n");
printf(" up # 向上移动栈帧\n");
printf(" down # 向下移动栈帧\n\n");
printf("6. 内存查看:\n");
printf(" x/10x 0x12345 # 查看10个16进制数\n");
printf(" x/10i func # 查看函数汇编指令\n");
}
int main() {
gdbDebugging();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
// 东巴文GDB调试实例
int find_max(int *arr, int size) {
if (arr == NULL || size <= 0) {
return -1;
}
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
int size = sizeof(arr) / sizeof(arr[0]);
printf("数组元素:\n");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
int max = find_max(arr, size);
printf("最大值:%d\n", max);
return 0;
}
/*
调试步骤:
1. 编译:
gcc -g gdb_example.c -o gdb_example
2. 启动GDB:
gdb ./gdb_example
3. 设置断点:
(gdb) break main
(gdb) break find_max
4. 运行程序:
(gdb) run
5. 单步执行:
(gdb) next
(gdb) step
6. 查看变量:
(gdb) print arr
(gdb) print size
(gdb) print max
7. 查看调用栈:
(gdb) backtrace
8. 继续执行:
(gdb) continue
9. 退出:
(gdb) quit
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 东巴文Valgrind内存检测示例
void memoryLeakExample() {
// 内存泄漏示例
int *p = (int*)malloc(10 * sizeof(int));
// 忘记 free(p)
printf("内存泄漏示例:分配了内存但未释放\n");
}
void invalidAccessExample() {
// 非法访问示例
int *p = (int*)malloc(5 * sizeof(int));
p[10] = 100; // 越界访问
free(p);
printf("非法访问示例:数组越界\n");
}
void useAfterFreeExample() {
// 释放后使用示例
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
*p = 20; // 释放后使用
printf("释放后使用示例:访问已释放的内存\n");
}
void valgrindUsage() {
printf("=== 东巴文Valgrind使用 ===\n\n");
printf("Valgrind基本用法:\n\n");
printf("1. 编译程序:\n");
printf(" gcc -g program.c -o program\n\n");
printf("2. 运行Valgrind:\n");
printf(" valgrind --leak-check=full ./program\n\n");
printf("3. 常用选项:\n");
printf(" --leak-check=full # 详细内存泄漏检测\n");
printf(" --show-leak-kinds=all # 显示所有泄漏类型\n");
printf(" --track-origins=yes # 追踪错误来源\n");
printf(" --verbose # 详细输出\n");
printf(" --log-file=valgrind.log # 输出到文件\n\n");
printf("4. 检测内容:\n");
printf(" - 内存泄漏\n");
printf(" - 非法读写\n");
printf(" - 使用未初始化的值\n");
printf(" - 重复释放\n");
printf(" - 释放后使用\n\n");
printf("5. 输出解读:\n");
printf(" definitely lost: 确定的内存泄漏\n");
printf(" indirectly lost: 间接内存泄漏\n");
printf(" still reachable: 仍可访问的内存\n");
printf(" suppressed: 抑制的错误\n");
}
int main() {
valgrindUsage();
// 取消注释以测试内存错误
// memoryLeakExample();
// invalidAccessExample();
// useAfterFreeExample();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// 东巴文日志调试示例
// 日志级别
typedef enum {
LOG_DEBUG = 0,
LOG_INFO = 1,
LOG_WARNING = 2,
LOG_ERROR = 3
} LogLevel;
// 日志配置
static FILE *log_file = NULL;
static LogLevel current_level = LOG_DEBUG;
// 初始化日志
int log_init(const char *filename) {
if (filename == NULL) {
log_file = stderr;
} else {
log_file = fopen(filename, "a");
if (log_file == NULL) {
fprintf(stderr, "无法打开日志文件: %s\n", filename);
return -1;
}
}
return 0;
}
// 关闭日志
void log_close() {
if (log_file != NULL && log_file != stderr) {
fclose(log_file);
}
}
// 日志记录
void log_write(LogLevel level, const char *file, int line,
const char *format, ...) {
if (level < current_level || log_file == NULL) {
return;
}
// 获取时间
time_t now = time(NULL);
struct tm *tm_info = localtime(&now);
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", tm_info);
// 日志级别字符串
const char *level_str[] = {"DEBUG", "INFO", "WARNING", "ERROR"};
// 写入日志
fprintf(log_file, "[%s] [%s] %s:%d: ",
time_str, level_str[level], file, line);
va_list args;
va_start(args, format);
vfprintf(log_file, format, args);
va_end(args);
fprintf(log_file, "\n");
fflush(log_file);
}
// 日志宏
#define LOG_DEBUG_MSG(...) log_write(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_INFO_MSG(...) log_write(LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_WARNING_MSG(...) log_write(LOG_WARNING, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_ERROR_MSG(...) log_write(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
// 使用示例
void process_data(int *data, int size) {
LOG_INFO_MSG("开始处理数据,大小:%d", size);
if (data == NULL) {
LOG_ERROR_MSG("数据指针为空");
return;
}
if (size <= 0) {
LOG_WARNING_MSG("数据大小无效:%d", size);
return;
}
for (int i = 0; i < size; i++) {
LOG_DEBUG_MSG("处理第 %d 个元素:%d", i, data[i]);
data[i] *= 2;
}
LOG_INFO_MSG("数据处理完成");
}
int main() {
// 初始化日志
if (log_init("debug.log") != 0) {
return 1;
}
// 测试日志
int data[] = {1, 2, 3, 4, 5};
int size = sizeof(data) / sizeof(data[0]);
process_data(data, size);
// 测试错误情况
process_data(NULL, 5);
process_data(data, -1);
// 关闭日志
log_close();
printf("日志已写入 debug.log\n");
return 0;
}
#include <stdio.h>
// 东巴文系统化排查方法
void systematicDebugging() {
printf("=== 东巴文系统化排查方法 ===\n\n");
printf("排查步骤:\n\n");
printf("1. 重现错误:\n");
printf(" - 记录错误发生的条件\n");
printf(" - 确定错误是否可重现\n");
printf(" - 简化重现步骤\n\n");
printf("2. 定位错误:\n");
printf(" - 查看错误信息\n");
printf(" - 使用调试工具\n");
printf(" - 二分法定位\n");
printf(" - 打印调试信息\n\n");
printf("3. 分析原因:\n");
printf(" - 理解代码逻辑\n");
printf(" - 检查相关代码\n");
printf(" - 查看文档资料\n");
printf(" - 搜索类似问题\n\n");
printf("4. 修复错误:\n");
printf(" - 制定修复方案\n");
printf(" - 实施修复\n");
printf(" - 验证修复效果\n");
printf(" - 避免引入新错误\n\n");
printf("5. 预防措施:\n");
printf(" - 添加测试用例\n");
printf(" - 完善错误处理\n");
printf(" - 更新文档\n");
printf(" - 代码审查\n");
}
int main() {
systematicDebugging();
return 0;
}
#include <stdio.h>
// 东巴文常见错误排查清单
void debuggingChecklist() {
printf("=== 东巴文常见错误排查清单 ===\n\n");
printf("编译错误排查:\n");
printf(" □ 检查语法错误\n");
printf(" □ 检查类型匹配\n");
printf(" □ 检查变量声明\n");
printf(" □ 检查头文件包含\n");
printf(" □ 检查宏定义\n\n");
printf("链接错误排查:\n");
printf(" □ 检查函数实现\n");
printf(" □ 检查函数声明与定义是否匹配\n");
printf(" □ 检查库文件链接\n");
printf(" □ 检查重复定义\n");
printf(" □ 检查符号可见性\n\n");
printf("运行时错误排查:\n");
printf(" □ 检查空指针\n");
printf(" □ 检查数组越界\n");
printf(" □ 检查内存分配\n");
printf(" □ 检查内存释放\n");
printf(" □ 检查除零错误\n");
printf(" □ 检查栈溢出\n\n");
printf("逻辑错误排查:\n");
printf(" □ 检查条件判断\n");
printf(" □ 检查循环条件\n");
printf(" □ 检查边界条件\n");
printf(" □ 检查运算符优先级\n");
printf(" □ 检查数据类型转换\n");
printf(" □ 检查算法逻辑\n");
}
int main() {
debuggingChecklist();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
// 东巴文防御性编程示例
// 1. 参数验证
int divide(int a, int b) {
// 验证参数
if (b == 0) {
fprintf(stderr, "错误:除数不能为0\n");
return 0;
}
return a / b;
}
// 2. 指针检查
void process_string(char *str) {
// 检查空指针
if (str == NULL) {
fprintf(stderr, "错误:字符串指针为空\n");
return;
}
// 检查空字符串
if (strlen(str) == 0) {
fprintf(stderr, "警告:字符串为空\n");
return;
}
printf("处理字符串:%s\n", str);
}
// 3. 数组边界检查
int get_element(int *arr, int size, int index) {
// 检查数组指针
if (arr == NULL) {
fprintf(stderr, "错误:数组指针为空\n");
return -1;
}
// 检查索引范围
if (index < 0 || index >= size) {
fprintf(stderr, "错误:索引 %d 超出范围 [0, %d)\n", index, size);
return -1;
}
return arr[index];
}
// 4. 内存分配检查
int* create_array(int size) {
// 检查大小
if (size <= 0) {
fprintf(stderr, "错误:数组大小必须大于0\n");
return NULL;
}
// 分配内存
int *arr = (int*)malloc(size * sizeof(int));
if (arr == NULL) {
fprintf(stderr, "错误:内存分配失败\n");
return NULL;
}
// 初始化
memset(arr, 0, size * sizeof(int));
return arr;
}
// 5. 使用断言
void process_array(int *arr, int size) {
// 断言检查(调试时有效)
assert(arr != NULL);
assert(size > 0);
for (int i = 0; i < size; i++) {
arr[i] *= 2;
}
}
// 6. 错误码设计
typedef enum {
SUCCESS = 0,
ERROR_NULL_POINTER = -1,
ERROR_INVALID_PARAM = -2,
ERROR_OUT_OF_RANGE = -3,
ERROR_MEMORY = -4
} ErrorCode;
const char* error_message(ErrorCode code) {
switch (code) {
case SUCCESS: return "成功";
case ERROR_NULL_POINTER: return "空指针错误";
case ERROR_INVALID_PARAM: return "无效参数";
case ERROR_OUT_OF_RANGE: return "越界错误";
case ERROR_MEMORY: return "内存错误";
default: return "未知错误";
}
}
ErrorCode safe_divide(int a, int b, int *result) {
if (result == NULL) {
return ERROR_NULL_POINTER;
}
if (b == 0) {
return ERROR_INVALID_PARAM;
}
*result = a / b;
return SUCCESS;
}
int main() {
printf("=== 东巴文防御性编程示例 ===\n\n");
// 测试参数验证
printf("divide(10, 2) = %d\n", divide(10, 2));
printf("divide(10, 0) = %d\n", divide(10, 0));
// 测试指针检查
process_string("hello");
process_string(NULL);
// 测试数组边界检查
int arr[] = {1, 2, 3, 4, 5};
printf("arr[2] = %d\n", get_element(arr, 5, 2));
printf("arr[10] = %d\n", get_element(arr, 5, 10));
// 测试内存分配检查
int *new_arr = create_array(10);
if (new_arr != NULL) {
printf("数组创建成功\n");
free(new_arr);
}
// 测试错误码
int result;
ErrorCode code = safe_divide(10, 2, &result);
if (code == SUCCESS) {
printf("结果:%d\n", result);
} else {
printf("错误:%s\n", error_message(code));
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
// 东巴文错误处理模式
// 模式1:返回错误码
int function_with_error_code(int param) {
if (param < 0) {
return -1; // 错误
}
// 正常处理
return 0; // 成功
}
// 模式2:返回NULL
void* function_with_null_return(size_t size) {
if (size == 0) {
return NULL; // 错误
}
void *ptr = malloc(size);
return ptr; // 可能是NULL(内存不足)
}
// 模式3:使用输出参数
int function_with_output_param(int input, int *output) {
if (output == NULL) {
return -1; // 错误
}
*output = input * 2;
return 0; // 成功
}
// 模式4:使用errno
#include <errno.h>
int function_with_errno(int param) {
if (param < 0) {
errno = EINVAL; // 设置错误码
return -1;
}
return 0;
}
// 模式5:错误回调
typedef void (*error_callback)(const char *message);
static error_callback g_error_callback = NULL;
void set_error_callback(error_callback callback) {
g_error_callback = callback;
}
void report_error(const char *message) {
if (g_error_callback != NULL) {
g_error_callback(message);
} else {
fprintf(stderr, "错误:%s\n", message);
}
}
int function_with_callback(int param) {
if (param < 0) {
report_error("参数不能为负数");
return -1;
}
return 0;
}
// 模式6:资源清理
int function_with_cleanup(int param) {
int *data = NULL;
FILE *file = NULL;
int result = -1;
// 分配资源
data = (int*)malloc(100 * sizeof(int));
if (data == NULL) {
goto cleanup;
}
file = fopen("data.txt", "r");
if (file == NULL) {
goto cleanup;
}
// 处理数据
// ...
result = 0; // 成功
cleanup:
// 清理资源
if (file != NULL) {
fclose(file);
}
if (data != NULL) {
free(data);
}
return result;
}
int main() {
printf("=== 东巴文错误处理模式 ===\n\n");
// 测试各种模式
int result;
// 模式1
if (function_with_error_code(10) != 0) {
printf("错误:function_with_error_code 失败\n");
}
// 模式2
void *ptr = function_with_null_return(100);
if (ptr == NULL) {
printf("错误:function_with_null_return 失败\n");
} else {
free(ptr);
}
// 模式3
if (function_with_output_param(10, &result) != 0) {
printf("错误:function_with_output_param 失败\n");
} else {
printf("结果:%d\n", result);
}
// 模式4
errno = 0;
if (function_with_errno(-1) != 0) {
printf("错误:%d\n", errno);
}
return 0;
}
#include <stdio.h>
void preventionBestPractices() {
printf("=== 东巴文预防最佳实践 ===\n\n");
printf("编码阶段:\n");
printf(" 1. 使用有意义的变量名\n");
printf(" 2. 添加必要的注释\n");
printf(" 3. 遵循编码规范\n");
printf(" 4. 进行代码审查\n");
printf(" 5. 编写单元测试\n\n");
printf("编译阶段:\n");
printf(" 1. 开启所有警告:gcc -Wall -Wextra\n");
printf(" 2. 使用静态分析工具\n");
printf(" 3. 检查内存泄漏\n\n");
printf("运行阶段:\n");
printf(" 1. 验证输入数据\n");
printf(" 2. 检查返回值\n");
printf(" 3. 处理异常情况\n");
printf(" 4. 记录日志\n\n");
printf("测试阶段:\n");
printf(" 1. 边界值测试\n");
printf(" 2. 异常情况测试\n");
printf(" 3. 压力测试\n");
printf(" 4. 回归测试\n");
}
int main() {
preventionBestPractices();
return 0;
}
#include <stdio.h>
void debuggingTips() {
printf("=== 东巴文调试技巧总结 ===\n\n");
printf("基本技巧:\n");
printf(" 1. 打印调试信息\n");
printf(" 2. 使用断点调试\n");
printf(" 3. 单步执行\n");
printf(" 4. 查看变量值\n");
printf(" 5. 查看调用栈\n\n");
printf("高级技巧:\n");
printf(" 1. 条件断点\n");
printf(" 2. 监视点\n");
printf(" 3. 内存查看\n");
printf(" 4. 汇编调试\n");
printf(" 5. 远程调试\n\n");
printf("工具使用:\n");
printf(" 1. GDB - 调试器\n");
printf(" 2. Valgrind - 内存检测\n");
printf(" 3. AddressSanitizer - 地址消毒\n");
printf(" 4. strace - 系统调用跟踪\n");
printf(" 5. ltrace - 库函数调用跟踪\n\n");
printf("调试策略:\n");
printf(" 1. 二分法定位\n");
printf(" 2. 最小化重现\n");
printf(" 3. 隔离问题\n");
printf(" 4. 对比分析\n");
printf(" 5. 假设验证\n");
}
int main() {
debuggingTips();
return 0;
}
#include <stdio.h>
void errorHandlingPrinciples() {
printf("=== 东巴文错误处理原则 ===\n\n");
printf("基本原则:\n");
printf(" 1. 及时检测错误\n");
printf(" 2. 明确报告错误\n");
printf(" 3. 合理处理错误\n");
printf(" 4. 记录错误信息\n");
printf(" 5. 避免错误传播\n\n");
printf("错误处理方式:\n");
printf(" 1. 返回错误码\n");
printf(" 2. 设置errno\n");
printf(" 3. 返回NULL\n");
printf(" 4. 输出错误信息\n");
printf(" 5. 终止程序\n\n");
printf("资源管理:\n");
printf(" 1. 谁分配谁释放\n");
printf(" 2. 及时释放资源\n");
printf(" 3. 避免重复释放\n");
printf(" 4. 避免内存泄漏\n");
printf(" 5. 使用RAII模式\n\n");
printf("防御性编程:\n");
printf(" 1. 验证输入参数\n");
printf(" 2. 检查返回值\n");
printf(" 3. 使用断言\n");
printf(" 4. 边界检查\n");
printf(" 5. 错误处理\n");
}
int main() {
errorHandlingPrinciples();
return 0;
}
完成本章学习后,请确认:
完成错误排查与调试后,你可以:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
🎯 东巴文进阶提示:调试能力需要大量实践积累。在 db-w.cn,我们提供了丰富的调试案例和实战练习,帮助你快速提升调试技能!