• linux gdb常用命令汇总


    文章摘自

    手把手教你玩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
    
    • 1

    print

    print  key=value
    
    • 1

    容器

    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帧的全部信息,信息分别如下:
      在这里插入图片描述

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

    官方解释图

    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 在所有线程中相应的行上设置断点

    总结图

    在这里插入图片描述

    信号处理

    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则表示相反的意思。
  • 相关阅读:
    阿里云关系型数据库RDS详细介绍PolarDB_MySQL_MariaDB_SQL Server_PostgreSQL
    Array and Set work process
    “2023中国数字化服务之选”榜单发布,谷器数据荣耀登榜!
    Java内存模型与线程(2)
    tensor张量的输出及矩阵的计算
    Linux的打包和压缩
    H3C交换机如何配置SSH服务
    Ajax(一)
    学习Hadoop(一)了解Haddop及搭建伪分布式Hadoop1.0
    纪念DedeCMS创始人IT柏拉图先生
  • 原文地址:https://blog.csdn.net/weixin_43774168/article/details/127559223