http://blog.csdn.net/freeelinux/article/details/53700266

一:普通命令

 

1.list命令

  • list  linenum      显示程序第linenum行周围的程序
  • list  function      显示函数名为function的函数的源程序
  • list                      显示当前行后面的源程序
  • list -                    显示当前行前面的源程序

2.run(r)

    运行命令。
  • run args         run命令可以直接接命令行参数值,也可以在执行run之前通过 set args + 参数值实现。

3.break(b)

    打断点,使用方法:
  • b  linenum                        在某行打断点
  • b  +offset/-offset               在当前行号的前面或后面offset停住
  • b  filename:linenum         在某文件的某行打断点
  • b  filename:function         在某文件某个函数入口停住
  • b  *address                      在程序的运行地址处停住
  • b                                      没有参数在下一句停住
  • b where if condition         当某个条件满足时,在某一行停住(这个很有用,比如b 10 if ret == 5)
    对于break命令,我们要灵活使用。例如打多个断点。多线程程序中我们可以主函数中线程创建后立即打断点,执行线程函数入口打断点等。
    关闭断点:delete(d) breakpoint-id
 

4.单步命令

    普通用法就不说了。
  • step count         一次性执行count步,如果有函数会进入函数
  • next count         一次执行count,不进入函数
  • finish                 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值以及参数信息
  • until                   退出循环体(尤其是针对for循环这种,很烦的)

5.continue命令

    当程序被停住之后,可以使用continue(c)命令,恢复程序的运行直到程序结束,或到达下一个断点。这里要注意如果没有断点程序是会直接结束的。
    

6.print(p)命令

    这个命令比较常用,用来查看我们想看的内容。比如有关数组可以看全部,也可以看从左到右某一部分:
    print命令针对变量查看的输出格式有:
  • x 按十六进制格式显示变量
  • d 按十进制格式显示变量
  • u 按十六进制格式显示无符号整型
  • o 按八进制格式显示变量
  • t 按二进制格式显示变量t 按二进制格式显示变量
  • a 按十六进制格式显示变量
  • c 按字符格式显示变量
  • f 按浮点数格式显示变量

7.watch命令

    这个命令比较有用。watch一般用来观察某个表达式(变量也是一种表达式)的值是否有变化,如果有变化,马上停住程序。我们有一下几种方法设置观察点:
  • watch   expr                 为表达式expr设置一个观察点,一旦表达式值有变化,马上停住程序
  • rwatch  expr                  当表达式expr被读时,停住程序
  • awatch expr                  当表达式的值被读或被写时,停住程序。
  • info      watchpoints       列出所有观察点(info指令通常可以去套)
    举例如下,演示观测*i的值,一旦变化停下来:
    
    在循环中我们也可以使用watch,配合ignore,它是除了until命令之外又一个可以让我们跳出循环的方法,不过watch+ignore更强大,可以任意跳转到第i次循环。它们的意思就是观察一个变量,可以理解为断点,ignore这个断点多少次,然后用continue就可以直接跳过了。
 

8.examine命令

    使用该命令来查看内存地址中的值。语法是:x/u addr 
    addr表示一个内存地址。“x/”后的n、f、u都是可选的参数,n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容;f 表示显示的格式,如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i;u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4字节。u参数可以被一些字符代替:b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。n、f、u这3个参数可以一起使用,例如命令“x/3uh 0x54320”表示从内存地址0x54320开始以双字节为1个单位(h)、16进制方式(u)显示3个单位(3)的内存。

9.jump命令

    jump命令不会改变程序栈的内容,一般只在同一函数内跳转。
  • jump linespec     指定下一条语句的运行点,linespec可以是linenum,filename+linenum,+offset这几种形式
  • jump address      跳到代码行的地址

10.signal命令

使用signal 信号名(如SIGINT)这种方式把信号发送给程序,如果程序注册了signal_handler函数,还可以进行相应的处理,帮助调试程序。

11.set命令

  • set args       设置命令行参数
  • set env environmentVarname=value 设置环境变量。如:set env USER=benben

12.call命令

  • call function     强制调用某函数
    强制调用某函数,它会显示函数返回值(如果函数返回值不是void)。print命令也可以完成该功能。
 

13.disassemble命令

    反汇编命令,查看执行时源代码的机器码。

二:多进程调试

 

1.单独调试子进程

    我们可以先运行程序,然后再另一终端使用ps -ef | grep "main"(main此处是可执行文件名)搜索到子进程pid,然后启动gdb,在将其附加(attach)到gdb调试器上。
  • attach child-pid        使用该命令后,直接run即可,和调试普通程序就没区别了
  • dettach                     脱离进程

2.使用调试器选项follow-fork-mode

    我们知道如果不设置任何选项,gdb默认调试父进程。调试器选项用法如下:
  • set follow-fork-mode mode     其中mode的可选值是parent和child,分别表示调试父进程和子进程。
  • info inferiors                            查询正在调试的进程
  • inferior processnum                切换进程
    默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。我们还可以使用catch fork指令,如果fork异常,会停止程序。
        follow-fork-mode  detach-on-fork   说明
        parent                     on               只调试主进程(GDB默认)
        child                        on               只调试子进程
        parent                     off               同时调试两个进程,gdb跟主进程,子进程block在fork位置
        child                        off               同时调试两个进程,gdb跟子进程,主进程block在fork位置
   设置方法:set follow-fork-mode [parent|child]   set detach-on-fork [on|off]

三:多线程调试

 
    gdb调试一般有两种模式:all-stop模式和no-stop模式(gdb7.0之前不支持no-stop模式)。
    1.all-stop模式
        在这种模式下,当你的程序在gdb由于任何原因而停止,所有的线程都会停止,而不仅仅是当前的线程。一般来说,gdb不能单步所有的线程。因为线程调度是gdb无法控制的。无论什么时候当gdb停止你的程序,它都会自动切换到触发断点的那个线程。
    2.no-stop模式(网络编程常用)
        顾名思义,启动不关模式。当程序在gdb中停止,只有当前的线程会被停止,而其他线程将会继续运行。这时候step,next这些命令就只对当前线程起作用。
        如果需要打开no-stop模式,可以向~/.gdbinit添加配置文件:
  1. #Enable the async interface
  2. set target-async 1
  3. #If using the CLI, pagination breaks non-stop
  4. set pagination off
  5. #Finall, turn it on
  6. set non-stop on
        gdb支持的命里有两种类型:前台的(同步的)和后台(异步 )的。区别很简单,同步的在输出提示符之前会等待程序report一些线程已经终止的信息,异步则是直接返回。所以我们需要set target-async 1。set pagination off不要出现 Type <return> to continue 的提示信息 。最后一步是打开。
        下面是常用命令:
  • info threads                                       显示所有线程
  • thread id                                            切换到指定线程
  • break filename:linenum thread all     在所有线程相应行设置断点,注意如果主线程不会执行到该行,并且启动all-stop模式,主线程执行n或s会切换过去
  • set scheduler-locking off|on\step       默认off,执行s或c其它线程也同步执行。on,只有当前相称执行。step,只有当前线程执行
  • show scheduler-locking                     显示当前模式
  • thread apply all command                 每个线程执行同意命令,如bt。或者thread apply 1 3 bt,即线程1,3执行bt。
        主要是我们要用能用的上的,比如no-stop模式,一般多线程调试就很有用的。

四:core文件

  • ulimit -c unlimited           生成core文件,也可以是指定大小,然后使用gdb ./main core启动,bt查看调用栈即可。
 
 

GDB常用调试命令以及多进程多线程调试的更多相关文章

  1. gdbserver 移植与多线程调试

    在嵌入式linux平台使用gdb调试进行远程调试需要安装gdbserver,gdbserver工作在目标板上,通过串口或者网线与主机上的gdb互联实现远程调试. Gdbserver需要根据不同的嵌入式 ...

  2. 第07课:GDB 常用命令详解(下)

    本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...

  3. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  4. gdb常用命令及gdb调试多进程/线程程序&coredump

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

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

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

  6. gdb调试多进程多线程程序

    一.调试的指令 1.list命令 list linenum 显示程序第linenum行的周围的程序 list function 显示程序名为function的函数的源程序 list 显示当前行后面的源 ...

  7. gdb常用的调试命令

    首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb  debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l    显示main函数所在的文件的源代码 ...

  8. C 调试 gdb常用命令

    gdb常用命令: [root@redhat home]#gdb 调试文件:启动gdb (gdb) l :(字母l)从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) b ...

  9. 多进程多线程GDB调试 (转)

        多进程多线程GDB调试   一.线程调试指南:   1. gdb attach pid 挂载到调试进程  2. gdb$ set scheduler-locking on 只执行当前选定线程的 ...

随机推荐

  1. zip压缩解压

    zip在linux中使用相对不太频繁,但是在window中使用频繁! zip参数 -q //不显示指令的执行过程,静默执行-r //递归处理文件-T //检测zip文件是否可用-u //更新文件,根据 ...

  2. 【CLR】详解CLR中的程序集

    目录结构: contents structure [+] 程序集的简介 为程序集分配强名称 如何指定程序集的版本资源信息 如何对程序集签名 全局程序集缓存 如何查看程序集的信息 强命名程序集防串改 1 ...

  3. Charles for Mac(HTTP 监视器和网络抓包工具)破解版安装

    1.软件简介    Charles 是在 Mac.Linux 或 Windows 下常用的 http 协议网络包截取工具,在平常的测试与调式过程中,掌握此工具就基本可以不用其他抓包工具了.Charle ...

  4. 【Vegas原创】查询SQL Server更改记录的语句

    指定数据库,然后: select Name,Create_date,Modify_Date from sys.objects where type in ('U','P', 'V','F', 'TR' ...

  5. HashMap中的hash算法总结

    前言 算法一直是我的弱项,然而面试中基本是必考的项目,刚好上次看到一个HashMap的面试题,今天也来学习下 HashMap中的hash算法是如何实现的. 数学知识回顾 << : 左移运算 ...

  6. HDU_3746 Cyclic Nacklace(KMP)

    题目请点我 题解: 题目大意:有一个字符串s.能够在前后加入字符,使字符串成为一个循环次数至少为2的循环字符串.输出最少须要加入的字符数目. 首先能够证明题目能够等价为仅仅在末尾加入字符使满足题意.要 ...

  7. [docker]使用quaaga实现(rip ospf)实现主机间容器互通

    使用quaaga实现(rip ospf)实现主机间容器互通 - n1设置 brctl addbr br0 ip a a 10.1.1.1/24 br0 ip a a 10.1.1.1/24 dev b ...

  8. react学习笔记1之声明组件的两种方式

    //定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class ...

  9. 一篇文全面了解DevOps:从概念、关键问题、兴起到实现需求

    一篇文全面了解DevOps:从概念.关键问题.兴起到实现需求 转自:一篇文全面了解DevOps:从概念.关键问题.兴起到实现需求 2018-06-06 目前在国外,互联网巨头如Google.Faceb ...

  10. HttpPost请求将json作为请求体传入的简单处理方法

    https://www.cnblogs.com/mambahyw/p/7875142.html **************************************************** ...