下面列出调试中的实战经验总结,不定时更新。
1.函数的栈空间有限,在函数内部申请buf的时候不能过大,比如:
void capture_demo()
{
char buf[3][16*1024];
......
}
buf这样的临时变量size过大,超出了函数的栈大小限制,会出难查的问题;
如果真的需要buf有这么大的size,可以申请堆空间。
2.linux内核驱动只提供直接的操作接口,jobs都由应用层来做,比如:
读取硬件buf中的数据,并存成文件,原因是一方面,在应用层实现写文件
和逻辑操作接口丰富;另一方面由于内核调试手段有限,在应用层调试复杂逻辑
更加方便;
3.在调试一个复杂的功能时,如果有正确的思路,则会保证调试过程稳扎稳打,
比如,
特殊值法:在验证数据传输通路时,可以先用常数或顺序计数值特殊值来
首先验证通路传输的正确性;
4.对于一个简单的功能,需要用代码来实现,首先,大脑中想好了思路,并落实为纸面
的功能模块框图和单个模块的流程图;其次,各个击破,分别实现各个模块代码,并分别
测试,确保模块内部正确性;最后,在调试新代码之前,先用特殊值和一般值输入,纸面验证下
是否可以得到预定的输出,最后再做调试;