方法论

当我们遇到问题,应该怎么办?这不仅应用于程序开发,也是我们在生活中遇到问题的时候,应该想的事儿,怎么办!趁着此次机会,我好好想了七秒钟。

  1. 先问是不是问题,如果不是就不用解决了
  2. 如果确实是问题,那就得先找到问题出现位置,也就是定位问题。怎么定位呢?缩小问题范围是一个办法
  3. 定位问题后,就得分析问题
  4. 最后,解决问题

也就是:问题->定位->分析->解决。我觉得吧,这些步骤,在程序开发中得调试,也是非常有趣的实践方法。

程序开发调试

软件开发过程中,总是经常出现不如意的结果,这个时候就要调试。 并且调试在软件生命周期中,会占用大量的时间,拥有非常大的时间跨度。

出现问题的现象很多,出现的阶段和种类也很多,比如编译阶段出错了,这时候就看编译报错信息就好了。这种错误一般容易解决。软件运行阶段异常了,这时候就需要寻找问题了。

可以通过点灯或者打印确定程序执行流程,得出执行在哪一部分出问题了。

可以通过打印变量等,来查看自己怀疑的点。以上都是比较简单的调试方法。

更多时候,我们更愿意使用调试工具,比如keil调试,gdb调试,jlink调试。可以查看执行流程,函数调用关系,栈信息,全局变量等。

OneOS与调试

上述说明了常见的调试,对OneOS专有的调试组件产生了很多好奇,毕竟调试占据了开发者大量的时间,如果有好的工具能极大地减少调试时间,那可真是太美妙了。

在OneOS有写道:提供控制台调试功能、查看系统状态功能,可帮助开发者进行故障定位,目前包括日志系统组件、shell控制台交互组件以及常用的故障定位组件。

控制台调试功能

先学习下控制台调试,其实就是shell命令行工具,提供了一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。在控制终端输入命令,控制终端通过某个通道(例如串口)将命令传给设备里的shell,shell会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。

提供了很多的命令来查看系统信息,比如内存占用,任务信息,栈是否溢出等。

DLOG 日志系统

日志(log)是对发生某个事件的记录,并进行显示或者保存到文件。其实就是打印信息啦,但做了更多的封装,更多的功能。

支持 4 个等级,优先级由高到低 DLOG_ERROR DLOG_WARNING DLOG_INFO DLOG_DEBUG。更低的等级,可显示更多的信息。

这个日志系统,挺有趣的,如果出现问题了,我可能首先会选择使用shell命令行工具,以及把DLOG日志系统调整为DLOG_DEBUG

eCoreDump组件

eCoreDump组件实现了嵌入式系统的coredump功能,记录当前程序的状态并打包成elf格式的corefile,可以配合gdb离线解析调用栈,查看临时变量。

感觉是对coredump做了整理和移植到OneOS上去了,这个调试功能可能不是开发阶段使用,而是部署软件后的使用,当在运行期间出现问题了,会生成eCoreDump文件,并保存在文件系统中,等到开发者从文件系统中拿出来,然后配合gdb来调试分析错误原因。

内存监测

通过调用mem_monitor_auto_init初始化自动监测,制定必要的内存地址,大小,检测方法,hash函数,以及回调,开始了自动监测,检测点是在任务切换中检测,看是否任务对此内存是否修改过。

有点意思噢,针对踩内存的问题,相信非常有用。

栈回溯

在系统运行或调试过程中,程序总是出现一些出乎意料的现象(例如程序异常或者某个任务运行不是预料的),为了帮助用户快速定位问题,解决用户定位问题难,在操作系统中添加了栈回溯功能。

栈中保存着函数的返回地址、局部变量等,那么我们可以从这些返回地址来确定函数的调用关系、调用顺序。我们通过栈回溯可以查看当前的上下文。

结尾

以上就是OneOS下调试支持的几种方式,通过menuconfig进行配置,我觉得自己受益良多,您呢?

(Top) → Components→ Diagnose Configuration
[ ] Stack back trace enable
[ ] Monitor CPU usage
[ ] Enable wireshark dump
eCoreDump --->
Memory Monitor --->

OneOS下调试支持的几种方式的更多相关文章

  1. VS Code - Debugger for Chrome调试JavaScript的两种方式

    VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故,博客写的不是很多,一直想写一篇VS Code - Debugger for Chrom ...

  2. linux下软件安装的几种方式

    linux下软件安装的几种方式(主要有源码安装, rpm安装, yum安装). 一:源码安装 几乎所有的开源软件都支持在Linux下运行,而这些软件一般都以源码形式发放,只需要Linux安装了gcc. ...

  3. 【转】Linux下软件安装的几种方式

    转自Linux下软件安装的几种方式 Linux 系统的/usr目录 Linux 软件安装到哪里合适,目录详解 Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统 ...

  4. 访问WEB-INF下JSP资源的几种方式(转)

    访问WEB-INF下JSP资源的几种方式 方法一: 本来WEB-INF中的jsp就是无法通过地址栏访问的,所以安全. 如果说你要访问这个文件夹中的jsp文件需要在项目的web.xml文件中去配置ser ...

  5. VSCode的Python扩展下程序运行的几种方式与环境变量管理

    在VSCode中编写Python程序时,由于有些地方要使用环境变量,但是发现设置的环境变量有时不起作用,花了点时间研究了一下,过程不表,直接说结论. 首先,环境变量的设置,Python扩展中有三种方式 ...

  6. linux 下部署nodejs(两种方式)

    本次博客的编写时用的系统环境,刚装好的Centos 6.4  64位虚拟机. 另外关于linux 其他系统的安装 可以参考https://github.com/joyent/node/wiki/Ins ...

  7. WEB-INF目录下文件复制的几种方式

    2018年1月31日 10:42:55 工作完写点博客记录下. 需求:从web-inf下拷贝文件到指定目录. 目录结构 直接贴代码 第一种方式,字节流读取 try { int index = 0; S ...

  8. Ubuntu下软件安装的几种方式,apt,dpkg工具的使用

    通常 Linux 上的软件安装主要有四种方式: 在线安装 从磁盘安装deb软件包 从二进制软件包安装 从源代码编译安装 这几种安装方式各有优劣,而大多数软件包会采用多种方式发布软件,所以我们常常需要全 ...

  9. 设置Mybatis打印调试sql的两种方式

    http://blog.csdn.net/gao36951/article/details/53641432 ********************************************* ...

随机推荐

  1. uniapp 入门

    uniapp官网 uni-app 是一个使用 Vue.js (opens new window)开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小 ...

  2. Java 18 新增@snipppet标签,注释中写样例代码更舒适了!

    在这次的Java 18中,新增了一个@snipppet标签,主要用于JavaDoc中需要放示例代码的场景.其实在Java 18之前,已经有一个@code标签,可以用于在JavaDoc中编写小段的代码内 ...

  3. SpringJdbcTemplate简单实现

    SpringJdbcTemplate 配置文件 1.依赖坐标 <dependencies> <dependency> <groupId>javax.servlet& ...

  4. 《C++Primary》阅读简要总结

    三月份的主要任务之一就是阅读C++Primary这本书,终于在昨天25号下午完成了基础部分的阅读,算是对基础知识整体梳理了一遍,开始看这本书大概可以追溯到去年12月份,在那之前看了C++的入门书籍&l ...

  5. 一文带你速懂虚拟化KVM和XEN

    来源 :蛋蛋团 前言 "云计算"这个技术经过十余年的普及到如今已经可以称得上是家喻户晓了,基于云计算平台,在多个领域内创造了一个又一个的记录:电子商务里亿万人同时在线抢购的的&qu ...

  6. 手脱NsPacK壳

    1.查壳 使用PEiD未能检测到壳信息,这时,我们更换其他工具 从图中可以看到壳的信息为[NsPacK(3.x)[-]] 2.百度壳信息 北斗程序压缩(Nspack)是一款压缩壳.主要的选项是:压缩资 ...

  7. MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中

    union 会删除重复数据 union all 不会删除重复数据 select * from ( select *,'a' as kind from tablea where name is not ...

  8. spring boot 中接口参数为枚举时的反序列化配置(总结)

    步骤 如果是 GET 请求中需要反序列化枚举值(即 url 中的参数[querystring]),确保以下两点 1.1. 重写 StringToEnumConverterFactory 1.2. 配置 ...

  9. Java实现飞机大战游戏

    飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行. 实现效果: 结构设计 角色设计 飞行对象类 FlyObject 战机类 我的飞机 MyPl ...

  10. 造个海洋球池来学习物理引擎【Three.js系列】

    github地址:https://github.com/hua1995116/Fly-Three.js 大家好,我是秋风.继上一篇<Three.js系列:   游戏中的第一/三人称视角>今 ...