GDB是UNIX及UNIX-like下的调试工具,通常gdb使用前置条件:编译时加入debug信息,这里指的是C++。

  gcc/g++调试选项

     gcc/g++是在编译时加入-g,-g分4个等级:

    1. -g0等于不加-g;即不包含任何信息
    2. -g1只包含最小信息,一般来说只有你不需要debug,只需要backtrace信息,并且真的很在意程序大小,或者有其他保密/特殊需求时才会使用-g1
    3. –g2为gdb默认等级,包含绝大多数你需要的信息
    4. –g3包含一些额外信息,例如包含宏定义信息

  关于gcc/g++优化级别,总结如下:

    gcc/g++ -O选项,gcc编译C,g++编译C++,-O分4个等级:

    1. -O0编译不优化,如果指定了多个-o选项,不管带不带数字,最后一个选项才是生效的选项
    2. -O1是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成
    3. -O2是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用多一些标记。设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间
    4. -O3是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的
    5. -Os这个等级用来优化代码尺寸。其中启用了-O2中不会增加磁盘空间占用的代码生成选项。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的

  GDB常用操作

    • 调试程序,gdb启动程序

      1.gdb 程序名,进入gdb后,使用run/r命令运行gdb调试,如果程序需要传递参数,run后面加[arg];

      2.如果程序需要传递参数,gdb --args 程序名 [arg],进入gdb后,使用run/r;

      3. 进入gdb后,输入程序名;如果需要给程序传递参数,使用set args  ["input"] 设定程序参数,再运行run/r,启动程序;

    • 调试正在运行的程序

      gdb attach [pid]

    • 查看源码

      list:list(l)  [函数名][行数],查看源码,简写l

    • 断点设置及管理

      break/b line_number :

        在line_number行上打断点,使程序在line_number行执行前停止

      break/b [filename]function_name:

        在filename文件下的function_name函数入口停止

      break/b [filename]line_number:

        在filename文件下的line_number行打断点

      break/b +offset/-offset :

        在当前行号的前面或后面offset停止

      break/b  where if condition :

        当某个条件满足时,在某一行停止; eg:在循环体中可以设置break ... if i = 100 来设置循环次数

      break/b :

        没有参数在下一行停止

      break/b  [内存地址] :

        在程序的运行地址处停止

      info break:

        显示当前的断点信息

        delete/d breakpoint_id:

        关闭断点

      disable/enable breakpoint_id:

        禁用/使能断点,该命令将禁止、允许断点 1,同时断点信息的 (Enb)域将变为 n、y

    • 运行命令

      run/r  [args] :run命令可以直接接命令行参数值

      set args ["input"]: 修改发送给程序的参数(进入GDB后才能使用)

      show args:查看其缺省参数的列表(进入GDB后才能使用)

    •  单步命令 

      next/n不进入的单步执行

      step/s进入的额单步执行

      finish运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值以及参数信息

      until :退出当前的循环体

    • 查看信息

      1.查看数据

        print  variable : 查看变量

        print  *array@len :查看数组(array是数组指针,len是需要数据长度)

        可以通过添加参数来设置输出格式:
                  /x 按十六进制格式显示变量
                  /d 按十进制格式显示变量
                  /u 按十六进制格式显示无符号整型
                  /o 按八进制格式显示变量
                  /t 按二进制格式显示变量
                  /a 按十六进制格式显示变量
                  /c 按字符格式显示变量
                  /f 按浮点数格式显示变量

      2.查看内存

         examine /n f u + 内存地址(指针变量)
                n 表示显示内存长度
                f 表示输出格式(见上)
                u 表示字节数制定(b 单字节;h 双字节;w 四字节;g 八字节;默认为四字节)

        如:
                    x /10cw pFilePath  (pFilePath为一个字符串指针,指针占4字节)
                    x 为examine命令的简写。

      3.查看栈信息

        backtrace [-n][n],简写bt
                n  表示只打印栈顶上n层的栈信息
                -n 表示只打印栈底上n层的栈信息
                不加参数,表示打印所有栈信息

    • 搜索

      search text:该命令可显示在当前文件中包含text串的下一行

      reverse-search text:该命令可以显示包含text 的前一行

    •  函数调用:

      call function:强制调用某函数,它会显示函数返回值(如果函数返回值不是void类型)

    • 调试进程

      gdb attach pid:调试已运行的进程,pid为进程号

    • 别的命令:

      cd :改变当前工作目录

      clear:删除刚才停止处的断点

      commands :命中断点时,列出将要执行的命令

       display :程序停止时显示变量和表达时

      up :上移栈帧,使另一函数成为当前函数

       down :下移栈帧,使得另一个函数成为当前函数

      frame :选择下一条continue命令的帧

      jump :在源程序中的另一点开始运行

       kill :异常终止在gdb 控制下运行的程序

       pwd :显示当前工作目录

          ptype :显示一个数据结构(如一个结构或C++类)的内容

       quit :退出gdb

       set variable ["args"] = "value":给变量赋值,变量为args,value为设定值

       signal :将一个信号发送到正在运行的进程

       undisplay display :命令的反命令,不要显示表达式

       watch :在程序中设置一个监测点(即数据断点)

       whatis :显示变量或函数类型

未完待续...

GDB常用调试命令(一)的更多相关文章

  1. GDB常用调试命令以及多进程多线程调试

    http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令   1.list命令 list  linenum      显示程序第l ...

  2. gdb常用调试命令以及多线程堆栈的查看

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC ...

  3. gdb常用调试命令

    一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序.    2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式)   ...

  4. GDB常用调试命令(二)

    GDB信号处理 在GDB中使用handle命令定义一个信号处理.信号可以以SIG开头或不以 SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIG ...

  5. gdb 常用调试命令

    1.   file    quit 2.   frame bt 3.   finish 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数信息. until 当要退出在一个循环体 ...

  6. gdb各种调试命令和技巧

    陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...

  7. 【转】 GDB 常用调试方法

    一.多线程调试 多线程调试可能是问得最多的.其实,重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break ...

  8. xcode gdb/lldb调试命令

    命令                        解释 break NUM               在指定的行上设置断点. bt                      显示所有的调用栈帧.该 ...

  9. iOS之LLDB常用调试命令

    LLDB是个开源的内置于XCode的调试工具,这里来理一理常用用法.lldb对于命令的简称,是头部匹配方式,只要不混淆,你可以随意简称某个命令.结果为在xcode下验证所得,可能与其它平台有所误差. ...

随机推荐

  1. 学习使用PSTools工具中的psping

    目录 初识PsTools psping 1.使用ICMP ping 2.使用TCP ping 3.延迟测试 4.带宽测试 5.同功能的tcping工具 总结 初识PsTools     在工作中我们都 ...

  2. 【机器学习】梯度下降 II

    Gradient Descent 梯度下降 II 关于 Gradient Descent 的直观解释,参考上一篇博客[机器学习]梯度下降 I 本模块介绍几种梯度下降模型.定义符号标记如下: \(\th ...

  3. Spring Boot 如何使用拦截器、过滤器、监听器?

    过滤器 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术. 如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 ...

  4. MyBatis学习(三)日志输出环境配置

    一.编写日志输出环境配置文件 在开发过程中,最重要的就是在控制台查看程序输出的日志信息,在这里我们选择使用 log4j 工具来输出: 准备工作:将[MyBatis]文件夹下[lib]中的 log4j ...

  5. vscode链接git拉取项目

    vscode终端中就可操作 初始化 git  init 链接 git git remote add origin http://**************.git 拉取项目 git clone ht ...

  6. WAF的那些事

    介绍WAF 本节主要介绍WAF (Web Application Firewall, Web应用防火墙)及与其相关的知识,这里利用国际上公认的一种说法: Web应用防火墙是通过执行系列针对HTTP/H ...

  7. 渗透测试之信息收集(Web安全攻防渗透测试实战指南第1章)

    收集域名信息 获得对象域名之后,需要收集域名的注册信息,包括该域名的DNS服务器信息和注册人的联系方式等. whois查询 对于中小型站点而言,域名所有人往往就是管理员,因此得到注册人的姓名和邮箱信息 ...

  8. 推荐一个超牛的SpringCloud微服务项目,开发脚手架

    前言 Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,具有统一授权.认证后台管理系统,其中包含具备用户管理.资源权限管理.网关API 管理等多个模块,支持多业务系统 ...

  9. PCIE_DMA实例五:基于XILINX XDMA的PCIE高速采集卡

    PCIE_DMA实例五:基于XILINX XDMA的PCIE高速采集卡 一:前言 这一年关于PCIE高速采集卡的业务量激增,究其原因,发现百度"xilinx pcie dma",出 ...

  10. mysql-5-aggregation

    #2.分组函数 /* 分组函数/聚合函数:传入一组值,经过统计处理,得到一个输出值 sum, avg, max, min, count */ USE myemployees; #简单使用 SELECT ...