一、核心思想:像侦探一样找问题
基本口诀
一看二查三缩小,四验证五预防
一看:观察现象,收集信息
二查:检查最可能的原因
三缩小:把问题范围缩小
四验证:确认找到了真正原因
五预防:防止问题再次发生
二、六大常见问题与快速定位法
1. 程序死机或重启(最常见)
可能原因:内存溢出、数组越界、堆栈溢出、硬件故障
快速检查清单:
□ 1. 先重启,看是否能正常运行 □ 2. 查看重启前的最后一条日志 □ 3. 检查最近修改的代码 □ 4. 测量内存使用量(堆栈还剩多少) □ 5. 检查中断处理是否太长
简单测试:
// 堆栈使用检查(简单版) void check_stack_usage() { char stack_probe; // 如果这个值接近栈底,说明栈快满了 printf("栈地址:%p\n", &stack_probe); }2. 外设不工作(UART、SPI、I2C等)
排查顺序:
电源和时钟:设备供电了吗?时钟使能了吗?
引脚配置:引脚模式设置对了吗?
参数匹配:波特率、数据位等两边一致吗?
信号测量:用示波器看波形
记忆口诀:电时引脚三要素,参数波形最后查
3. 数据出错或乱码
检查顺序:
缓冲区大小:发送的数据超过缓冲区了吗?
数据类型:int、float在不同平台大小不同
字节顺序:大小端问题
同步问题:数据没准备好就读取了
4. 程序跑飞(执行不正常但没死机)
快速诊断:
// 在关键位置添加标记 void important_function() { GPIO_SetBit(LED1); // 灯亮表示进入函数 // ... 你的代码 GPIO_ResetBit(LED1); // 灯灭表示离开函数 }5. 内存泄漏(越来越慢,最后死机)
简单检测法:
记录法:每次申请内存时记下来,释放时删除记录
压力测试:让程序长时间运行,观察内存变化
边界检测:在内存块前后加特殊标记
6. 中断问题
常见错误:
中断