码迷,mamicode.com
首页 > 系统相关 > 详细

关于linux和linux驱动程序解bug的技巧和思考方法

时间:2019-03-24 00:19:30      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:相关   最大   交互   免费   理论   linux驱动   nic   占用   cep   

关于linux和linux驱动程序解bug的技巧和思考方法

解bug三步:
1)看log,看现象。
2)对比代码分析过程,程序流程,线程、中断、workqueue等各个独立执行体的交互
3)调试,加入log、验证。 光看代码只能停留在理论上,一定要亲手调试一下才真正知道。另外对比正常和异常时的行为和log区别,交叉试验,才能发现问题的关键。注意各种调试尝试,各种替换调试,即好的和坏的,好的A和好的C,好的A和坏的D,坏的B和好的C,坏的B和坏的D的交叉调试,才能知道问题所在。另外,需要先写简化代码,验证简化版本,再加入后面的功能。

所有的crash、exception等都最终反映为cpu跳到异常处理程序,异常处理程序根据发生异常的地方,决定
1)如果在内核栈,则调panic进而回溯出内核栈。如果看crash dump的log时,看到回溯栈前部分在异常代码中,后部分才是发生异常的栈,(后部分可能还会出现一部分是中断处理程序的栈,一部分是中断处理程序所寄生的线程的栈)。
2)如果判定发生在用户态,则异常处理代码仅给进程发一个信号,然后切换为用户态时,信号处理程序执行时,由信号处理程序去回溯应用栈,例如android 的native代码的debuggerd和java的print callstack,所以用户态栈由用户代码去回溯。内核栈由内核回溯。 回溯栈依赖于编译器实现及DWARF等标准。

由于内核栈最大只有8KB,所以编写内核函数时,需要注意函数局部变量不应太大,例如char A[256];之类的,占用栈大多,会因为一定的栈深度时溢出。所以可以改用static静态变量、或者全局变量、或者动态堆分配。

关于具体的写linux驱动的方法、技巧和注意事项,欢迎观看我的《如何编写linux设备驱动》的视频:
https://edu.51cto.com/course/17132.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

关于linux和linux驱动程序解bug的技巧和思考方法

标签:相关   最大   交互   免费   理论   linux驱动   nic   占用   cep   

原文地址:https://blog.51cto.com/8906847/2367975

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!