在调试程序的过程中,可以自由地查看相关的源代码(如果有源代码的话)是一项最基本的特性。
      一些IDE在这方面做得相当好,GDB当然也提供了这项特性,虽然不如IDE直观,但在一定程度上要比IDE更加灵活和快捷。
      GDB之所以能够知道对应的源代码,是因为调试版的可执行程序中记录了源代码的位置;因为源代码的位置在编译之后可能会移动到其它地方,所以GDB还会在当前目录中查找源代码,另外GDB也允许明确指定源代码的搜索位置。默认情况下,GDB在编译时目录中搜索,如果失败则在当前目录中搜索,即$cdir:$cwd,其中$cdir指的是编译时目录(compilation directory),$cwd指的是当前工作目录(current working directory)。
      在GDB中使用查看源代码相关的命令时,有一个当前文件的概念,当命令的位置参数没有限定一个文件的时候(不论是明确限定还是隐含限定),将使用当前文件。当前文件默认是main函数所在文件,如果程序当前正处于断点位置,则断点所在文件即为当前文件。
      与当前文件的概念类似,还存在一个当前行的概念,它默认为main函数的开始处。如果使用gdb载入一个可执行文件,然后单单执行一条简单的list命令,你会发现输出的源代码并非是从第一行开始的,这是因为当前行默认在main函数附近处的缘故。
      1.设置和获取源代码显示数量:
         默认情况下,GDB显示指定位置处以及其前后的10行代码,但是这是一个可设置的值。
         set listsize count:设置list命令显示的源代码数量最多为count行,0表示不限制行数。
         show listsize:显示listsize的值。
      2.编辑源代码:
         在一些情况下,我们希望在编辑器中显示或者编辑源代码,GDB允许我们使用自己喜欢的编辑器。
         可在环境变量EDITOR中指定GDB使用的编辑器,例如:EDITOR=/usr/bin/gedit;export EDITOR;gdb
         edit location:在编辑器中编辑位置location处的源代码,如果省略location,则编辑当前位置。
      3.搜索源代码:
         有的时候,我们希望在当前文件中进行搜索,GDB提供了这样的命令。
         search regexp:从当前行的下一行开始向前搜索。
         rev regexp :从当前行的上一行开始向后搜索。
         有的时候,你会发现search命令总是提示“Expression not found”,这是因为当前行可能已经是最后一行了,特别是文件很短的时候。这里需要注意的是,任何list命令都会影响当前行的位置,并且由于每次都是多行输出,所以对当前行的影响并非简单地向前一行或者向后一行。
          search命令本身也会影响当前行的位置。
      4.源代码位置:
         GDB之所以可以查看到源代码,是因为它知道源代码放在哪里。
         在一个调试会话中,GDB维护了一个源代码查找目录列表,默认值是编译目录和当前工作目录。当GDB需要一个源文件的时候,它依次在这些目录中查找,直到找到一个或者抛出错误。
         GDB还维护了一个路径替换规则,将要搜索的原始路径按照找到的第一个规则做前缀替换,然后再在源码搜索目录中查找文件。
         GDB允许明确指定源代码位置,或者路径替换规则,以应付源代码位置迁移的情况。
         directory path-list:将一个或者多个源代码搜索目录加入到当前源码搜索目录列表的前面,目录之间使用空格间隔。
         directory:不带参数的directory将源码搜索目录恢复为默认值。
         set directories path-list:将源码目录设置为path-list,但是会补上默认目录。
         show directories:显示源码搜索目录列表。
         set substitute-path from to:设置目录替换规则,放置在规则列表的末端。
         unset substitute-path [path]:删除path对应的替换规则,或者删除所有的替换规则。
         show substitute-path [path]:显示path对应的替换规则,或者显示所有的替换规则。
      5.查看机器码:
        在一些必要的时候,我们需要查看汇编代码来诊断问题。GDB提供了这种可能。
        GDB提供了两种能力:显示源代码位置与指令地址之间的映射;显示指定位置的汇编代码。
        info line linespec:显示源代码linespec处对应的汇编地址范围。
        info line *addr:显示地址addr处对应的源代码位置。
        disassemble,disassemble /m,disassemble /r:显示指定地址范围内的汇编代码,有4种使用形式,第一种不带参数,显示当前正在执行的函数的汇编代码;第二           种是一个参数,显示该地址所在函数的汇编代码;第三种是两个参数的disassemble start,end,显示地址[start,end)内的汇编代码;第四种是两个参数的                       disassemble start,+length,显示地址[start,start+length)内的汇编代码。参数可以是16进制的地址,也可以是函数名。/m表示混合输出源代码和汇编代码,/r表           示混合输出二进制和汇编代码。
        set disassembly-flavor instruction-set:设置显示汇编代码时使用的风格,目前只针对intel x86系列,可取的值为att和intel,默认是att。
        show disassembly-flavor:显示disassembly-flavor设置
        set disassemble-next-line on|off|auto:当程序停止下来的时候,是否显示下一行源代码的汇编代码,默认为off。
        show disassemble-next-line:显示disassemble-next-line设置。
      6.显示指定位置的源代码:
        list命令可用于显示指定位置处的源代码。list命令会影响当前行和当前文件。
        list命令有多种方式指定要显示的源代码范围,可以是行号,函数名,甚至是指令地址。
        常用的如下:
        list linenum:显示指定行数附近的代码。
        list function:显示指定函数附近的代码。
        list *addr:显示指定地址附近的代码。

编程工具系列之二------使用GDB的源代码查看功能的更多相关文章

  1. 编程工具系列之一------使用GDB的堆栈跟踪功能

    在调试程序的过程中,查看程序的函数调用堆栈是一项最基本的任务,几乎所有的图形调试器都支持这项特性. GDB调试器当然也支持这一特性,但是功能更加灵活和丰富. GDB将当前函数的栈帧编号为0,为外层函数 ...

  2. 小米范工具系列之二:小米范 web目录扫描器

    最新版本1.1,下载地址:http://pan.baidu.com/s/1c1NDSVe  文件名scandir,请使用java1.8运行 小米范web目录扫描器主要功能是探测web可能存在的目录及文 ...

  3. C#基础拾遗系列之二:C#7.0新增功能点

    第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 ...

  4. 【Android Studio安装部署系列】二十三、Android studio查看Gradle版本号

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 File——Project Structure 单击Project 可以看到,当前项目的gradle版本号是4.4. 参考资料 An ...

  5. Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框

    Spinner是一个列表选择框.相当于弹出一个菜单供用户进行选择. Spinner继承AdapterView Spinnet支持的XML的属性: android:entries:使用数组资源设置该下拉 ...

  6. .NET 4 并行(多核)编程系列之二 从Task开始

    原文:.NET 4 并行(多核)编程系列之二 从Task开始 .NET 4 并行(多核)编程系列之二 从Task开始 前言:我们一步步的从简单的开始讲述,还是沿用我一直的方式:慢慢演化,步步为营.   ...

  7. maven(项目管理工具系列 maven 总结二)

    ♣maven是什么? ♣maven下载.安装 ♣了解maven仓库 ♣eclipse配置maven ♣创建maven项目 ♣把maven项目转化为web项目 1.maven是什么? Maven是一个项 ...

  8. 单元测试系列之二:Mock工具Jmockit实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  9. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

随机推荐

  1. python import其他文件夹下的模块

    模块的路径不在默认搜索路径中,需要在sys.path中添加 import syssys.path.append('需要模块的文件夹路径')

  2. Java中二维数组与面向对象

    1:二维数组(理解) (1)元素是一维数组的数组. (2)格式: A:数据类型[][] 数组名 = new 数据类型[m][n]; B:数据类型[][] 数组名 = new 数据类型[m][]; C: ...

  3. python模块之collections

    我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型: (1) ...

  4. M3: 将页面元素制作为图片

    本小节将介绍如何将页面元素保存为图片,在前一小节中,我们加入了名称为gridMsg的Grid Control,现在我们将使用RenderTargetBitmap把gridMsg这个页面元素保存为一张图 ...

  5. PL/SQL工具连接ORALCE数据库的方法

    http://www.cnblogs.com/dongzhiquan/archive/2011/11/21/2257629.html 1.利用ORACLE NET MANAGER工具 1)打开 ORA ...

  6. webdriver如何定位多层iframe中元素

    在 web 应用中经常会出现 iframe 嵌套的应用,假设页面上有 A.B 两个 iframe,其中 B 在 A 内,那么定位 B 中的内容则需要先到 A,然后再到 B. iframe 中实际上是嵌 ...

  7. 如何修改Eclipse在Debug时背景色

    比较喜欢暗色的Eclipse主题,安装了Eclipse color theme,使用了Oblivion这个黑色背景的主题. 更换了暗色的Eclipse主题后,Debug时看不清文字: 需要更背景颜色, ...

  8. Apache服务器配置技巧

    1.如何设置请求等待时间 在httpd.conf里面设置: TimeOut n 其中n为整数,单位是秒. 设置这个TimeOut适用于三种情况: 2.如何接收一个get请求的总时间 接收一个post和 ...

  9. windows多线程相关

    1.多线程同步的方法 a)entercirticalsection leaveciriticalsection b)Mutex互斥对象 waitforsingleobject releasemutex ...

  10. Centos 6.5安装redis

    1.下载 wget http://download.redis.io/releases/redis-2.8.13.tar.gz 2.解压 tar zxvf redis-2.8.13.tar.gz 3. ...