gdb多进程调试设置

    技术2022-07-11  148

    设置多个窥探器调试:     set    detach-on-fork off     set    target-async on     set    non-stop on     set    pagination off

    针对fork操作的跟踪模式:

    set follow-fork-mode mode

    parentchildask

    展示当前fork跟踪模式:

    show follow-fork-mode

    切换窥探器     inferior [1]

    调试正在运行的进程

    attach pid 

    detach 

    常用查看数据命令 print [格式] [表达式] 格式: /f 作为浮点数打印 /x 16进制格式 /t 使用二进制的格式打印 /a 作为地址 /c 字符常量格式打印 表达式: 任何常量、变量或者语言中定义的操作符在表达式中都是合法的。支持常量数组,语法为{ele, ele}。 支持的操作符包括@和::,@是二进制操作符,将内存的部分视作数组;::指定文件或者函数中定义的变量。 程序变量: 最常见的表达式使用变量名,表达式中的名字是在被选中的stack帧中理解,所以变量要么是全局,要么遵循作用域的规则而可见; file::variable function::variable 智能数组: 打印在内存中多个同类型对象很有用,例如数组的某段,或者指针指向的动态数组; int *array = (int *)malloc(len * sizeof(int)); p *array@len: @左操作数必须驻留在内存中。 p &var: 打印某个变量的地址 inspect x命令 x /nfu addr n:重复次数 f:显示格式 u:单元尺寸 b,h,w,g 自动显示: display expr: 将expr加入到表达式列表中 undisplay dnums: 根据编号从表达式列表移除表达式; 寄存器: 引用机器寄存器内存,在表达式中通过$+名字作为变量 info registers:打印所有寄存器的名字和数值,除了浮点寄存器以外; info all-registers:打印所有寄存器的值,包括浮点寄存器 打印设置: set print address[on/off]: 打印内存地址,显示栈的地址,数据结构值, set print array [on/off]: 打印数组 set print elements [num]: 设置数组元素打印个数上线 set print pretty on set print demangle: 按照原始形式打印C++名称; set print asm-demangle set demangle-style {auto | gnu | hp | lucid | arm} set print object :打印对象的指针 set print static-members :打印静态成员 set print vtbl: 打印C++虚函数表 历史值: print命令打印的值被保存在value history中。为了引用任何以前的值,使用$符号+value_history_编号 栈帧: 调用栈被分割为连续的片,取名为栈帧;每个帧都与一个函数调用联系。帧中保存函数参数,函数本地变量和正在哪个函数中执行的函数地址。 程序一旦启动,首先只有一个main函数的帧,每次函数被调用,新的帧被创建,在函数返回时帧被移除。在程序内,使用地址标识帧,一个帧 由很多字节构成,每个字节都有自己的地址。GDB给每个存在的帧都赋一个数值,从0开始。 frame args: 允许从一个帧移动到另一个帧中。 select-frame: Backtrace: backtrace展示如何执行当前位置,一行代表一个帧,起始于当前执行的帧,接着是它的调用者,依次递归。 关于帧的信息: frame: 打印当前选中帧的简短描述 info frame :打印当前帧的详细描述,包括: 帧的地址; 下一个帧的地址 上一个帧的地址 帧中的参数地址 本地变量在帧中的地址 程序计数器 帧中保存的寄存器 info locals info args info catch info frame addr

     

    Processed: 0.013, SQL: 9