zoukankan      html  css  js  c++  java
  • linux相关小工具的使用(一)————代码相关工具

         在linux环境下,对于程序员来说,知道使用一些好用的小工具,对源代码的阅读、编译和调试都有着事半功倍的效果,这里我也是边学边写的原则,把自己知道的一丁点小知识分享给大家。

     一、  源代码的阅读

         首先要说一下,源代码的阅读工具,这里我知道的主要有vim和emacs两种,好像据某国外大学调查研究显示:使用vim的普调手比较小,这可能是因为vim的快捷键比较集中在一起,不许要手太大吧,当然这也可能是用emacs的人黑用vim的。由于本人手比较小,所以理所当然的使用了vim。

          (一)vim

          这个vim在一般的linux发行版里面都是有的,也就不需要安装,但是系统自带的vim是最原始的,还需要对其进行一些改造。

             (1)配置.vimrc文件

          在linux登录账户的根目录下, 输入命令:vim .vimrc, 然后再加入一些配置的代码,这里我推荐使用的一份:

      1 set nocompatible
      2 "不使用vi默认键盘布局   <----这个很重要,如果不配置,在编辑模式下按方向键会输入字符,很不方便>
      3 set number
      4 "显示行号
      5 set autoindent
      6 "自动对齐
      7 set smartindent
      8 "智能对齐
      9 set showmatch
     10 "括号匹配模式
     11 set ruler
     12 "显示状态行
     13 set incsearch
     14 set shiftwidth=4
     15 set softtabstop=4
     16 set noexpandtab
     17 set cindent
     18 "C语言格式对齐
     19 set nobackup
     20 "不要备份文件
     21 set clipboard+=unnamed
     22 "与windows共享剪贴板
     23 syntax on
     24 "支持语法高亮
     25 au BufReadPost * if line("'"") > 0|if line("'"") <= line("$")|exe("norm '"")|else|exe "norm $"|endif|endif
     26 "打开到上次阅读位置

            当然这只是很简易的,你也可以加上你想要的其他的代码,很多很多的

            注: vimrc配置文件是一个很重要的文件,很多插件加入到vim中去,都会在vimrc中添加一些代码,以保证使用的方便性

             (2)vim的简单使用

            这里就是记忆vim的一些基本命令啦,当然你记得越多越好啦。我这里为了偷懒就直接上王道吧:        

             这个里面有很多命令,要是都能熟悉,vim也就使用的很不错啦

        

        (二)vim上的小插件

          这个光有vim看源代码还是远远不够的,特别是比较大的工程文件,看源代码时候需要到处跳转,查找呀什么的,所以你还需要加入一些小的插件来配合使用,这里面的插件数目非常多,常见的比如ctags、taglist和cscope等等,这里呢我使用的是ctags+taglist组合,就介绍下它们吧。

           (1)ctags

         ctags因为它的简单小巧方便而被很多程序员所推崇,当然这也是我使用它的主要原因。

            (i)安装ctags

                1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录,

                2)然后进入源代码根目录执行./configure,

                3)然后执行make,

                4)编译成功后执行make install。

                5)在~/.vimrc中增加以下这行:

    1  map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
    2  set tags=tags;
    3  set autochdir

                 这里面第二行就是让ctags优先在本目录查找tags文件

            (ii)使用ctags

         ctags的使用非常简单,先是在工程源文件目录下,在终端输入下面命令:

    1 ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .

         这样就会迭代的生成tags文件,为阅读源代码做好准备的文件,紧接着你就可以在vim里面打开某一个源文件,使用以下几个命令辅助代码阅读:

              1)   Ctrl-]    跳转到光标所在符号的定义。

              2)  Ctrl-t    回到上次跳转前的位置。

         更多功能通过命令man ctags或在Vim命令行下运行help ctags查询。

           (2)taglist   

            Taglist是vim的一个插件,提供源代码符号的结构化视图。

            1)从http://www.vim.org/scripts/script.php?script_id=273下载安装包,也可以从http://vim-taglist.sourceforge.net/index.html下载。

            2)进入~/.vim目录,将Taglist安装包解压,解压后会在~/.vim目录中生成几个新子目录,如plugin和doc(安装其它插件时,可能还会新建autoload等其它目录)。

            3)进入~/.vim/doc目录,在Vim下运行"helptags ."命令。此步骤是将doc下的帮助文档加入到Vim的帮助主题中,这样我们就可以通过在Vim中运行“help taglist.txt”查看taglist帮助。

            4)打开配置文件~/.vimrc,加入以下两行:

    1        let Tlist_Show_One_File=1
    2        let Tlist_Exit_OnlyWindow=1

            到此安装已经完成。

            在Vim命令行下运行TlistToggle命令就可以打开Taglist窗口,再次运行TlistToggle则关闭。如下图所示:

     二、  源代码的调试

                 源代码的调试,这里面我自己用的是GDB调试,以前觉得GDB很麻烦,就使用很土的printf调试法,现在还是觉得GDB更强大和高效

            (一) GDB

                 首先,gdb的安装,我记忆中现在的linux版本基本上都是自带的了,如果没有的话那就使用apt-get install安装吧。

             (1)GDB调试的准备

                 这个就是你在使用GCC编译的程序时候,加上一个GCC的编译选项 -g 就可以了,它会告诉编译器生成一些GDB分析时候需要的信息

            例如: gcc -g -o test test.c

             (2)GDB调试的选项

                 编译之后,就可以直接使用GDB调试test程序了: gdb test  , 这条命令就可以进入到GDB调试test程序的状态中,借着你可以用很多操作:

                 1)l/list  这个是将test的源代码,每次10行的输出到屏幕上去

                 2)break + line_num/func_name   在对应的行号上或者函数名上设置断点

                      break ... if <condition>   ..可以是上述的参数,condition表示条件,在条件成立时停住。比如可以设置break if i=100,表示当i为100时停住程序。

                      break +/-offset  在当前行+/-offset处设置断点

                      info break 查看已经设置的断点信息

                      r/run 运行程序,直到断点处

                      c/continue  继续运行,到下一个断点

                      n/next  单步运行

                      p/print var  打印变量的值

                      bt  查看函数栈堆

                      finish 退出函数

                      q  退出GDB 

                 3) 除了上面说的breakpoint之外,还有几种暂停点:观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)

                     clear 清除上面说的所有暂停点

                     delete [breakpoints] [range...] 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)

                     disable [breakpoints] [range...]  使暂停点失效

                     enable [breakpoints] [range...] 使暂停点生效 

                     condition <bnum> <expression> 修改断点号为bnum的停止条件为expression     对应上面的根据条件设置断点

                     condition <bnum>清除断点号为bnum的停止条件。

                     ignore <bnum> <count>表示忽略断点号为bnum的停止条件count次

                  4)在暂停点设置运行命令   当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。

                         commands [bnum]
                           ... command-list ...
                         end

                         例如:          break foo if x>0
                                             commands
                                             printf "x is %d/n",x
                                             continue
                                             end

                   5)其他命令

                        u/until 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

                        ni 当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)

        (二) GCOV

                     gcov是用来统计程序里的代码被执行了多少次,可以方便的定位到代码热点

                (1)使用方法:

                       $ gcc –Wall –fprofile-arcs –ftest-coverage cov.c(或者直接-o生成可执行文件cov.o,否则生成a.out)

                       // 这就生成了一个可以用于测试代码覆盖的程序,其包含额外的指令用于记录程序执行到的每一行代码的次数。

                       // “-ftest-coverage”编译选项添加计数被执行到的行的次数,而“-fprofile-arcs”选项合并程序中每条分支中的用于计数的代码。

                       ./a.out(如果先前你-o是生成con.o文件,那就./cov.o)  

                        //此时程序运行中采集到的数据被写入到当前目录下各个后缀名为“.bb”“.bbg”和“.da”的文件中。

                       $ gcov [-abc] cov.c 生成.gcov文件可以查看

                 (2)相关选项

                         -a(--all-blocks)    .gcov文件中输出每个基本快(basic block)的执行次数。如果没有-a选项,则输出'main'函数这个block的执行次数

                         -b(--branch-probabilities)   .gcov文件中输出每个分支的执行频率,并有分支统计信息。

                         -c(--branch-counts 默认选项)   .gcov文件中输出每个分支的执行次数。 

                  

  • 相关阅读:
    C语言I博客作业08
    第十一周助教总结
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I作业004
    第十三周助教总结
    C语言I博客作业09
    第十二周助教总结
    C语言I博客作业08
  • 原文地址:https://www.cnblogs.com/sosohu/p/3152216.html
Copyright © 2011-2022 走看看