精华内容
下载资源
问答
  • linux 源码分析工具
    千次阅读
    2010-05-30 22:41:00
    更多相关内容
  • linux源码分析工具

    千次阅读 2017-09-10 23:51:49
    linux源代码分析和阅读工具比较 Windows下的源码阅读工具Souce Insight 凭 借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”。Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋...

    linux源代码分析和阅读工具比较



    Windows下的源码阅读工具Souce Insight 凭 借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”。Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代,实 际上,似乎其环境下的任何软件都是处于一种逐鹿中原的态势,也许这就是“集市”之于“大教堂”的优势所在吧!主要的交叉索引工具有:ctags 、 cscope 、 global 、 lxr 、 KScope 、 sourcenav 、 calltree 、 CodeViz 、ncc 、gprof 等。 下面将就各软件的优劣作一简单介绍。这里面当中,我当前分析过他们的源码的有lxr、sourcenav、calltree、ncc。现在正在 sourcenav的基础上进行我需要的改造以更合适分析内核需要。KScope需要进一部考察和分析,如果KScope的代码分析能力(也就是 scope的能力)跟得上sourcenav可能到时会放弃sourcenav转到KScope开发,因为sourcenav的界面和交互性都不怎么好。

    1. ctags


         ctags应该是几个里面最古老的一个了,当然也是获得支持最多的一个,vim默认就支持ctags产生的tag数据库,不过原来的ctags名符其实, 只支持C语言,且分析不够细腻。其新版本名为exuberant ctags,但是它已经远远超出了它名字的范畴,支持包括C语言在内的33种编程语言,准确度上也不错,并且它的开发仍在如火如荼地进行着,前途无量啊!
    配合vim使用,基本上能满足用户的要求。
    常用命令:
    建立数据库命令:

    exuberant-ctags

    在vim编辑器中浏览:

     

    :ta x
    跳转到符号x的定义处,如果有多个符号,直接跳转到第一处
    :ts x
    列出符号x的定义
    :tj x
    可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择。
    Ctrl+]
    跳转到当前光标下符号的定义处,和ta类似。
    Ctrl+t
    跳转到上一个符号定义处,和上面的配合基本上就能自由跳转了。
    另外两个:tn, :tp是在符号的多个定义之间跳转

    美中不足,只能查找符号的定义,不能实现交叉引用查询等其它功能。

    2. Cscope

     

         相比ctags的只能查找符号的定义,cscope则显得更加丰富,虽然他支持C语言,但是它除了能查找函数的定义,还能查找函数在哪里被调用过等,所以能在一定程度上弥补ctags的不足。
    常用命令:
    建立数据库的命令:

    cscope和vim配合使用:

    不再重复vim文档了,自己通过命令
    :help cscope
    去详细学习吧。

    比较遗憾的是,cscope的最后一次更新是在2003年,这个项目似乎也是被人抛弃了,希望以后能被人收养,或者和其它项目合并。

    3. Global


         Global是GNU出品的交叉索引工具,支持C, C++, Yacc, Java 和PHP4五种语言,命令行下表现不错,但是和vim配合使用,就不如前面两个更加亲切了。其特色在于分析得很细腻,我所研究过的,暂时只能 soucenav能超过它。能生成交叉索引的web页,很适合用来做程序的文档。数据库是从berkeley BD 3上改过来的。但和我的要需求却有比较大的差距。因为它只有一个WEB的前端,在功能上,他现有的前端也只实现符号查询和交叉引用查询。

    4. LXR

     

         Linux超文本交叉代码检索工具LXR(Linux Cross Reference),是由挪威奥斯陆大学数学系Arne Georg Gleditsch和Per Kristian Gjermshus编写的。这个工具实际上运行在Linux或者Unix平台下,通过对源代码中的所有符号建立索引,从而可以方便的检索任何一个符号,包 括函数、外部变量、文件名、宏定义等等。不仅仅是针对Linux源代码,对于C语言的其他大型的项目,都可以建立其lxr站点,以提供开发者查询代码,以 及后继开发者学习代码。   
         目前的lxr是专门为Linux下面的Apache服务器设计的,通过运行perl脚本,检索源代码索引文件,将数据发送到网络客户端的Web浏览器上。 任何一种平台上的Web浏览器都可以访问,这就方便了习惯在Windows平台下工作的用户。 关于lxr的英文网站为http://lxr.linux.no/ ,在中国Linux论坛http://www.linuxforum.net 上有其镜象。
         好的说完了。说说缺点,可能我分析得不深入,它的代码不是用C写的,是网页脚本,程序也很短,没有看到有应用数据库。很多的东西都是你浏览的时候才生成的,所以拿过来用或改造的潜力有限,而且代码分析的不够Global细腻。

    5. KScope

     

         KScope是cscope的图形前端,他为那些不熟悉vim或者是不习惯终端作业的人提供了图形界面的选择,界面是这一款软件的一个亮点,比 source insight还好看,从windows转过来做Linux开发的人可能感觉比较亲切。这也是我最近动心的原因。另外,它还有个比较迷人的特点:能生成函 数调用树。但说百了,其实是调用graphviz画出来的。

    6. sourcenav

         snavigator是一个不错的源代码编辑和项目管理软件。有Windows和Linux版本。网址http://sourceforge.net/projects/sourcenav 。
         基本介绍:Source-Navigator is a source code analysis tool. With it, you can edit your source code, display relationships between classes and functions and members, and display call trees.
         这种工具号称是source insight是linux对手,和确,经过我这一轮的GOOGLE后,从分析性能上,只有他和source insight的能平行的。但可操作性方面就远远没有source insight强了,很多功能用起来都没有source insight顺心。界面就比kScope差很远了,这也就是我对KScope心动的原因。和source insight比,还有一点不行的就是,需然生成交叉引用是在后台进行了,但它是一次性连续生成的,而source insight生成是,则更为优先生成客户当前的代码,source insight这一点对客户的考虑真不错。数据库方面采用的也是berkeley BD 4,他和Global一样,在数据库的使用方面,第个表只采用了两个字端,KEY和DATA,也就是说没采用Secondary Databases,这导致很多时候都是把全部的记录返回,然后再优程序来筛选,这种方式把数据库的优点全给埋没了,要知道对linux这类原码,交叉引 用数据库可能达几百M,这么干内存也不够,速度也更不用谈。我还没有研究KScope不知它在这方面怎么样,我觉得sourcenav这方面肯定要改掉。 把数据筛选的工作完全由数据库来做,他们会做得很好。
         可开发性方面,sourcenav做得还算不错,有用户文档和开发文档,代码结构也比较可能,TCL编程也直对比较容易。可以在它原来功能的基础上进行功能扩充。接下来的几编BLOG,我会对它的源码进行分析。   

    7. 其它源码分析工具

         除了上述的体系比较完整的工具外,还有很多源源分析的小工具。这些小工具多数是用来绘制函数调用关系图的。

         绘制函数调用关系图对理解大型程序大有帮助。我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历。如 果运气好一点,借助调试器的单步跟踪功能和call stack窗口,能节约一些脑力。不过如果要分析的是脚本语言的代码,那多半只好老老实实用第一种方法了。如果在读代码之前,手边就有一份调用图,岂不妙 哉?下面举出我知道的几种免费的分析C/C++函数调用关系的工具。

        函数调用关系图(call graph)是图(graph),而且是有向图,多半还是无环图(无圈图)——如果代码中没有直接或间接的递归的话。Graphviz 是专门绘制有向图和无向图的工具,所以很多call graph分析工具都以它为后端(back end)。那么前端呢?就看各家各显神通了。

         调用图的分析分析大致可分为“静态”和“动态”两种,所谓静态分析是指在不运行待分析的程序的前提下进行分析,那么动态分析自然就是记录程序实际运行时的函数调用情况了。

        静态分析又有两种方法,一是分析源码,二是分析编译后的目标文件。

    分析源码获得的调用图的质量取决于分析工具对编程语言的理解程度,比如能不能找出正确的C++重载函数。Doxygen 是源码文档化工具,也能绘制调用图,它似乎是自己分析源码获得函数调用关系的。GNU cflow也是类似的工具,不过它似乎偏重分析流程图(flowchart)。

         对编程语言的理解程度最好的当然是编译器了,所以有人想出给编译器打补丁,让它在编译时顺便记录函数调用关系。CodeViz (其灵感来自Martin Devera (Devik) 的工具 )就属于此类,它(1.0.9版)给GCC 3.4.1打了个补丁。另外一个工具egypt 的思路更巧妙,不用大动干戈地给编译器打补丁,而是让编译器自己dump出调用关系,然后分析分析,交给Graphviz去绘图。不过也有人另起炉灶,自己写个C语言编译器(ncc ),专门分析调用图,勇气可嘉。不如要是对C++语言也这么干,成本不免太高了。分析C++的调用图,还是借助编译器比较实在。

         分析目标文件听起来挺高深,其实不然,反汇编的工作交给binutils的objdump去做,只要分析一下反汇编出来的文本文件就行了。下面是Cygwin下objdump -d a.exe的部分结果:

    00401050 <_main>:
    401050:       55                      push   %ebp
    401051:       89 e5                   mov    %esp,%ebp
    401053:       83 ec 18                sub    $0x18,%esp
       ......
    40107a:       c7 44 24 04 00 20 40    movl   $0x402000,0x4(%esp)
    401081:    &n

    401082:       c7 04 24 02 20 40 00    movl   $0x402002,(%esp)
    401089:       e8 f2 00 00 00          call   401180 <_fopen>

         从中可以看出,main()调用了fopen()。CodeViz带有分析目标文件的功能。

         动态分析是在程序运行时记录函数的调用,然后整理成调用图。与静态分析相比,它能获得更多的信息,比如函数调用的先后顺序和次数;不过也有一定的缺点,比如程序中语句的某些分支可能没有执行到,这些分支中调用的函数自然就没有记录下来。

         动态分析也有两种方法,一是借助gprof的call graph功能(参数-q),二是利用GCC的 -finstrument-functions 参数。

    gprof生成的输出如下:

    index % time    self children    called     name
                    0.00    0.00       4/4           foo [4]
    [3]      0.0    0.00    0.00       4         bar [3]
    -----------------------------------------------
                    0.00    0.00       1/2           init [5]
                    0.00    0.00       1/2           main [45]
    [4]      0.0    0.00    0.00       2         foo [4]
                    0.00    0.00       4/4           bar [3]
    -----------------------------------------------
                    0.00    0.00       1/1           main [45]
    [5]      0.0    0.00    0.00       1         init [5]
                    0.00    0.00       1/2           foo [4]
    -----------------------------------------------

         从中可以看出,bar()被foo()调用了4次,foo()被init()和main()各调用了一次,init()被main()调用了一次。用 Perl脚本分析gprof的输出,生成Graphviz的dot输入,就能绘制call graph了。这样的脚本不止一个人写过:http://www.graphviz.org/Resources.php ,http://www.ioplex.com/~miallen/ 。

    GCC的-finstrument-functions 参数的作用是在程序中加入hook,让它在每次进入和退出函数的时候分别调用下面这两个函数:

    void __cyg_profile_func_enter( void *func_address, void *call_site )
                                    __attribute__ ((no_instrument_function));
    void __cyg_profile_func_exit ( void *func_address, void *call_site )
                                    __attribute__ ((no_instrument_function));

         当然,这两个函数本身不能被钩住(使用no_instrument_function这个__attribute__),不然就反反复复万世不竭了:) 这里获得的是函数地址,需要用binutils中的addr2line这个小工具转换为函数名,如果是C++函数,还要用c++filt进行name demangle。具体方法在《用Graphviz 可视化函数调用 》中有详细介绍,这里不再赘述。

         从适应能力上看,源码分析法是最强的,即便源码中有语法错,头文件不全也没关系,它照样能分析个八九不离十。而基于编译器的分析法对源码的要求要高一些, 至 少能编译通过(gcc 参数 -c)——能产生object file,不一定要链接得到可执行文件。这至少要求源码没有语法错,其中调用的函数不一定有定义(definition),但要有声明 (declaration),也就是说头文件要齐全。当然,真的不全也没关系,自己放几个函数声明在前面就能糊弄编译器:) 至于动态分析,要求最高——程序需得运行起来。如果你要分析的是操作系统中某一部分,比如内存管理或网络协议栈,那么这里提到的两种动态分析法恐怕都不适 用了。

    8. 网上的其它资源

    [1] 使用Gnu gprof进行Linux平台下的程序分析 
    [2] The DOT Language
    http://www.graphviz.org/doc/info/lang.html 
    [3] Graphviz - Graph Visualization Software
    http://www.graphviz.org/ 
    [4] Coverage Measurement and Profiling
    http://www.linuxjournal.com/article/6758 
    [5] 用Graphviz进行可视化操作──绘制函数调用关系图 
    [6] cscope
    http://cscope.sourceforge.net/ 
    [7] KFT(Kernel Function Tracing)
    http://elinux.org/Kernel_Function_Trace 
    ftp://dslab.lzu.edu.cn/pub/kft 
    [8] Call Graph -- Gprof
    http://sourceware.org/binutils/docs-2.17/gprof/Call-Graph.html#Call-Graph 
    [9] 各类分析函数调用关系图的工具 
    http://oss.lzu.edu.cn/blog/blog.php?do_showone/tid_1636.html

    展开全文
  • source Insight3.1介绍——Linux内核源代码分析工具(二).pdf
  • Linux内核分析电子书六本.源码.分析工具LINUX内核源代码情景分析Linux_0_01_内核分析与操作系统设计LINUX系统分析与高级编程技术
  •  在Windows下有sourceinsight这个源码阅读软件(虽然我没用过,但是网上评价还不错),由于我是个Linuxer,并不喜欢用Windows,所以自然是选择在Linux下阅读源码工具了。  下面我将逐一介绍在Linux下阅读源码...
  • 第一章 走进linux 1.1 GNU与Linux的成长 ...1.7 Linux内核源代码分析工具 1.7.1 Linux超文本交叉代码检索工具 1.7.2 Windows平台下的源代码阅读工具Source Insight 第二章 Linux运行的硬件基
  • Linux内核源码分析,学习内核很不错的工具
  • linux性能分析工具

    2021-12-29 11:10:42
    新的BPF性能分析工具 c++开发常用开源性能分析工具 重点研究这几种 1.valgrind 很占用内存,测试环境可以使用。 Memcheck 检测内存泄漏; Callgrind 分析函数调用,可以用来分析开源项目的源码; Cachegrind 分析...

    linux静态分析性能工具

    在这里插入图片描述

    linux性能测试工具

    在这里插入图片描述

    linux性能优化工具

    在这里插入图片描述

    linux性能监测工具:sar

    在这里插入图片描述

    linux性能监测工具:pertools

    在这里插入图片描述

    linux bcc/BPF跟踪工具

    在这里插入图片描述

    bpftrace/eBPF工具

    在这里插入图片描述

    新的BPF性能分析工具

    在这里插入图片描述

    c++开发常用开源性能分析工具

    重点研究这几种
    1.valgrind
    很占用内存,并且启动分析性能下降20-30倍,测试环境可以使用。

    Memcheck 检测内存泄漏;
    Callgrind 分析函数调用,可以用来分析开源项目的源码;
    Cachegrind 分析cpu的cache L1 L2;
    Helgrind 分析多线程竞争问题;
    DRD 线程错误检测;
    Massif 堆栈分析器;
    DHAT 动态堆栈分析;
    Lackey 示例程序,可以自己扩展;
    Nulgrind 也是示例,最小的valgrind工具;
    BBV 仍处于试验状态的基本款矢量生成器。
    

    2.sanitizers
    占用内存少,速度快,主要就是内存检测,gcc4.8以上自带,推荐使用。不退出的进程可以使用__lsan_do_leak_check()执行检查并在发现泄漏时终止,__lsan_do_recoverable_leak_check不终止多次调用。-fsanitize=thread,-fsanitize=address,-fsanitize=leak

    AddressSanitizer 检测地址问题,越界问题,LeakSanitizer 检测内存泄漏
    ThreadSanitizer 检测竞态和死锁
    MemorySanitizer 检测未初始化内存
    HWASAN 新的地址检测,消耗更少内存
    UBSan 未定义特性的检测器
    

    3.gperftools
    gperftools使用了tcmalloc(thread-caching malloc,线程缓冲malloc),推荐使用。

    heap-checking 分析内存泄漏
    heap-profiling 堆栈分析
    cpu profiler  cpu性能分析
    

    4.windows平台直接使用vs2022性能分析工具齐全

    sanitizers原理

    1.AddressSanitizer 原理
    使用内存映射,8个存储字节对应一个检测字节。按8字节对齐,检测字节记录每个存储字节的状态。操作没有记录已使用的内存就会报错。64位系统128t虚拟内存,进程占用虚拟内存20T,主要就是映射用到。
    2.ThreadSanitizer 原理
    也是使用内存映射,一个Shadow State有2,4,8个状态Shadow Words ,每个Shadow Words 占64位(8个字节)。每8个字节对齐的内存映射到一个Shadow State。Shadow Word记录了占用的信息。最重要的是State Machine,一块内存被使用就会在Shadow State的Shadow Word记录使用的线程信息,访问Shadow Word是64位原子操作,如果构成竞态就警告。ThreadSanitizer检测比较耗内存,如果一个Shadow State有4个Shadow Words,进程的内存使用要多用4倍大小。

    ThreadSanitizer很占用内存,要检测竞态和死锁检测不一样,只检测死锁每个线程直接在lock加入的地方记录资源状态,多个资源使用链表连接起来,unlock的地方释放资源并且指向这个资源的上个资源指针置空,每加入一个资源前先判断是否要获取的资源已经存在记录中,如果存在指针指向它并计算是否有环,有环就是死锁。

    uprobe

    bpf用户空间的分析工具,可以在程序运行中不重启就嵌入跟踪函数,嵌入到malloc函数中可以分析内存泄漏。

    展开全文
  • 到如下了... Installation Uncompress and extract the contents of the installation file. For example: % gzip -cd Understand-2.6.530-Linux-32bit.tgz | tar xv
    到如下链接http://www.scitools.com 下载 .tgz文件
    
    解压缩:
    %tar -zxvf Understand*.tgz
    进入scitools目录,
    % cd bin/linux32
     % ./understand
    
    添加如下信息到用户的.bash_profile文件中
    
    
    % export PATH=$PATH:/home/myname/scitools/bin/linux32
    如果你的电脑是64位的,可能就变为如下:
    
    % export PATH=$PATH:/home/myname/scitools/bin/linux64


    注册码如下,在rhel7server x86_64下验证可用
    F1AF6D901A38
    
    19878CBBFB13
    
    B0F234CE4366
    
    

    Treemaps

    treemaps

    Treemaps are an area-based visualization where the size and color of the area are visually representing a metric. This Understand feature allows the user to choose the metric they want to see. This treemap has the metric CountLine tied to size. The color is tied to the metric CountSemicolon. Example of sample project zlib that… Read more »

    UML Class Diagram

    umlGraph

    The UML Class diagram can be viewed for a specific class of your choice: or for your entire project: Both diagrams have options to show the details of each class and solo classes to customize your view. More information about graphs and setting options.

    Control Flow Graphs

    graph_views_control_flow_c

    All of our graphs have options to make them customizable for what you are looking for and making your graphical image what you want to see. More information on how to generate a Control Flow Graph can be found on our support page. Example Control Flow Graph of a C++ function: More information about graphs… Read more »

    Hierarchy Graphs

    graph_views_ada_hiearchy

    Example Hierarchical Graph (Calls) of C function Main: This tree has been manually expanded and contracted to just show what is desired. Example Hierarchical Graph (Expanded Data Members) of a C++ Class: This graph shows all the data fields in the main and children class or sub-types. Example Hierarchical Graph (With Hiearchy) of an Ada… Read more »

    Declaration Graphs

    graph_views_c_method

    Here is an example Declaration Graph of an Ada Package: Note that items like “Close” that extend out of the main box are globals. Items like “Buffer Access” which are inside are private. Example Declaration Graph of a C++ Method: More information on how to configure graphs can be found on our support page.

    Dependency Graphs

    dependenciesGraph2

    Understand can generate graphs that show the hierarchy of an architecture, or just a sub-hierarchy. The dependency graphs include a customizer pane which allows you to modify the graph display by controlling expansion, highlighting, and arrows on a per-node basis. Node children and Edges coming in and going out are easy to see and identify using… Read more »

    展开全文
  • Linux 压力测试工具 stress 的参数详解 为了测试根据服务器的负载情况给大家推荐下 stress 这个压力测试工具具体安装方式就不说了本文主要介绍下 以在环境上验证测试下 参数说明 -? 显示帮助信息 -v 显示版本号 -q ...
  • NULL 博文链接:https://jiji87432.iteye.com/blog/1967134
  • Linux源码目录分析

    2021-12-10 17:57:55
    Linux源码目录分析 1、分析Linux内核的时候,最好编译一遍linux内核,然后将其压缩,拷贝到Windows下。 2、arch/arm/boot/这个目录,Linux内核编译完成后,再此目录下生成image和zImage。 3、arch/arm/boot/dts这个...
  • linux内核源码分析之设备驱动

    千次阅读 2022-03-15 20:00:27
    内核必须向用户应用程序和系统工具提供访问各种设备的方法 用户空间需要知道内核中有哪些设备可用 外设寻址的分层模型 对各个设备的访问,通过层次化的多个抽象层进行。在层次结构的底部是...
  • linux下阅读源代码的工具

    万次阅读 2010-07-22 14:03:00
    说来真是惭愧呀.一直在用VIM 做开发.却不知道VI 里还有这么好使的工具....以下是引用人家的文章.http://blog.chinaunix.net/u1/56619/showart_1822993.html<br /><br /><br />linux源代码分析和阅读工具比较<br
  • sar(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘 I/O、CPU 效率、内存使用...
  • 学习linux内核最好的方式当然是阅读内核源码
  • Linux内核源码阅读工具——source insight4.0Source insight4.0工具的使用入门一、Souce insight建立工程、导入源码二、遍历所有源码文件建立符号索引 Source insight4.0工具的使用入门 本篇博客为学习同步更新博客...
  • IMP 是 GNU 图像处理程序(GNU Image Manipulation Program)的缩写。包括几乎所有图象处理所需的功能,号称Linux下的PhotoShop。
  • 由于Linux内核开发中安全人员的边缘地位(误),安全模块并没有并入主线,而是作为单独的模块存在。 LSM的设计思想是在最少改变内核代码的情况下,提供一个能够成功实现强制访问控制模块需要的结构或者接口。LSM对...
  • linux内核源码分析之内存概述

    千次阅读 2022-04-23 16:03:10
    内存检测工具 内存相关术语 主存:也称为物理内存,描述计算机的高速数据存储区域,通常是动态随机访问内存(DRAM) 虚拟内存:抽象的主存概念 常驻内存:当前处于主存中的内存 匿名内存:无文件系统或者...
  • Linux内核源码如何学习?

    千次阅读 2022-01-17 01:31:33
    码中自有颜如玉!码中自有黄金屋!那么Linux内核代码到底有多少行?我们怎么读完呢?https://www.kernel.org一、内核行数 Linux内核分为CPU调度、内存管理、网络和...
  • Linux性能分析工具汇总合集

    千次阅读 2019-05-15 18:13:35
    如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列。 本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg ...
  • 使用sqoop工具将数据在hive和mysql之间传递
  • linux内存中cache分析

    2019-08-11 01:31:45
    linux-ftools_modify.zip,linux-ftools,AUTHORS,linux-fadvise.c,COPYING,INSTALL,waste_memory.c,linux-ftools.h,install-sh,debian,dirs,compat,changelog,docs,rules,control,copyright,Makefile.am,configure,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,684
精华内容 41,073
关键字:

linux 源码分析工具