系列文章目录

高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作
高效阅读嵌入式源码系列二:understand阅读linux、uboot等源码
高效阅读嵌入式源码系列三:understand阅读经keil MDK编译的源码


文章目录

  • 系列文章目录
  • 前言
  • 一、understand是什么?
  • 二、导入项目
  • 三、 搜索功能
  • 四、项目视图
  • 五、常用窗口视图
  • 六、总结

前言

之前一直使用source insight 4阅读C程序源码,非常喜欢它的context与relation,可惜source insight不能过滤复杂的条件编译(会干扰对源码的理解)。机缘巧合之下,从知乎中获知了understand这个静态分析神器,经几个月的使用,不断阅读各位同仁前辈的文章,加速对understand的熟悉。目前,已基本从source insight转战于understand了。下面,结合各位同仁前辈的文章,将近期使用understand做一个总结,记录于此。

一、understand是什么?

understand是Scitools的产品,目前可找到v6.1版本的下载版,本系列文章以understand v6.1为示例,v6.1 如何下载与安装请自行百度。
understand具有以下几个特点:

  1. 支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持;
  2. 多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X
  3. 代码语法高亮、代码折迭、交叉跳转、书签等基本阅读功能。
  4. 可以对整个project的architecture、metrics进行分析并输出报表。
  5. 可以对代码生成多种图(butterfly graph、call graph、called by graph、control flow graph、UML class graph等),在图上点击节点可以跳转到对应的源代码位置。
  6. 支持Perl API、python,便于扩展。
  7. 内置的目录和文件比较器。
  8. 支持project的snapshot,并能和自家的TrackBack集成便于监视project的变化。

二、导入项目

导入项目有两种方法,一种是从菜单栏点击File–>New–>Project,另一种是点击下面界面中间的New Project。

点击后,会进入到如下界面,你可以点击Add Directory添加需要阅读的源码目录,添加目录后点击continue进入下一步。

在如下出现的界面,选择No.

在出现的 create your understand project,勾选Configure advanced settings after project creation。同时,选择好将工程保存的位置与工程名字,方便下回阅读源码时open工程。点击Create Project进入下一步。

稍等几秒钟,会弹出如下界面,对本工程进行配置。

首先,对本工程涉及的编程语言进行设置,uboot一般涉及到汇编、C等。

接下来对Files进行配置。像uboot这类大型源码工程,最好精准添加本工程涉及的源文件,不然understand在分析时会卡死(原因是本工程无关源文件太多会导致静态分析太慢)。故,如何精准添加本工程所需的源文件,是值得思考的问题,这将是下一篇文章的内容了,今天聚集于如何使用understand。
点击Files下上部的第二黑色小块,如下图,点击Import a list of files…

便可导入本工程所需文件的txt(如何生成该txt文件见下一篇文章)。

下一步设置File Options,主要设置本工程所用的编码格式,一般选择UTF-8。

接下来,就是针对各编程语言设置编译器类型了。在C++中的Options中,设置分析模式Strict或Fuzzy,一般精准分析Strict。然后是Compiler编译器,有GCC、GNU GCC、Keil arm、IAR ARM等,各位根据需要进行选择。

还可选择编程语言的标准版本,本工程在Language Standard中选择C99标准。
点击OK,跳出是否开始分析工程的提示框,点击Yes.understand将分析本工程。

如果将本工程所需文件精准地添加进来后,分析过程会很快,一般为几十秒。understand界面的左下角会显示分析进度与警告、错误等信息。

警告与错误信息,大多错误一般是某些库某些文件未添加至工程中,如C函数库、类型定义等,各位自己根据情况进行处理。
分析完成后,左侧会出你的项目结构,即Project Browser,中间出现你项目的名称,此时你可以操作左面项目来查看相关代码,如下图所示:

这么多文件如何快速定位,那肯定是搜索,该软件针对不同位置,不同属性有不同的搜索方法,下面介绍搜索功能。

三、 搜索功能

  1. 左侧项目结构中搜索
    在这个搜索中你可以快速搜索你要查看的文件。快捷键,鼠标点击左侧上面项目结构窗口,然后按Ctrl + F 键会出现如下图所示的搜索框,在框中输入你想要的文件名回车即可打开文件。

    在打开的文件的左上角有个 { }… ,点击可选择要阅读的函数名。

    同时,可通过view->Scope List打开scope list。

    点击scope list函数名,就可在Previewer中看到该函数的实现。
  2. 函数方法与变量搜索
    将鼠标定位到右侧代码中,点击Ctrl + F,会弹出搜索框,输入函数方法或变量名 回车即可:
  3. 在文件中搜索,也就是全局搜索
    在右侧文件中右侧点击,选择Find in便可选择搜索的范围:本工程or工作空间 等等。

快速搜索是软件快速使用必备的技能,包括我们常用的source insight 4一样,快速定位方法,常量等,可以快速帮助我们解决问题。

understand可以绘制流程图等功能,下面就针对这个功能介绍一些图形的绘制功能,帮助你快速分析代码。

四、项目视图

项目视图包含很多的功能,能够自动生成各种流程图结构图,帮助你快速理清代码逻辑、结构等,以便快速理解项目流程,快速开发,视图查看方式有两种,一种是鼠标点击你要查看的函数方法上面,然后右键弹出菜单,鼠标移动到Graphical Views,然后弹出二级菜单,如下图所示

或者,另一种方式是点击要查看的函数方法,然后找到代码上面菜单栏中的如下图标:然后点击图标右下角的下拉箭头,弹出如下菜单,即可选择查看相关视图

  1. Butterfly
    如果两个函数间存在关系,就显示这两个函数间的调用和被调用关系:如下图,image_setup_linux函数的关系图。
    2. Calls
    展示从你选择这个函数开始的整个调用链条。
    3. Control Flow
    你选择的这个函数的控制流程图,帮助我们理解某个函数的实现。
    4. UML Sequence Diagram
    展示函数间的时序关系图
    以上几个是我们常用的关系图,剩下几个各位可自行探索、使用。

注意

以上各类项目视图中,均可点击某个函数名,在Previewer中查看其实现。如:

题外话

各位看官,看到这是不是感觉到understand的强大,一个关系图就可将函数间的关系理得很顺,更别说条件编译的过滤了(未满足条件编译的直接蒙板显示,如下图)。更何况还有流程图、时序图等(还有其他有助于我们理解源码的功能待大家去发掘使用,懂的人自会爱上这款软件。

五、常用窗口视图

下面介绍常用的几个view.

  1. Previewer
    这个类似source insight 4的context window,欲查看某个函数的实现或变量在哪定义,便可 Ctrl+左健单击 即可在Previewer中查看。如下图image-setup_linux示例
    有Previewer非常香,从source insight 4迁移到understand的成本便会低很多。
    注意:左键单击某个函数或变量时,会在Prewviewer中显示,左键双击则会在右侧主窗口中显示。
  2. Scope List
    之前在介绍搜索功能时,提过ScopeList,这方便我们快速地查看某个函数。注意,左键单击某个函数名时,会在Previewer中显示;左键双击则会在右侧主窗口中显现。
    3. Project Browser
    这个就不用多说了,查看某个工程的所有文件的,可单击快速查看某个文件。

六、总结

以上只是对understand做个入门介绍,更多功能还是靠自己去使用、去查看各个功能视图的展示结构以及作用。软件,工具而已,孰能生巧,多操作几下就会了,所以不再做过多的解释。最终希望这款软件能够帮助你快速开发,快速阅读别人的或者自己的代码。

注:
本文参考了这篇博客,非常感谢该文作者,谢谢。
Understand:高效代码静态分析神器详解

高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作相关推荐

  1. k8s源码分析 pdf_如何高效阅读 Kubernetes 源码?

    IT 技术日新月异,想必每个 IT 人都会有类似的焦虑:我该学习什么?哪些知识学到就是赚到?怎样学习才能最有效提升编程能力? 阅读优秀的代码是提高编程能力万无一失的办法.诚然,提高编程能力的显著方法是 ...

  2. 从9个组件开始,教你如何高效的阅读nginx源码?

    从9个组件开始,教你如何高效的阅读nginx源码?|内存池.线程池.内存共享组件实现. http处理流程.phase原理.红黑树.配置文件.惊群.原子操作 专注于服务器后台开发,包括C/C++,Lin ...

  3. 如何高效、优雅、愉快地阅读项目源码?

    代码是形式,逻辑是神韵. 引子 本文探索如何阅读成熟框架的源码. 温馨提示 欲速则不达.阅读源码很容易理解为就是直接去阅读代码本身.实际上,代码只是形式,逻辑才是神韵. 凡是有助于去理解逻辑,理解其原 ...

  4. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  5. 源码系列第1弹 | 带你快速攻略Kafka源码之旅入门篇

    大家过年好,我是 华仔, 又跟大家见面了. 从今天开始我将为大家奉上 Kafka 源码剖析系列文章,正式开启 「Kafka的源码之旅」,跟我一起来掌握 Kafka 源码核心架构设计思想吧. 今天这篇我 ...

  6. 手把手带你阅读Mybatis源码(三)缓存篇

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读M ...

  7. 源码解读_入口开始解读Vue源码系列(二)——new Vue 的故事

    作者:muwoo 转发链接:https://github.com/muwoo/blogs/blob/master/src/Vue/2.md 目录 入口开始解读Vue源码系列(一)--造物创世 入口开始 ...

  8. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  9. idea调试源代码c语言,IDEA阅读spring源码并调试

    目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...

最新文章

  1. Python学习笔记:Day14 完成Web App
  2. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)
  3. devc++源文件未编译_悬赏万元,重现「木兰」编程语言编译器
  4. Celex Update CodeForces - 1358C(打表找规律)
  5. Bash脚本教程之算数运算
  6. 计算机专业考研过关率高么,考研过国家线的几率有多大?被刷的有多少?
  7. Java自动切表_java_Mybatis自动创建表和更新表结构,最近有小伙伴问我mybatis有没有 - phpStudy...
  8. expected an indented block
  9. 【Java从0到架构师】Redis 进阶 - pipline、发布订阅、Bitmap、HyperLogLog、GEO
  10. SVN提交时显示:Path is not a working copy directory
  11. LR报错 No buffer space available Try changing the registry value 端口号不够用了
  12. LINUX SHELL中大小写转换及注意事项
  13. access ok linux,使用linux宏access_ok()有什么意义
  14. python自动化框架搭建过程_一步一步教你编写与搭建自动化测试框架——python篇...
  15. FSM有限状态机(三段式)-Verilog实现
  16. win10进程太多怎么优化_摆脱流氓软件,这16款实用的Windows优化软件让你的系统更好用...
  17. 2019年2月CNNIC第43次《中国互联网络发展状况统计报告》
  18. 医学病理图像:细胞间质与间质细胞的区别
  19. 个人网站性能优化经历(6)网站安全方面优化
  20. csv和json文件

热门文章

  1. 二分查找的递归与非递归实现
  2. 数学速算法_小学数学速算法,掌握了至少提高20分!
  3. (三十八)期权定价的蒙特卡洛模拟方法
  4. 【校招VIP】IT职位校招简历千万不要用两栏的模板,另外,告诉你个陷阱:越个性机会越少
  5. tomcat资源请求慢_tomcat响应过慢——解决办法
  6. python富翁与陌生人编程_GitHub近10万星:印度小哥用Python和Java实现所有AI算法
  7. 基于Vue实现一个简易的小程序框架,浅谈kafka | 每日掘金第 194 期
  8. 跨市场套利——策略简介与风险因素
  9. 百度直接搜IP可以查看本机外网IP
  10. 上网看视频国家版八段锦,很好的预防和治疗久坐办公室带来的肩周颈椎疾病...