程序遇到问题错误bug时的13种解决方法途径总结以及之前的一些具体例子

news2024/11/15 10:17:43

目录

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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0921VGG网络实现

深度学习之VGG网络搭建 1.VGG动机2.VGG架构3.代码4.结论1.VGG动机 随着卷积网络在计算机视觉领域的快速发展,越来越多的研究人员开始通过改变模型的网络结构在提高在图像识别任务中的精度,例如使用更小的卷积核和步长[2]。基于类似的想法,论文作者提出可以尝试通过改变卷积…

【设计模式】创建型模式(三):单例模式

创建型模式(三):单例模式 1.概念2.案例3.实现方式3.1 懒汉式,线程不安全3.2 懒汉式,线程安全3.3 饿汉式3.4 双检锁/双重校验锁(DCL,Double-Checked Locking)3.5 登记式/静态内部类3.…

俄罗斯OZON新生儿产品好不好卖,OZON新生儿产品

Top1 遥控水球坦克 Танк на радиоуправлении стреляющий орбизами PANAWEALTH 商品id:1384249985 月销量:692 欢迎各位OZON卖家朋友点击这里选品: 👉 D。DDqbt。COm/74rD 遥控射击水…

【项目管理进阶】风险问题

前言 各位盆友,你们期待的项目管理进阶系列有新的消息,请注意查收,并反馈哦~ 在参加项目的过程中,你是否面临或参加过类似如下的场面: 为了立项,先调研市场、技术、社会、组织内部的现状为了科学的管理项目…

如何使用Claude进行Android App开发 —— 基于Jetpack和Compose的电影App实例

如何使用Claude进行Android App开发 —— 基于Jetpack和Compose的电影App实例 近年来,人工智能(AI)在软件开发中的应用越来越广泛,帮助开发者在设计、编码、测试和优化中提高生产效率。Claude是Anthropic开发的一款强大的AI助手&…

Redis的三种持久化方法详解

Redis持久化机制详解 | JavaGuide Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式: 快照(snapshotting,RDB)只追加文件(append-only file, AOF)RDB 和 A…

Vue使用axios二次封装、解决跨域问题

1、什么是 axios 在实际开发过程中,浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后,官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的详细介…

C++:类和对象OJ题

目录 一、求123...n 二、计算日期到天数的转换 三、日期差值 四、打印日期 一、求123...n 这里先把题目链接放在这里求123.....n 描述: 求123...n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C…

鸿萌数据恢复服务: 修复 Windows, Mac, 手机中 “SD 卡无法读取”错误

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 公司是多款国际主流数据恢复软件的授权代理商,为…

老年人养生之道:岁月静好,健康常伴

老年人养生之道:岁月静好,健康常伴 随着年岁的增长,老年人更需注重养生,以维持身心的和谐与健康,享受幸福晚年。养生不仅是一种生活态度,更是一种智慧的选择,它涵盖了饮食、运动、心理、社交等…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(一)-概述

简介 此前的专栏介绍Onesearch1.0和2.0,详情参考4 参考资料,本文解释onesearch 3.0,从Elasticsearch6升级到Elasticsearch8代码实现 ,Elasticsearch8 废弃了high rest client,使用新的ElasticsearchClient,…

Hash入门-通过线性探测解决哈希冲突

unordered_set void test_unordered_set() {unordered_set<int> us;us.insert(4);us.insert(2);us.insert(1);us.insert(5);us.insert(6);us.insert(2);us.insert(2);//去重unordered_set<int>::iterator it us.begin();while (it ! us.end()){cout << *it…

Springboot使用ThreadPoolTaskScheduler轻量级多线程定时任务框架

简介&#xff1a; Spring注解定时任务使用不是很灵活&#xff0c;如果想要灵活的配置定时任务&#xff0c;可以使用xxl-job 或者 quartz等定时任务框架&#xff0c;但是过于繁琐&#xff0c;可能成本较大。所以可以使用ThreadPoolTaskScheduler来灵活处理定时任务 ThreadPoolT…

人工智能开发实战辅助诊断应用解析

内容导读 项目分析预备知识项目实战 一、项目分析 1、提出问题 随着人们生活水平的提升和健康意识的增强&#xff0c;民众定期进行身体健康体检已成为常态&#xff0c;这种早期的疾病检测和筛查可以及早发现身体里已经出现的异常体征信息&#xff0c;做出正确诊断和有效处理…

分布式系统的概念与设计模式

概念 定义&#xff1a;分布式系统是指将数据和计算任务分散到多个独立的计算机上&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同对外提供服务。分布式系统不仅提高了系统的可靠性和可扩展性&#xff0c;还增强了系统的并发处理能力和数据管理能力。 特点&…

内存:生成式AI带来全新挑战与机遇

之前小编也写过多篇AI存储相关的文章&#xff0c;包括AI背景与分层存储的分析&#xff0c;以及AI存储重点从训练转向推理等内容。具体参考&#xff1a; 深度剖析&#xff1a;AI存储架构的挑战与解决方案 存储正式迈入超大容量SSD时代&#xff01; 这可能是最清晰的AI存储数据…

多线程篇七

多线程篇七 若笔者理解有误&#xff0c;欢迎交流指正⭐ 定时器 什么是定时器 听到定时器&#xff0c;首先想到的是“闹钟”.到一个设置好的时间之后就执行某个指定好的代码.(在实际开发中非常常用&#xff0c;如网络通信【邮件发送】) 你在抢演唱会门票&#xff0c;已经到了…

使用madExcept检测内存泄漏

代码异常堆栈跟踪&#xff1a;Mad Except 一、安装 官网 运行&#xff0c;选择madExcept5然后安装。 输入yes继续 二、使用 新建一个VCL项目 在project中多了一项设置 选择OK后会发现项目多了几个引用单元。 此时运行程序&#xff0c;再退出&#xff0c;会显示没有任何内存…

prober found high clock drift,Linux服务器时间不能自动同步,导致服务器时间漂移解决办法。

文章目录 一、场景二、问题三、解决办法&#xff08;一&#xff09;给服务器添加访问网络能力&#xff08;二&#xff09;手动同步1. 检查有没有安装ntp2. 没有安装ntp则离线安装ntp2.1 下载安装包2.2 安装2.3 启动 ntp 3. 设置内部时钟源3.1 编辑/etc/ntp.conf3.1 重启ntp服务…

2010-2020年全国30个省以GDP为核心的区域经济韧性数据(含原始数据+代码+结果)

2010-2020年全国30个省以GDP为核心的区域经济韧性数据(含原始数据代码结果) 1、时间&#xff1a;2010-2022年 2、来源&#xff1a;统计年鉴、各省年鉴、国家统计局 3、指标&#xff1a;地区生产总值 4、范围&#xff1a;30省 5、参考文献&#xff1a; 数字经济及其内部耦…