关于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

我的新的更多优惠的打包课程链接如下:
https://edu.51cto.com/sd/0a9d4

转载于:https://blog.51cto.com/8906847/2367977

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值