方法论

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

  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. 攻防世界-MISC:2017_Dating_in_Singapore

    这是MISC高手进阶区的题目:题目如下: 点击下载附件一,得到一张pdf图片,除此之外就只有题目给的字符串了,不知道是什么意思(查看了一下WP)原来每一串通过"-"隔开的字符串代表 ...

  2. C++基础-6-继承

    6. 继承 1 #include<iostream> 2 using namespace std; 3 4 5 class Base { 6 public: 7 Base() { 8 m_ ...

  3. os、json、sys、subprocess模块

    os模块 import os 1.创建目录(文件夹) os.mkdir(r'a') # 相对路径 只能创建单级目录 os.makedirs(r'a\b') # 可以创建单级和多及目录 2.删除目录 o ...

  4. flask配置文件、路由设置、模板语法、请求与响应、session使用、闪现功能(flash)

    今日内容概要 flask 配置文件 flask 路由系统 flask模板语法 请求与相应 session 闪现(flash翻译过来的) 内容详细 1.flask 配置文件 # django ---&g ...

  5. 解决 docker 日志占满磁盘导致 docker 服务停止的问题

    #进入 root 模式 sudo -i # 查看目录大小 sudo du -h --max-depth=1 # 应该会定位到这个目录 `/var/libs/docker/containers` # 最 ...

  6. SpringBoot线程池

    1.遇到的场景 提高一下插入表的性能优化,两张表,先插旧的表,紧接着插新的表,若是一万多条数据就有点慢了 2.使用步骤 用Spring提供的对ThreadPoolExecutor封装的线程池Threa ...

  7. 每天一个 HTTP 状态码 200

    200 OK 话不多说,这个状态码应该是最最最常用的了,无人不知,无人不晓: 就是表示请求成功的意思,你若安好,便是晴天. 摘自对于 https://www.google.com/ GET 请求的响应 ...

  8. babel使用

    Babel转码器 Babel定义 Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在老版本的浏览器执行 Babel安装 仅需要在项目文件下安装 npm ins ...

  9. 优先队列STL

    引入 优先队列是一种特殊的队列,它的功能是--自动排序. 基本操作: q.size(); //返回q里元素个数 q.empty(); //返回q是否为空,空则返回1,否则返回0 q.push(k); ...

  10. JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常

    项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2,  ...