C++编程 (二)--- GDB使用指南

    GDB是linux下命令行程序调试的工具,这也为程序开发和调试带来了极大的便利。使用命令行的优势在于,它们可以很方便的集成在一起,使用几个简单的已有工具,就可以做出强大的功能。图形化界面和命令行可谓是尺有所短寸有所长吧,如果你习惯命令行操作,并且对命令熟知的话,使用GDB调试是十分高效的。

    一般来说GDB主要帮你完成如下四个方面的功能:

    1. 启动你的程序,可以按照你的自定义要求随心所欲的运行程序。
    2. 让被调试的程序在断点处挺住。(断点可以是表达式)
    3. 程序被停住的时候,可以检查此时程序发生的事情。
    4. 动态改变你的 程序的执行环境。

  本文主要介绍了GDB调试文件时的:

    一、 执行程序,启动GDB

    二、显示数据、数据操作

    三、断点---断点的创建和断点的管理。

    四、执行控制

    五、对多线程程序进行调试

    六、命令接口

    七、信号

    八、

   一、执行程序,启动GDB:

        1. 启动GDB:

                   (1) 先启动gdb:

                           file filaname                                           #制定调试程序的源代码和符号表
                           attach  <进程PID>                                 #关联gdb到正在运行的进程。操作系统必须支持,而且你需要有向进程发送信号的权力。
                           detach                                                   #取消关联进程
                           set args   <命令行参数>                        #设置GDB执行参数
                           
                   (2) 动态调试:   
                          gdb  <可执行文件名> <core文件>          # gdb调试core文件
        gdb  <可执行文件>  <进程POID>           # 调试制定进程。这条命令会把进程ID为1234的进程地址空间附着在gdb的地址空间中,然后这个进程在gdb的环境下执行,这样的话gdb就可以了解进程的执行情况、堆栈和内存使用情况等等。
                          ulimit -c unlimited/ ulimit -c 0                   # 打开/关闭core文件开关。 /etc/profile有设置

   二、显示数据:

        1. 显示数据:

                   (1) print:

                           print  p                                                     #显示变量p的值
                           print  find_entry(1,0)                                #制定参数调用fine_entry函数。 
                           print  $1                                                   #$1为记录历史记录变量,以后可以直接使用$1的值。 
                           print  h@10                                             #例如base  @length为调用动态数据 ,而print h@10为要显示h后面的10个元素的数值。

                   (2)变量类型查看

                           whatis p                                                   #显示变量p的类型
                           ptype                                                       #比whatis更强,可以提供一个结构的定义。

                   (3) 变量的检查和赋值

                           set variable                                             #修改变量的数值
                            ptype                                                      #比whatis更强,可以提供一个结构的定义。

                   (4) 显示被调用程序的执行信息

                           info files                                                   #显示被调用程序的详细信息。
                           info func                                                   #显示所有函数名称。
                           info prog                                                   #显示被调用程序的执行状态。
                           info var                                                     #显示所有全局变量和静态变量名称。
                           display                                                      #程序执行停止时,变量和表达式的值。
                           info stack                                                  #显示所有全局变量和静态变量名称。
                           info frame                                                 #显示帧摘要信息。
                           info breakpoints                                        #显示所有断点信息。

                   (5) 显示程序代码信息

                           list/1   line_num                                       #显示程序上下文代码。显示从line_num开始的后面几行源代码
                           reverse-search                                        #源文件中反向正则表达式。
                           bt/backtrace                                             #显示程序中当前位置和如何到达当前位置的栈跟踪。
                           info var                                                     #显示所有全局变量和静态变量名称。

   三、断点:

        1. 设置普通断点:

                           break  FUNCTION                                     #在函数function处设置断点。当使用允许函数重载的语言(如:C++)时,有可能同时在几个重载的函数上设置了断点;
                           break +OFFSET或break -OFFSET           #运行时结束到文件前几行或者文件后几行。
                           break  LINENUM                                       #在行号为LINENUM的行上增加断点。
                           break FILENAME:LINENUM                     #在FILANAME的源文件中名为FUNCTION的函数上设置断点。
                           break *address                                          #在地址ADDRESS上设置断点,这允许你在没有调试信息的程序里设置断点。
                           break                                                         #在当前程序的运行栈中的下一条指令上设置一个断点。栈底除外。和finish类是,但是finish不设置断点。

        2. 条件断点:

                           break  if condition                                      #在条件满足时,触发断点。
                           break ARGS                                              #只有效一次。
                           break  LINENUM                                       #在行号为LINENUM的行上增加断点。

        3. 删除断点:

                           clear                                                           #清除当前所选择的栈上下一个所有执行到的断点。
                           clear FUNCTION/ FILANAME:LINENUM  #只有效一次。
                           clear LINENUM/ clear FILENUM:LINENUM    #清除固定行的断点。

        4. 设置断点生效/失效:

                   (1) break:

                           enable breakpoints [BNUMS]                     #使断点生效。
                           disable breakpoints [BNUMS]                     #使断点失效。
                           enable breakpoints once [BNUMS]             #使断点仅生效一次。
                           enable breakpoints [BNUMS]                      #使断点生效一次后,自动被删除。


        5. 设置观察点:

                  可以使用一个观察点来停止一个程序的执行,当某个表达式的值发生改变的时候,观察点将会停止程序。而不需要事先在某个地方设置一个断点。特别在程序不知道什么时候出问题,定位的时候很有用的。

                           watch EXPR                                                #使断点生效。

                           rwatch EXPR                                               #当EXPR被程序读取的时候,程序被gdb暂停

                           awatch EXPR                                              #当EXPR被读出,然后被写入时,gdb会暂停这个程序,这个命令常和rwatch合用的。
                           info watchpoints                                          #显示所有设置的观察点列表。

   四、gdb执行控制:

                           continue/c                                                  #继续运行被中断的程序。
                           next/n                                                         #继续执行下一行代码。
                           step/s                                                         #继续单步调试,它可以进入函数内部,跟踪函数内部执行情况。
                           frame/f <STACK_FRAME_NO/ADDRESS>    #选择一个帧,并打印栈帧内容的摘要信息。
                           run                                                              #在gdb中启动并运行程序
                           help <command>                                       #显示command的详细用法
                           help                                                            #在gdb提示符处输入,help将列出命令的分类。主要有: aliases:命令别名。 breakpoint: 断点定义 data:数据查看:files: 指定并查看文件;internals: 维护命令;running: 程序执行;statu: 状态查看;tracepoints: 跟踪程序执行。

   五、对多线程程序的调试:

                           thread THREAD_NO                                 #该命令在线程间切换,把THREAD_NO线程设置为当前线程
                           info threads                                                #显示当前进程所有线程状态摘要信息。gdb按顺序显示 a. 线程号  b. 目标系统的线程标识
                           thread apply [THREAD_NO][ALL] ARGS                                                         #该命令用于向线程提供命令。
                           set scheduler-locking  on/off                      #打开/关闭线程锁
                           show scheduler-locking                             #查看线程调度锁的状态   on只有调度线程会执行,off所有线程都会执行。
                           另外,无论gdb何时中断了你的程序(因为一个断点或者信号),gdb都会自动选择信号或断点发生的线程作为当前线程。info threads显示时,当前线程的前面带有一个星号'*'。

    六、命令接口

                           show paths                                                  #显示当前路径变量的设置情况。
                           show environment/env                                #显示程序环境变量的值。
                           set/unset environment/env VARNAME=VALUE  #设置/删除某个环境变量的值 

    七、信号

              gdb通常可以捕获到发送给它的大多数信号,通过捕获信号它可以决定对于正在运行的进程要做什么工作。
              handle命令可以控制信号的处理,它有两个参数,一个是信号名,另外一个是接收信号时该做什么。几个可能的参数是:

                           a. nostop 接收信号时,不要发送给程序,也不要停止程序。
                           b. stop     接收信号时,不要将它发送给程序,也不要停止程序。
                           c. print     接收信号时,显示一条信息。
                           d. noprint 接收信号时,不要显示信息。(而且隐含着不要停止程序执行)
                           e. pass     将信号发送给程序,从而允许你的程序控制它、停止运行或采取别的动作。
                            f. nopass  停止程序的运行,但不要将信号发送给程序 

               例如:
                            handle SIGPIPE  stop print     #截获SIGPIPE信号,防止正在调试的程序接受到该信号
                            signal 2                                    #假定你的程序把Ctrl+c或者信号2,当作某个清理动作,可以发送如下处理程序。该程序继续执行,但会传出该信号。

    另外还可以使用dmesg查看内核调用缓冲区的情况

参考文献:

        1.  GDB使用指南    http://www.cnblogs.com/whiteyun/archive/2009/11/27/1611808.html
        2.  GDB使用指南2: http://www.cnblogs.com/whiteyun/archive/2011/10/17/2215532.html




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值