重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
解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
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。