linux gdb常用命令汇总

linux gdb 常用命令汇总

  • 文章摘自
  • 入门命令
    • 将程序编译为可调试
    • 启动GDB开始调试
  • 常用命令
    • attach/detach
    • breakpoint 让程序执行到某个特定的地方停止运行(断点)
    • step
    • continue
    • finish
    • print 打印变量值
  • 调试改变变量的值
    • set variable
    • print
  • 容器
    • vector
      • 打印整个vector
      • 打印vector第1~N个元素
  • 调用栈
    • bt(backtrace) 查看调用栈(Call Stack)信息
    • frame 选择某一帧(stack frame)进行查看
    • up n: 查看当前桢上面第n桢的信息
    • down n: 查看当前桢下面第n桢的信息
  • 寄存器
    • info register
    • info registers [regname]
  • 多线程调试
    • 常用命令
    • 总结图
  • 信号处理
    • info signals
    • handle signal keywords

文章摘自

手把手教你玩GDB

入门命令

将程序编译为可调试

  • 用gcc(g++)编译的时候带上-g选项即可

启动GDB开始调试

  • gdb program 最常用的用gdb启动程序,开始调试的方式
  • gdb program core 用gdb查看core dump文件,跟踪程序core的原因
  • gdb program pid 用gdb调试已经开始运行的程序,指定pid即可

常用命令

attach/detach

  • attach process_id: 在gdb状态下,开始调试一个正在运行的进程,其进程ID为process_id。
  • detatch: 停止调试当前正在调试的进程,与attach配对使用。

breakpoint 让程序执行到某个特定的地方停止运行(断点)

  • 添加断点
    • b function: 在函数funtion入口处设置breakpoint
    • b +offset:在程序当前停止的行向前offset行处设置breakpoint
    • b linenum:在当前源文件的第linenum行处设置breakpoint
    • b filename:linenum :在当前源文件的第linenum行处设置breakpoint
    • b filename:function: 在名为filename的源文件中的function函数入口处设置breakpoint
  • 清除断点
    • clear: 清除当前stack frame中下一条指令之后的所有breakpoints
    • clear function & clear filename:function: 清除函数function入口处的breakpoints
    • delete breakpoints: 删除全部断点
    • delete [breakpoints] [range…]: 删除由range指定的范围内的breakpoints

step

  • step[count]:如果没有指定count,则继续执行程序,直到到达与当前源文件不同的源文件中时停止。如果指定了count,则重复上面的过程count次。
  • step可以简写为s

continue

  • continue[ignore-count]: 唤醒程序,继续运行,直到遇到下一个断点或者程序结束。如果指定了ignore-count,那么程序在接下来的运行中,忽略ignore-count次断点。

finish

  • finish:继续执行程序,直到当前被调用的函数结束,如果该函数有返回值,把返回值也打印到控制台

print 打印变量值

  • show print elements 查看默认打印字符串长度大小
  • set print elements N 设置默认打印字符串长度大小为N
  • @ 操作符 p *对象数组@元素数量
    • 当需要查看一段连续内存空间的值的时间,可以使用GDB的“@”操作符,“@”的左边是第一个内存地址,“@”的右边则是想查看内存的长度。

    • int *array = (int *) malloc (len * sizeof (int));

    • 在GDB调试过程中这样显示出这个动态数组的值:

    • p *array@len

调试改变变量的值

set variable

set variable varname = value

print

print  key=value

容器

vector

打印整个vector

  • p yourVector
  • (gdb) p *(yourVector._M_impl._M_start)@yourVector.size()

打印vector第1~N个元素

  • p *(yourVector._M_impl._M_start)@N

调用栈

bt(backtrace) 查看调用栈(Call Stack)信息

  • backtrace: 显示程序的调用栈信息,可以用bt缩写
  • where, info stack: 都是bt的别名,功能一样

frame 选择某一帧(stack frame)进行查看

  • frame n: 查看第n帧的简要信息,信息每列分别如下:
    在这里插入图片描述

    • 帧序号(Frame number)
    • 函数名
    • 函数的参数名和传入的值
    • 源代码文件名和行号
  • info frame n:查看第n帧的全部信息,信息分别如下:
    linux gdb常用命令汇总_第1张图片

    • Stack frame at: 当前帧的起始地址
    • rip(instruction pointer): 当前指令指针寄存器的值(存放下一个指令的地址)
    • saved rip: 调用该函数(frame)的指令地址
    • Arglist: 存放函数参数的地址
    • Locals: 存放函数局部变量的地址
    • Saved register: 存放函数的寄存器的地址

linux gdb常用命令汇总_第2张图片

up n: 查看当前桢上面第n桢的信息

down n: 查看当前桢下面第n桢的信息

寄存器

info register

  • 查看当前桢中的各个寄存器的情况

info registers [regname]

  • 查看指定的寄存器

多线程调试

常用命令

  • info threads 查看GDB当前调试的程序的各个线程的相关信息
  • thread threadno 切换当前线程到由threadno指定的线程
  • thread apply [threadno] [all] args 对指定(或所有)的线程执行由args指定的命令
  • set scheduler-locking off 不锁定任何线程,也就是所有线程都执行,这是默认值
  • set scheduler-locking on 只有当前被调试线程会执行
  • break %.c:行号 thread all 在所有线程中相应的行上设置断点

总结图

linux gdb常用命令汇总_第3张图片

信号处理

info signals

  • info signals / info handle:打印所有的信号相关的信息,以及GDB缺省的处理方式。

handle signal keywords

  • handle signal keywords:设置GDB对某个具体信号的处理方式。signal可以为信号整数值,也可以为SIGEGV这样的符号。keywords的取值有:
    • stop/ nostop: stop表示收到指定的信号,停止进程的运行;nostop表示GDB收到指定的信号,不会停止进程的运行,只会打印出一条收到信号的消息。
    • print/ noprint: print表示如果收到指定的信号,打印出一条信息;noprint是相反的意思。
    • pass/ nopass: pass表示如果收到指定的信号,把该信号通知给进程;nopass则表示相反的意思。

你可能感兴趣的:(linux,gdb,linux,gdb)