高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作
系列文章目录
高效阅读嵌入式源码系列一:静态分析神器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具有以下几个特点:
- 支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持;
- 多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X
- 代码语法高亮、代码折迭、交叉跳转、书签等基本阅读功能。
- 可以对整个project的architecture、metrics进行分析并输出报表。
- 可以对代码生成多种图(butterfly graph、call graph、called by graph、control flow graph、UML class graph等),在图上点击节点可以跳转到对应的源代码位置。
- 支持Perl API、python,便于扩展。
- 内置的目录和文件比较器。
- 支持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,中间出现你项目的名称,此时你可以操作左面项目来查看相关代码,如下图所示:
这么多文件如何快速定位,那肯定是搜索,该软件针对不同位置,不同属性有不同的搜索方法,下面介绍搜索功能。
三、 搜索功能
- 左侧项目结构中搜索
在这个搜索中你可以快速搜索你要查看的文件。快捷键,鼠标点击左侧上面项目结构窗口,然后按Ctrl + F 键会出现如下图所示的搜索框,在框中输入你想要的文件名回车即可打开文件。
在打开的文件的左上角有个 { }… ,点击可选择要阅读的函数名。
同时,可通过view->Scope List打开scope list。
点击scope list函数名,就可在Previewer中看到该函数的实现。
- 函数方法与变量搜索
将鼠标定位到右侧代码中,点击Ctrl + F,会弹出搜索框,输入函数方法或变量名 回车即可:
- 在文件中搜索,也就是全局搜索
在右侧文件中右侧点击,选择Find in便可选择搜索的范围:本工程or工作空间 等等。
快速搜索是软件快速使用必备的技能,包括我们常用的source insight 4一样,快速定位方法,常量等,可以快速帮助我们解决问题。
understand可以绘制流程图等功能,下面就针对这个功能介绍一些图形的绘制功能,帮助你快速分析代码。
四、项目视图
项目视图包含很多的功能,能够自动生成各种流程图结构图,帮助你快速理清代码逻辑、结构等,以便快速理解项目流程,快速开发,视图查看方式有两种,一种是鼠标点击你要查看的函数方法上面,然后右键弹出菜单,鼠标移动到Graphical Views,然后弹出二级菜单,如下图所示
或者,另一种方式是点击要查看的函数方法,然后找到代码上面菜单栏中的如下图标:然后点击图标右下角的下拉箭头,弹出如下菜单,即可选择查看相关视图
- Butterfly
如果两个函数间存在关系,就显示这两个函数间的调用和被调用关系:如下图,image_setup_linux函数的关系图。
2. Calls
展示从你选择这个函数开始的整个调用链条。
3. Control Flow
你选择的这个函数的控制流程图,帮助我们理解某个函数的实现。
4. UML Sequence Diagram
展示函数间的时序关系图
以上几个是我们常用的关系图,剩下几个各位可自行探索、使用。
注意
以上各类项目视图中,均可点击某个函数名,在Previewer中查看其实现。如:
题外话
各位看官,看到这是不是感觉到understand的强大,一个关系图就可将函数间的关系理得很顺,更别说条件编译的过滤了(未满足条件编译的直接蒙板显示,如下图)。更何况还有流程图、时序图等(还有其他有助于我们理解源码的功能待大家去发掘使用,懂的人自会爱上这款软件。
五、常用窗口视图
下面介绍常用的几个view.
- Previewer
这个类似source insight 4的context window,欲查看某个函数的实现或变量在哪定义,便可 Ctrl+左健单击 即可在Previewer中查看。如下图image-setup_linux示例
有Previewer非常香,从source insight 4迁移到understand的成本便会低很多。
注意:左键单击某个函数或变量时,会在Prewviewer中显示,左键双击则会在右侧主窗口中显示。 - Scope List
之前在介绍搜索功能时,提过ScopeList,这方便我们快速地查看某个函数。注意,左键单击某个函数名时,会在Previewer中显示;左键双击则会在右侧主窗口中显现。
3. Project Browser
这个就不用多说了,查看某个工程的所有文件的,可单击快速查看某个文件。
六、总结
以上只是对understand做个入门介绍,更多功能还是靠自己去使用、去查看各个功能视图的展示结构以及作用。软件,工具而已,孰能生巧,多操作几下就会了,所以不再做过多的解释。最终希望这款软件能够帮助你快速开发,快速阅读别人的或者自己的代码。
注:
本文参考了这篇博客,非常感谢该文作者,谢谢。
Understand:高效代码静态分析神器详解
高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作相关推荐
- k8s源码分析 pdf_如何高效阅读 Kubernetes 源码?
IT 技术日新月异,想必每个 IT 人都会有类似的焦虑:我该学习什么?哪些知识学到就是赚到?怎样学习才能最有效提升编程能力? 阅读优秀的代码是提高编程能力万无一失的办法.诚然,提高编程能力的显著方法是 ...
- 从9个组件开始,教你如何高效的阅读nginx源码?
从9个组件开始,教你如何高效的阅读nginx源码?|内存池.线程池.内存共享组件实现. http处理流程.phase原理.红黑树.配置文件.惊群.原子操作 专注于服务器后台开发,包括C/C++,Lin ...
- 如何高效、优雅、愉快地阅读项目源码?
代码是形式,逻辑是神韵. 引子 本文探索如何阅读成熟框架的源码. 温馨提示 欲速则不达.阅读源码很容易理解为就是直接去阅读代码本身.实际上,代码只是形式,逻辑才是神韵. 凡是有助于去理解逻辑,理解其原 ...
- webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...
引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...
- 源码系列第1弹 | 带你快速攻略Kafka源码之旅入门篇
大家过年好,我是 华仔, 又跟大家见面了. 从今天开始我将为大家奉上 Kafka 源码剖析系列文章,正式开启 「Kafka的源码之旅」,跟我一起来掌握 Kafka 源码核心架构设计思想吧. 今天这篇我 ...
- 手把手带你阅读Mybatis源码(三)缓存篇
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读M ...
- 源码解读_入口开始解读Vue源码系列(二)——new Vue 的故事
作者:muwoo 转发链接:https://github.com/muwoo/blogs/blob/master/src/Vue/2.md 目录 入口开始解读Vue源码系列(一)--造物创世 入口开始 ...
- Ioc容器beanDefinition-Spring 源码系列(1)
Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...
- idea调试源代码c语言,IDEA阅读spring源码并调试
目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...
最新文章
- Python学习笔记:Day14 完成Web App
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)
- devc++源文件未编译_悬赏万元,重现「木兰」编程语言编译器
- Celex Update CodeForces - 1358C(打表找规律)
- Bash脚本教程之算数运算
- 计算机专业考研过关率高么,考研过国家线的几率有多大?被刷的有多少?
- Java自动切表_java_Mybatis自动创建表和更新表结构,最近有小伙伴问我mybatis有没有 - phpStudy...
- expected an indented block
- 【Java从0到架构师】Redis 进阶 - pipline、发布订阅、Bitmap、HyperLogLog、GEO
- SVN提交时显示:Path is not a working copy directory
- LR报错 No buffer space available Try changing the registry value 端口号不够用了
- LINUX SHELL中大小写转换及注意事项
- access ok linux,使用linux宏access_ok()有什么意义
- python自动化框架搭建过程_一步一步教你编写与搭建自动化测试框架——python篇...
- FSM有限状态机(三段式)-Verilog实现
- win10进程太多怎么优化_摆脱流氓软件,这16款实用的Windows优化软件让你的系统更好用...
- 2019年2月CNNIC第43次《中国互联网络发展状况统计报告》
- 医学病理图像:细胞间质与间质细胞的区别
- 个人网站性能优化经历(6)网站安全方面优化
- csv和json文件
热门文章
- 二分查找的递归与非递归实现
- 数学速算法_小学数学速算法,掌握了至少提高20分!
- (三十八)期权定价的蒙特卡洛模拟方法
- 【校招VIP】IT职位校招简历千万不要用两栏的模板,另外,告诉你个陷阱:越个性机会越少
- tomcat资源请求慢_tomcat响应过慢——解决办法
- python富翁与陌生人编程_GitHub近10万星:印度小哥用Python和Java实现所有AI算法
- 基于Vue实现一个简易的小程序框架,浅谈kafka | 每日掘金第 194 期
- 跨市场套利——策略简介与风险因素
- 百度直接搜IP可以查看本机外网IP
- 上网看视频国家版八段锦,很好的预防和治疗久坐办公室带来的肩周颈椎疾病...