gdb多进程调试设置

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

切换窥探器
    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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章