目录
1 信心--没有解决不了的bug
2 耐心、不要着急、静下心来、用脑思考
2.1 开始解决问题前不要着急,先思考
2.2 在解决问题的过程中也不要着急,要冷静思考
3 网络搜索
4 大模型问答:必应、kimi、通义千问、文心一言
5 看芯片手册、SDK手册、官方demo、开源代码的源码
6 寻求技术支持、技术交流群
7 gdb调试
7.1 集成开发环境调试:vscode、clion、visual studio等
7.2 gdb命令调试
7.3 硬件仿真器调试、ARM裸板调试:J-Link、ST-Link、TI的XDS调试器
8 打印
8.1 应用程序的printf、cout以及第三方log
8.2 驱动程序的printk、串口打印
9 利用一些工具
9.1 内存泄漏分析工具工具:asan、valgrind
9.2 跟踪系统调用
10 对比调试法:一次解决ffmpeg错误的方法记录
11 把自己的代码再看一遍
12 挨段代码注释法
13 总结:灵活运用、不要局限或痴迷于某一种方法
14 参考文献
1 信心--没有解决不了的bug
在解决问题前要有信心,相信只要自己去做,那么bug就一定能解决,没有解决不了的bug,在解决bug的过程中,如果经过多次尝试各种方法还是没能解决也不要放弃,再继续尝试说不定突然就解决了,以前你的很多bug都是不放弃最终解决掉了。
2 耐心、不要着急、静下心来、用脑思考
2.1 开始解决问题前不要着急,先思考
当程序遇到问题或者错误的时候,不要经过思考,直接去网上搜答案,或者直接去调试,应该先静下心来思考有哪些可能得原因,是不是自己哪里配置错误而不是程序有问题,比如遇到缺陷错误时,别着急,冷静思考,-CSDN博客,当整体大方向确定没问题之后再想办法去解决问题。
2.2 在解决问题的过程中也不要着急,要冷静思考
在解决问题的过程中,可能你尝试了一些方法都没能解决,这时候也不要像无头苍蝇一样继续尝试各种方法,而是应该静下心来思考,因为你已经试了一些方法了,那么你肯定对这个问题有初步的认识了,那么这时候应该基于前面的尝试去考虑下这个问题最大的可能性是什么,边思考边尝试,而不是一股脑的着急用各种不同的方法尝试解决。
3 网络搜索
当遇到报错的时候,最长想到的就是去网上搜一下,这个需要注意的是尽量首选x歌,然后才是x度,因为x歌的搜索结果确实很节省时间,有时候x度搜索前几页都没有标准答案,而x歌第一条就是正确解决方法。
4 大模型问答:必应、kimi、通义千问、文心一言
随着大模型的兴起,我们遇到问题可以直接问大模型,大模型相比网络搜索有时候能够省掉你的时间,但是有一个需要注意的不是痴迷于大模型,有时候大模型没有的,自己去网上搜索反而能找到答案,你最开始觉得大模型好用就什么问题直接问大模型,大模型没有你觉得就懒得搜了,这个意识要改掉。
必应中的 Microsoft Copilot (bing.com)
Kimi.ai - 帮你看更大的世界 (moonshot.cn)
通义tongyi.ai_你的全能AI助手-通义千问 (aliyun.com)
文心一言 (baidu.com)
5 看芯片手册、SDK手册、官方demo、开源代码的源码
有时候在用一些芯片的时候,如果遇到一些错误码,那么可以去芯片手册看看这个错误码代表哪种类型的错误,还有有时候用的接口报错,那么去SDK手册里面看一下这个接口的使用条件,或者传入的参数是不是有什么要求,或者自己的调用流程是不是不对。还有看一下官方的demo,然后是不是自己使用的跟官方的demo有什么不一样,还有就是比如再用opencv、ffmpeg等这些开源代码的时候,可以去看一下开源代码的源码,或者他们的头文件介绍,比如下面这个错误,当初去看一下opencv头文件的函数介绍也许解决的效率就更高了。
记帮两个同事解决的一个奇怪bug-CSDN博客
6 寻求技术支持、技术交流群
有时候用的是一些厂家芯片,网上就没有资料,那么这时候就是去找厂家的技术支持,只能这样解决,要不然自己摸索也不会有答案。
7 gdb调试
7.1 集成开发环境调试:vscode、clion、visual studio等
这个是我最常用的一个方法,用集成开发环境调试,能够打断点看程序执行,单步执行,能够看到各种变量,能看堆栈,看函数调用层次关系特别方便,但还是一个注意事项,就是不要局限于这种方法,有时候如果这种方法一直没能找到错误原因,那就换一个,虽然这个方法很好用但不要痴迷于他。
使用visual studio 远程编辑和调试linux代码_visual studio 远程编译-CSDN博客
ubuntu上安装vscode,并远程开发与远程调试服务器代码_vscode ssh远程连接ubuntu后,怎么打开项目代码-CSDN博客
vscode远程调试服务器的Python代码_vscode 远程调试python代码-CSDN博客
搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试_vscode gdbserver-CSDN博客
7.2 gdb命令调试
使用gdb命令调试,也可以看一些变量,重点是可以bt查看堆栈信息。尤其是有时候在一些小的嵌入式开发板上用集成开发环境调试不太方便的时候,可以用gdb命令去调试一些错误。
Linux应用调试之使用gdb和gdbserver_gdbserver安装-CSDN博客
gdb调试python的segmentation fault错误_debian gdb 调试python segmentation fault-CSDN博客
使用GDB调试python调用的C++共享库_python 调用c语言库,如何gdb-CSDN博客
Linux下生成core文件,并用gdb调试core文件/ gdb调试段错误方法_gdb a.out core-CSDN博客
7.3 硬件仿真器调试、ARM裸板调试:J-Link、ST-Link、TI的XDS调试器
对于ARM芯片,我们可以直接用硬件仿真器去调试,这样能看到他内部的寄存器值,也能像IDE那样单步执行,查看变量的值,设置断点,对于ARM逻辑调试时,这个硬件仿真器就很有用,还有TI的硬件仿真器还可以直接抓取音频的波形,还可以把内存的值保存成文件。
Code Composer Studio (CCS) 集成开发环境及TI仿真器的使用_code composer studio target configurations-CSDN博客
ARM裸板调试之JTAG原理-CSDN博客
ARM裸板调试之JTAG调试体验_制作 arm jtag-CSDN博客
ARM裸板调试之JTAG调试命令行调试_arm 如何用jtag来调试-CSDN博客
ARM裸板调试之JTAG调试源码级调试_arm jtag-CSDN博客
8 打印
8.1 应用程序的printf、cout以及第三方log
这个不用多说了,虽然已经有前面的IDE以及gdb调试了,但是有些时候printf打印反而能解决一些调试没法或者不太好解决的问题,打印除了打印出来变量的值以外,还可以打印出来行号和函数名,具体方法在下面博客
C/C++ 中的__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__,-CSDN博客
Linux应用调试之配置修改内核打印用户态段错误信息_段错误 打印详细信息-CSDN博客
8.2 驱动程序的printk、串口打印
对于驱动程序可以用printk的方法进行打印调试,这个printk很多时候就能帮我们解决很多问题了。
Linux驱动调试之printk的原理-CSDN博客
Linux驱动调试之printk的使用_linux printk-CSDN博客
Linux驱动调试之打印到proc虚拟文件_linux驱动打印信息-CSDN博客
ARM裸板调试之串口打印及栈初步分析_arm的串口调试-CSDN博客
ARM裸板调试之点灯法_点灯法跟踪调试-CSDN博客
9 利用一些工具
9.1 内存泄漏分析工具工具:asan、valgrind
写C/C++代码有时就会遇到一些内存泄漏,那么可以借助内存泄漏分析工具进行查找。
内存错误分析工具----asan(AddressSanitizer)的介绍和使用-CSDN博客
内存泄漏查找工具----valgrind简介与使用-CSDN博客
9.2 跟踪系统调用
下面这几个方法我没用过,我只是看了学习视频做了笔记,以后我用到再看。
Linux应用调试之使用strace命令跟踪系统调用_strace detach-on=execve-CSDN博客
Linux驱动调试之段错误分析_根据pc值确定出错的代码位置_怎么根据驱动ko加载地址确定-CSDN博客
Linux驱动调试之段错误分析_根据栈信息确定函数调用过程_linux 内核调用栈函数关系 无法显示栈地址-CSDN博客
Linux驱动调试之自制工具_寄存器编辑器_linux ram 寄存器驱动程序-CSDN博客
Linux驱动调试之修改系统时钟中断定位系统僵死问题_linux系统时钟卡死-CSDN博客
10 对比调试法:一次解决ffmpeg错误的方法记录
有一次在使用ffmpeg做视频解码的时候解码mp4视频报错,然后我用vscode各种调试都找不到原因,那怎么办,这时候我试了下用下面的命令是可以的
ffmpeg -c:v h264_nvmpi -i cars.mp4 -f null -
然后这个ffmpeg命令是ffmpeg的fftools编译生成的,
那么我打开两个vsocde,一个vscode调试这个fftools代码,一个vscode调试我自己的工程代码,然后逐步调试,然后看一下到底是哪里有差距,最后发现是我的ffmpeg里面有个地方的payload的size和ffmepgtools差距40个字节,然后再去晚上搜索什么原因,最终修改代码。
11 把自己的代码再看一遍
有时候上面的方法都没解决掉,那么静下心来把自己的代码再看一遍捋一遍,可能会有意外收获。
12 挨段代码注释法
有时候我们遇到比如说内存泄漏吧,我用asan这种工具也没能解决,各种方法尝试了都不行,那么我们可以一点点注释代码,看看注释掉哪一块代码之后错误消失了,这样逐步缩小错误代码范围,这种方法看似很笨,但是有时候却很好用。
13 总结:灵活运用、不要局限或痴迷于某一种方法
上面这些方法是要灵活运用的,而不是只用一种,
- 比如之前你觉得大模型挺好用的,遇到问题就去问大模型,然而有时候自己网上搜索反而能找到答案;
- 还有就是用IDE调试的方法确实挺好用的,但是你不能遇到问题也不思考就打开了调试器去调试,然后陷到这种方法里面了。
14 参考文献
遇到缺陷错误时,别着急,冷静思考,-CSDN博客
必应中的 Microsoft Copilot (bing.com)
Kimi.ai - 帮你看更大的世界 (moonshot.cn)
通义tongyi.ai_你的全能AI助手-通义千问 (aliyun.com)
文心一言 (baidu.com)
Linux应用调试之使用gdb和gdbserver_gdbserver安装-CSDN博客
使用GDB调试python调用的C++共享库_python 调用c语言库,如何gdb-CSDN博客
Linux下生成core文件,并用gdb调试core文件/ gdb调试段错误方法_gdb a.out core-CSDN博客
gdb调试python的segmentation fault错误_debian gdb 调试python segmentation fault-CSDN博客
使用visual studio 远程编辑和调试linux代码_visual studio 远程编译-CSDN博客
ubuntu上安装vscode,并远程开发与远程调试服务器代码_vscode ssh远程连接ubuntu后,怎么打开项目代码-CSDN博客 vscode远程调试服务器的Python代码_vscode 远程调试python代码-CSDN博客
搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试_vscode gdbserver-CSDN博客
Code Composer Studio (CCS) 集成开发环境及TI仿真器的使用_code composer studio target configurations-CSDN博客
ARM裸板调试之JTAG原理-CSDN博客
ARM裸板调试之JTAG调试体验_制作 arm jtag-CSDN博客
ARM裸板调试之JTAG调试命令行调试_arm 如何用jtag来调试-CSDN博客
ARM裸板调试之JTAG调试源码级调试_arm jtag-CSDN博客
C/C++ 中的__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__,-CSDN博客
Linux驱动调试之printk的原理-CSDN博客
Linux驱动调试之printk的使用_linux printk-CSDN博客
Linux驱动调试之打印到proc虚拟文件_linux驱动打印信息-CSDN博客
ARM裸板调试之串口打印及栈初步分析_arm的串口调试-CSDN博客
ARM裸板调试之点灯法_点灯法跟踪调试-CSDN博客
记帮两个同事解决的一个奇怪bug-CSDN博客
内存错误分析工具----asan(AddressSanitizer)的介绍和使用-CSDN博客
内存泄漏查找工具----valgrind简介与使用-CSDN博客
Linux应用调试之配置修改内核打印用户态段错误信息_段错误 打印详细信息-CSDN博客
Linux应用调试之使用strace命令跟踪系统调用_strace detach-on=execve-CSDN博客
在NVIDIA Jetson AGX Orin中使用jetson-ffmpeg调用硬件编解码加速处理_jetson orin 安装ffmpeg-CSDN博客
Linux驱动调试之段错误分析_根据pc值确定出错的代码位置_怎么根据驱动ko加载地址确定-CSDN博客 Linux驱动调试之段错误分析_根据栈信息确定函数调用过程_linux 内核调用栈函数关系 无法显示栈地址-CSDN博客
Linux驱动调试之自制工具_寄存器编辑器_linux ram 寄存器驱动程序-CSDN博客