怎么从源码中解掉问题
发布日期:2021-06-29 15:27:59 浏览次数:2 分类:技术文章

本文共 1601 字,大约阅读时间需要 5 分钟。

640?wx_fmt=jpeg

微信改了订阅号的推送,所以不想错过每日的更文,记得标注此公众号为精选星标。

今天有朋友在微信里问到这个问题。算是一个比较经典,也是很多人想要了解的问题。那么今天就抽时间,来讲讲这个话题。

在之前的一篇文章中,我讲了一个模式,遇到新的问题,新的知识,该如何去学,主要就是几个步骤:

  1.  先了解知识背景,以及它能够解决什么问题

  2.  去看官方的demo,以及理解demo的整体逻辑

  3.  试着去写一些东西,从实战出发

这个步骤基本稳定成熟,可以搞定一切的新知识。那么在开发过程中,遇到一个问题,怎么解决它呢?也是有一些基本的步骤:

  1.  先确定环境,确认问题发生的场景

  2.  从大的方向判定,推出基础的逻辑

  3.  从代码入手,验证推论

而要从源码直接定位出问题,有一些基础准备要做。

1. 搜集异常信息,查看log信息

异常信息可以看到一些状况,这里就以 Android App 来进行说明。先找到报错的栈,是 JAVA 异常了 还是 C 异常了。异常的栈是在

哪个位置。通过输出的log,去看是主线程挂了,还是挂在了其他线程。其中,还有个就是Binder 线程,如果有别的应用调用此应用

作为服务端的代码,就会出现Binder线程异常,这个Binder线程的线程名字,一般是 进程id_1 类似这种线程名字。

2. 推论过程,检索代码

当你发现了异常点,下来就是找代码,通过栈定位到问题的地方,这个时候就根据提示信息,是没有权限,还是空指针,还是传参类型没有匹配,等等。

跟代码进行核对,然后看是否能够从原理上讲得通。如果推论跟现象,代码一致,那么基本可以保证问题修复。但是如果问题这么简单就搞定了,就没什么意思了。

那么,我们一般出现的问题是,异常的地方,一个参数或者变量不对,那么怎么找它是在哪里出错的呢?我们要通过代码检索,谁给它赋值了,如果有setXXX,那么要注意别的地方调用修改。简单的方法就是在可疑的地方,加上堆栈,打印出来,再次跑一遍,把出错的时候,是从哪条路径出现的故障。

这样子可以加快定位代码,把无关紧要的去除掉。在做了这些事情后,就要做简单的推论,看看有没有哪个流程能够推通。加之代码验证,调试,快速的追出问题。

这里面要注意的是,我们要在看代码的时候,多看看方法前面的注解,以及文件前头的描述,以及此文件的方法都有哪些,都有哪些变量,大概从名字梳理下,根据出错点,来验证大概的相关联属性或者方法,然后就是收敛,验证,结束。

是不是感觉说的没啥意思,那就是你要慢慢训练了。先要做的就是调试调试,多多做笔记,把大概的框架要学出来的。

比如安卓分析,就那几个方向,应用层,C代码端,驱动层,Framework,Server,权限等等。主要的是要有整个框架,有进程概念,知道出错的过程,都经过了哪些步骤,大致的故障点会在哪里。这个才是核心,也就是熟能生巧,这里真的快不了。

切记,慢慢来,多做笔记,总结问题经验。

3. 修复问题,沉淀

这个问题也是写过,我们要在解决问题后,把流程再走一遍,这个时候时间不紧急,所以需要多看看,把周边的代码看一下,熟悉一下。不能从局部去看,看完了解决了就结束了,这种明显的是浪费了每次的学习机会。解决异常,写一个。解决了失去焦点问题,写一个。解决了权限问题,写一个。解决了绘制问题,写一个。

写完了就完了?

写完了没有结束的,再去学习,从网络上找到资料,再次把流程走一遍,打通框架设计思想,这个才会在后续处理问题时候加速。

这类问题的描述,很容易让人觉得胡吹瞎说,但这个确实就是本质内容,很多时候我们在找的时候,就是错误的逻辑。等到你找到了的时候,其实你已经不需要了。

这个感觉就是,总是在学习的时候,找不到合适的书,等到你真的学懂了,才发现已经有书写过,只是自己当时不懂,忽略了这个内容。

就这样,晚安。

PS:课程嗨翻天,上了 CSDN 的严选推荐。继续战斗起来,朋友们。

推荐你读:

640?wx_fmt=jpeg

转载地址:https://codegg.blog.csdn.net/article/details/90285730 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:马化腾:没有“备胎”会永远被人掐住喉咙
下一篇:打开了神奇之路

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月05日 15时01分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

推荐一个优质Linux技术公众号-作者都是一线Linux代码贡献者们哦 2019-04-29
RT-Thread 编程风格指南 2019-04-29
95后高校电子教师,软硬兼修有趣有料! 2019-04-29
使用 STM32 通用 Bootloader ,让 OTA 更加 Easy 2019-04-29
Cache 的基本概念与工作原理 2019-04-29
装机量超亿台 RISC-V +IoT OS!中科蓝讯与RT-Thread战略合作,共推自主物联网生态发展 2019-04-29
Android程序员必备!面试一路绿灯Offer拿到手软,Android面试题及解析 2019-04-29
Android程序员的春天!12个View绘制流程高频面试题,分享PDF高清版 2019-04-29
深入交流安卓!新鲜出炉的Android面试真题集锦我给你们整理出来了!Android面试题及解析 2019-04-29
深入浅出Android开发!你会的还只有初级工程师的技术吗?一线互联网公司面经总结 2019-04-29
深度剖析原理!超全Android中高级面试复习大纲,含BATJM大厂 2019-04-29
温故而知新!Android开发者该学习哪些东西提高竞争力?成功入职阿里 2019-04-29
火爆知乎的Android面试题-Android-App的设计架构经验谈,大厂内部资料 2019-04-29
看完直接怼产品经理!Android多进程从头讲到尾,跳槽薪资翻倍 2019-04-29
快速从入门到精通!面试的时候突然遇到答不上的问题怎么办?已拿到offer 2019-04-29
Android开发知识体系!腾讯+字节+阿里面经真题汇总,成功入职阿里 2019-04-29
android开发语言!大厂经典高频面试题体系化集合,移动架构师成长路线 2019-04-29
typescript学习(进阶) 2019-04-29
三天敲一个前后端分离的员工管理系统 2019-04-29
axios请求携带cookie实现跨域(后端springsecurity) 2019-04-29