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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于linux和linux驱动程序解bug的技巧和思考方法相关的知识,希望对你有一定的参考价值。

关于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驱动的技巧

linux下的gedit命令使用方法与技巧

求教一个关于在Linux下解压的问题

Linux学习: 使用gdb和gdbserver进行调试

Linux进阶:让效率翻倍的Bash技巧

Linux学习: 使用gdb和gdbserver进行远程调试