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

一、  源代码的阅读

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

(一)vim

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

(1)配置.vimrc文件

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

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

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

注: 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中增加以下这行:

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

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

(ii)使用ctags

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

 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,加入以下两行:

        let Tlist_Show_One_File=
let Tlist_Exit_OnlyWindow=

到此安装已经完成。

在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文件中输出每个分支的执行次数。

              

linux相关小工具的使用(一)————代码相关工具的更多相关文章

  1. Linux下小工具使用总结

    0. 前言 这篇博客仅用于记录个人在工作中用到的一个小工具,后续用到别的会再补充. 1. Tmux 终端分用器(multiplexer),可以在一个屏幕上创建多个终端,这个工具也可以用于结对编程. 个 ...

  2. AWS成本估算的相关小工具

    1.AWS-partner :云势数据做的在线小工具,有微信版本可以使用,但是涉及的服务很少,更新慢,型号缺,界面不友好.不是很理想,连接如下:     https://www.goclouds.cn ...

  3. Linux相关常用工具

    Xshell Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的. 通常需要通过vpn访问.建立vpn隧道可以通过FortiClient 或者 I ...

  4. 用C语言实现解析简单配置文件的小工具

    本文介绍作者写的一个小工具,简单的代码中包含了C语言对字符串的处理技巧,对文本文件的简单解析,二进制文件的数据复制的方法,以及格式化输出文本文件的示例. 工具的输入是如下内容的配置文件: ;资源管理器 ...

  5. C# 小工具开发--DeBugHttp

    随着RESTful的流行,前后端分离,我们后端开发人员在开发过程中多http相关方法进行测试.这就是这个小工具的初衷. 代码地址:https://github.com/gdoujkzz/DebugHt ...

  6. wordpress主题之后台菜单编辑,小工具

    1一:菜单编辑 在functions.php 文件加入 if (function_exists('register_nav_menus')) { register_nav_menus(array( / ...

  7. 【小工具系列】Python + OpenCV 图片序列转换成视频

    图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...

  8. 三个 DAL 相关的Java代码小工具

    最近在做 DAL (Data Access Layer 数据访问层) 的服务化,发现有不少地方是人工编写比较繁琐的,因此写了几个小工具来完成. 1.  从 DAO 类自动生成 CoreService ...

  9. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

随机推荐

  1. BZOJ 3277 串 (广义后缀自动机)

    3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...

  2. hdu 5586 sum

    Problem Description There is a number sequence A1,A2....An,you can select a interval [l,r] or not,al ...

  3. Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法

    在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...

  4. sqlite数据库操作详细介绍 增删改查,游标

    sqlite数据库操作详细介绍 增删改查,游标     本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code     package com.example ...

  5. php跨服务器传递对象

    最近因为研究跨域名,跨服务器的问题,所以无聊,就想到了一个跨服务器传递对象的问题. 想要跨服务器传递数据,那么就要使用到get或者post提交. 我这里的方法有点复杂,但是因为平时工作时,有封装相应的 ...

  6. Codeforces 245H Queries for Number of Palindromes

    http://codeforces.com/contest/245/problem/H 题意:给定一个字符串,每次给个区间,求区间内有几个回文串(n<=5000) 思路:设定pd[i][j]代表 ...

  7. Binary Search Tree BST Template

    Use one queue + size variable public class Solution { public ArrayList<ArrayList<Integer>&g ...

  8. web应用的发布

    将web应用打包成.war类型的...因为将其发布到服务器时,其自动解压...非常方便

  9. Windows无需CygWin 使用NDK开发

    无需cygwin,使用NDK进行开发   NDK从7开始自带编译器,在windows上无需配置cygwin的环境. 在eclips中配置NDK路径 在eclipse中点击菜单栏window-Perfe ...

  10. Ant-进阶

    Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令其实 ...