zoukankan      html  css  js  c++  java
  • GDB调试命令速查表

    gdb

    转载自github

    启动 GDB

    gdb object                # 正常启动,加载可执行
    gdb object core           # 对可执行 + core 文件进行调试
    gdb object pid            # 对正在执行的进程进行调试
    gdb                       # 正常启动,启动后需要 file 命令手动加载
    gdb -tui                  # 启用 gdb 的文本界面(或 ctrl-x ctrl-a 更换 CLI/TUI)
    

    帮助信息

    help                      # 列出命令分类
    help running              # 查看某个类别的帮助信息
    help run                  # 查看命令 run 的帮助
    help info                 # 列出查看程序运行状态相关的命令
    help info line            # 列出具体的一个运行状态命令的帮助
    help show                 # 列出 GDB 状态相关的命令
    help show commands        # 列出 show 命令的帮助
    

    断点

    
    break main                # 对函数 main 设置一个断点,可简写为 b main
    break 101                 # 对源代码的行号设置断点,可简写为 b 101
    break basic.c:101         # 对源代码和行号设置断点
    break basic.c:foo         # 对源代码和函数名设置断点
    break *0x00400448         # 对内存地址 0x00400448 设置断点
    info breakpoints          # 列出当前的所有断点信息,可简写为 info break
    delete 1                  # 按编号删除一个断点
    delete                    # 删除所有断点
    clear                     # 删除在当前行的断点
    clear function            # 删除函数断点
    clear line                # 删除行号断点
    clear basic.c:101         # 删除文件名和行号的断点
    clear basic.c:main        # 删除文件名和函数名的断点
    clear *0x00400448         # 删除内存地址的断点
    disable 2                 # 禁用某断点,但是不删除
    enable 2                  # 允许某个之前被禁用的断点,让它生效
    rbreak {regexpr}          # 匹配正则的函数前断点,如 ex_* 将断点 ex_ 开头的函数
    tbreak function|line      # 临时断点
    hbreak function|line      # 硬件断点
    ignore {id} {count}       # 忽略某断点 N-1 次
    condition {id} {expr}     # 条件断点,只有在条件生效时才发生
    condition 2 i == 20       # 2号断点只有在 i == 20 条件为真时才生效
    watch {expr}              # 对变量设置监视点
    info watchpoints          # 显示所有观察点
    catch exec                # 断点在exec事件,即子进程的入口地址
    

    运行程序

    run                       # 运行程序
    run {args}                # 以某参数运行程序
    run < file                # 以某文件为标准输入运行程序
    run < <(cmd)              # 以某命令的输出作为标准输入运行程序
    run <<< $(cmd)            # 以某命令的输出作为标准输入运行程序
    set args {args} ...       # 设置运行的参数
    show args                 # 显示当前的运行参数
    cont                      # 继续运行,可简写为 c
    step                      # 单步进入,碰到函数会进去
    step {count}              # 单步多少次
    next                      # 单步跳过,碰到函数不会进入
    next {count}              # 单步多少次
    CTRL+C                    # 发送 SIGINT 信号,中止当前运行的程序
    attach {process-id}       # 链接上当前正在运行的进程,开始调试
    detach                    # 断开进程链接
    finish                    # 结束当前函数的运行
    until                     # 持续执行直到代码行号大于当前行号(跳出循环)
    until {line}              # 持续执行直到执行到某行
    kill                      # 杀死当前运行的函数
    

    栈帧

    bt                        # 打印 backtrace 
    frame                     # 显示当前运行的栈帧
    up                        # 向上移动栈帧(向着 main 函数)
    down                      # 向下移动栈帧(远离 main 函数)
    info locals               # 打印帧内的相关变量
    info args                 # 打印函数的参数
    

    代码浏览

    list 101                  # 显示第 101 行周围 10行代码
    list 1,10                 # 显示 1 到 10 行代码
    list main                 # 显示函数周围代码
    list basic.c:main         # 显示另外一个源代码文件的函数周围代码
    list -                    # 重复之前 10 行代码
    list *0x22e4              # 显示特定地址的代码
    cd dir                    # 切换当前目录
    pwd                       # 显示当前目录
    search {regexpr}          # 向前进行正则搜索
    reverse-search {regexp}   # 向后进行正则搜索
    dir {dirname}             # 增加源代码搜索路径
    dir                       # 复位源代码搜索路径(清空)
    show directories          # 显示源代码路径
    

    浏览数据

    print {expression}        # 打印表达式,并且增加到打印历史
    print /x {expression}     # 十六进制输出,print 可以简写为 p
    print array[i]@count      # 打印数组范围
    print $                   # 打印之前的变量
    print *$->next            # 打印 list
    print $1                  # 输出打印历史里第一条
    print ::gx                # 将变量可视范围(scope)设置为全局
    print 'basic.c'::gx       # 打印某源代码里的全局变量,(gdb 4.6)
    print /x &main            # 打印函数地址
    x *0x11223344             # 显示给定地址的内存数据
    x /nfu {address}          # 打印内存数据,n是多少个,f是格式,u是单位大小
    x /10xb *0x11223344       # 按十六进制打印内存地址 0x11223344 处的十个字节
    x/x &gx                   # 按十六进制打印变量 gx,x和斜杆后参数可以连写
    x/4wx &main               # 按十六进制打印位于 main 函数开头的四个 long 
    x/gf &gd1                 # 打印 double 类型
    help x                    # 查看关于 x 命令的帮助
    info locals               # 打印本地局部变量
    info functions {regexp}   # 打印函数名称
    info variables {regexp}   # 打印全局变量名称
    ptype name                # 查看类型定义,比如 ptype FILE,查看 FILE 结构体定义
    whatis {expression}       # 查看表达式的类型
    set var = {expression}    # 变量赋值
    display {expression}      # 在单步指令后查看某表达式的值
    undisplay                 # 删除单步后对某些值的监控
    info display              # 显示监视的表达式
    show values               # 查看记录到打印历史中的变量的值 (gdb 4.0)
    info history              # 查看打印历史的帮助 (gdb 3.5)
    

    目标文件操作

    file {object}             # 加载新的可执行文件供调试
    file                      # 放弃可执行和符号表信息
    symbol-file {object}      # 仅加载符号表
    exec-file {object}        # 指定用于调试的可执行文件(非符号表)
    core-file {core}          # 加载 core 用于分析
    

    信号控制

    info signals              # 打印信号设置
    handle {signo} {actions}  # 设置信号的调试行为
    handle INT print          # 信号发生时打印信息
    handle INT noprint        # 信号发生时不打印信息
    handle INT stop           # 信号发生时中止被调试程序
    handle INT nostop         # 信号发生时不中止被调试程序
    handle INT pass           # 调试器接获信号,不让程序知道
    handle INT nopass         # 调试器不接获信号
    signal signo              # 继续并将信号转移给程序
    signal 0                  # 继续但不把信号给程序
    

    线程调试

    info threads              # 查看当前线程和 id
    thread {id}               # 切换当前调试线程为指定 id 的线程
    break {line} thread all   # 所有线程在指定行号处设置断点
    thread apply {id..} cmd   # 指定多个线程共同执行 gdb 命令
    thread apply all cmd      # 所有线程共同执行 gdb 命令
    set schedule-locking ?    # 调试一个线程时,其他线程是否执行,off|on|step
    set non-stop on/off       # 调试一个线程时,其他线程是否运行
    set pagination on/off     # 调试一个线程时,分页是否停止
    set target-async on/off   # 同步或者异步调试,是否等待线程中止的信息
    

    进程调试

    info inferiors                       # 查看当前进程和 id
    inferior {id}                        # 切换某个进程
    kill inferior {id...}                # 杀死某个进程
    set detach-on-fork on/off            # 设置当进程调用fork时gdb是否同时调试父子进程
    set follow-fork-mode parent/child    # 设置当进程调用fork时是否进入子进程
    

    汇编调试

    info registers            # 打印普通寄存器
    info all-registers        # 打印所有寄存器
    print/x $pc               # 打印单个寄存器
    stepi                     # 指令级别单步进入,可以简写为 si
    nexti                     # 指令级别单步跳过,可以简写为 ni
    display/i $pc             # 监控寄存器(每条单步完以后会自动打印值)
    x/x &gx                   # 十六进制打印变量
    info line 22              # 打印行号为 22 的内存地址信息
    info line *0x2c4e         # 打印给定内存地址对应的源代码和行号信息
    disassemble {addr}        # 对地址进行反汇编,比如 disassemble 0x2c4e
    

    历史信息

    show commands             # 显示历史命令 (gdb 4.0)
    info editing              # 显示历史命令 (gdb 3.5)
    ESC-CTRL-J                # 切换到 Vi 命令行编辑模式
    set history expansion on  # 允许类 c-shell 的历史
    break class::member       # 在类成员处设置断点
    list class:member         # 显示类成员代码
    ptype class               # 查看类包含的成员
    print *this               # 查看 this 指针
    

    其他命令

    define command ... end    # 定义用户命令
    <return>                  # 直接按回车执行上一条指令
    shell {command} [args]    # 执行 shell 命令
    source {file}             # 从文件加载 gdb 命令
    quit                      # 退出 gdb
    
    

    GDB 前端

    gdb-tui                   使用 gdb -tui 启动(或 ctrl-x ctrl-a 更换 CLI/TUI)
    cgdb                      http://cgdb.github.io/
    emacs                     http://gnu.org/software/emacs
    gdbgui                    https://github.com/cs01/gdbgui
    
    GDB 图形化前端评测        http://www.skywind.me/blog/archives/2036
    

    References

    https://sourceware.org/gdb/current/onlinedocs/gdb/
    https://kapeli.com/cheat_sheets/GDB.docset/Contents/Resources/Documents/index
    http://www.yolinux.com/TUTORIALS/GDB-Commands.html
    https://gist.github.com/rkubik/b96c23bd8ed58333de37f2b8cd052c30
    http://security.cs.pub.ro/hexcellents/wiki/kb/toolset/gdb
    
  • 相关阅读:
    利用qt打开一张图片并转成灰度矩阵
    适配手机端浏览器
    ps常用快捷键(供自己学习查看)
    用选框工具画圆角矩形
    ps制作有背景图片的字体
    所有iOS 设备的屏幕尺寸
    九宫格有规律高亮滚动效果
    移动端点击事件全攻略
    移动端ios升级到11及以上时,手机弹框输入光标出现错位问题
    linux下截取整个网页
  • 原文地址:https://www.cnblogs.com/hellocxz/p/15432374.html
Copyright © 2011-2022 走看看