【手册】GDB调试指令

1.列出源程序

(gdb) l(list) <line>                //列出(line-5)行到(line-1+5)行间的内容
(gdb) l(list) <line1,line2>         //列出(line1)行到(line2)行间的内容

2.运行程序

(gdb) r(run) <arg1,arg2,...,argn>   //若“不列出参数”,则使用“上次输入参数”
(gdb) show args                     //查看当前使用“参数”
(gdb) set args <arg1,arg2,...,argn> //设置当前使用“参数”

3.断点操作

(gdb) b(break) <line>               //在执行到第line行时中断
(gdb) b(break) <func>               //在执行func时中断
(gdb) b(break) <id> if <exp>        //在exp成立时设置断点
(gdb) b(break) <file:line>          //在文件file的第line行设置断点
(gdb) info break                    //查看断点信息
(gdb) d(delete) breakpoint <point>  //删除第point号断点
(gdb) enable breakpoint <point>     //使能第point号断点
(gdb) disable breakpoint <point>    //禁用第point号断点
(gdb) clear                         //删除所有断点
(gdb) clear <line>                  //删除第line行上的所有断点
(gdb) watch <exp>                   //当exp成立时触发中断,输出观察点信息

4.观察运行数据

(gdb) p(print) <var>                //打印变量var的值
(gdb) p(print) <file::var>          //打印变量var的值
(gdb) p(print) <func::var>          //打印变量var的值
(gdb) p(print) *[email protected]           //打印数组array从0号到end-1号元素的值
(gdb) p/x <var>                     //以“十六进制”打印变量var的值
(gdb) p/d <var>                     //以“十进制”打印变量var的值
(gdb) p/u <var>                     //以“十进制无符号数”打印变量var的值
(gdb) p/o <var>                     //以“八进制”打印变量var的值
(gdb) p/t <var>                     //以“二进制”打印变量var的值
(gdb) p/a <var>                     //以“十六进制”打印变量var的值
(gdb) p/c <var>                     //以“字符格式”打印变量var的值
(gdb) p/f <var>                     //以“浮点数”打印变量var的值

5.查看内存

(gdb) x(examine) /nfu <addr>
    //数量n       显示n个单位的内存内容
    //格式f       s:字符串,i:指令,其他与print相同
    //单位u       b:1,h:2,w:4,g:8

6.自动显示变量

(gdb) display /f <var>              //格式f       与examine相同
(gdb) info display                  //显示所有自动显示的变量信息
(gdb) display                       //删除所有自动显示变量
(gdb) delete display <dnums>        //删除编号为dnums的自动显示变量
(gdb) enable display <dnums>        //使能第dnums号自动显示变量
(gdb) disable display <dnums>       //禁用第dnums号自动显示变量

7.显示变量的历史记录

(gdb) printf $n                     //显示第n个历史记录的值

8.查看寄存器

(gdb) info registers                //显示所有寄存器(不包括浮点寄存器)的值
(gdb) info all-registers            //显示所有寄存器(包括浮点寄存器)的值
(gdb) info registers <reg>          //显示寄存器reg的值

9.查看gdb的环境变量

set $var=i
show convenience

10.改变程序执行

10.1 修改变量的值

    print/set i=30

10.2 跳转执行

    jump <location>
    set $pc=0x45

10.3 信号的产生及处理

    signal <signum>
    handle <sig-name> <whattodo>    //whattodo: nostop stop print noprint pass nopass

10.4 强制调用函数

    call func(arg1,arg2,...)

10.5 强制函数返回

    return <value>

11.机器码与计算机构造

11.1 产生core文件

    gdb exe core

11.2 跟踪栈上数据

    bt(backtrace)
    frame n
    info locals

11.3 绑定运行进程

    gdb exe pid
    detach
    attach pid

11.4 源文件搜索

    search regexp                   //向下搜索匹配行
    reverse-search regexp           //向上搜索匹配行
    print $_                        //打印匹配行号

11.5 机器语言工具

    $ip     当前指令地址
    $pc     当前指令内容
    $fp     帧指针
    $sp     栈指针
    $ps     处理器状态
    info line n                     //打印行n在内存中的位置
    disassemble func                //查看函数func的反汇编

12.调试多进程程序

使用 GDB 调试多进程程序

12.1 follow-fork-mode

  • 在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试:
    set follow-fork-mode [parent|child]
  • parent: fork之后继续调试父进程,子进程不受影响。
  • child: fork之后调试子进程,父进程不受影响。
  • detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
    set detach-on-fork [on|off]
  • on: 断开调试follow-fork-mode指定的进程。
  • off: gdb将控制父进程和子进程,follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。

12.2 Attach子进程

  • attach 命令:附着(attach)到正在运行的进程

12.3 GDB wrapper

  • 很多时候,父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。它的优点是不用添加额外代码。

12.4 小结

上述三种方法各有特点和优劣,因此适应于不同的场合和环境:

  • follow-fork-mode方法:方便易用,对系统内核和GDB版本有限制,适合于较为简单的多进程系统
  • attach子进程方法:灵活强大,但需要添加额外代码,适合于各种复杂情况,特别是守护进程
  • GDB wrapper方法:专用于fork+exec模式,不用添加额外代码,但需要X环境支持(xterm/VNC)。

其他

pwd
cd
quit
shell [cmdline]
show language
info frame
info source
set language
(gdb) set debug-file-directory
(gdb) show debug-file-directory

原文地址:https://www.cnblogs.com/seastargreen/p/10368468.html

时间: 2024-10-31 11:12:51

【手册】GDB调试指令的相关文章

GDB调试手册[转]

Linux 包含了一个叫gdb 的GNU 调试程序.gdb 是一个用来调试C和C++程序的强力调试器.它使你能在程序运行时观察程序的内部结构和内存的使用情况.以下是 gdb 所提供的一些功能:它使你能监视你程序中变量的值.它使你能设置断点以使程序在指定的代码行上停止执行.它使你能一行行的执行你的代码.在命令行上键入gdb并按回车键就可以运行gdb 了.(Windows需要安装MinGW或者CygWin并且需要配置环境变量才可以使用) GDB 命令行参数 启动 GDB: l  gdb execut

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

[email&#160;protected] GDB调试

正文转自:http://www.cppblog.com/lucency/archive/2012/08/09/59214.html 之前在网上搜索了好久使用sublime调试C和C++的文章,但是徒劳无功:后来才醒悟sublime下的调试C/C++其实和命令行中调试程序是一样的,所以即使是装了sublime GDB后,一样是要依据gdb手册那种调试步骤的. 正文: 这篇文章基本上是摘自gdb手册,除此之外就是加了实际的代码样例,这样可以更清楚的看到一些命令的执行效果.当然,这儿不会涉及到所有的g

比较全面的gdb调试命令

用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成.在这里并不是要和Win

GDB调试汇编堆栈

GDB调试汇编堆栈 准备工作 终端编译工具: 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 测试代码: test.c 分析过程 1.生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32 2.调试:gdb test 3.设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数 4.开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemb

GDB调试汇编分析

GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置

【转】linux下gdb调试

本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者. GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本程序调试工作. 命令 解释 示例 file <文件名> 加载被调试的可执行程序文件. 因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r Run的简写,运行被调试的程序. 如果此前没有下过断点,则执行完整个程序:如果有断点,则程序暂停在第一个可用断点

GDB 调试解析

GDB(GNU Debugger)是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序 列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. GDB主要帮忙你完成下面四个方面的功能: (1).启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. (2).可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) (3).当

linux基础2——gdb调试器

gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功: 4." l " (小写l)命令可以查看当前代码是否是要执行的代码: 5.断点 b 行号/函数名字——作用是程序执行过程中会自动在断点处暂停,等待指令 info b—— 查看断点列表 d 编号——删除指定编号的断点 6.执行程序 r 回车——程序启动,执行到代码中第一个出现断点处暂停 7