首页 > 其他分享 >gdb

gdb

时间:2022-10-31 15:38:05浏览次数:41  
标签:info 变量 查看 gdb 格式 断点


断点

设置断点

break +offset
break -offset (在当前行号的前面或后面的offset行停住。)
break filename:linenum 在源文件filename的linenum行处停住。
break filename:function 在源文件filename的function函数的入口处停住。
break ... if ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

删除断点

clear        清除所有的已定义的停止点。 
clear func 清除所有设置在函数上的停止点。
delete [breakpoints] [range...] 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)

disable和enable断点
disable断点之后,当你还需要使用的时候再enable就可以了

disable [breakpoints] [range...]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。
enable [breakpoints] [range...]
enable所指定的停止点,breakpoints为停止点号。

查看断点

info break

list打印程序调试代码

?<linenum>    行号。  
?<+> [offset] 当前行号的正偏移量。
?<-> [offset] 当前行号的负偏移量。
?<filename:linenum> 文件的中的行。
?<function> 函数的代码
?<filename:function> 文件中的函数。
?<*address> 程序运行时的语句在内存中的地址。

info

1)inifo break  查看断点信息
2)info locals 打印出当前函数中所有局部变量及其值
3)info stack 查看栈中的信息
4)info registers/info all-registers 查看(所有寄存器信息,包括浮点寄存器)
5)info args 查看参数信息

print查看变量

print [</format>] <expr>

其中参数expr可以是一个变量,也可以是表达式。format表示输出格式,例如,可以用/x来将结果按16进制输出。
format的取值范围有如下几种:
?x 按十六进制格式显示变量。
?d 按十进制格式显示变量。
?u 按十六进制格式显示无符号整型。
?o 按八进制格式显示变量。
?t 按二进制格式显示变量。
?a 按十六进制格式显示变量。
?c 按字符格式显示变量。
?f 按浮点数格式显示变量。

查看变量

(gdb) p top
$16 = 1
(gdb) p &top
$17 = (int *) 0x804a014 <top>
(gdb) p 3+2*5
$18 = 13
(gdb) p /x 3+2*5
$19 = 0xd

查看寄存器

p $eax             查看eax寄存器中的值
info register 打印所有的寄存器

查看文件或者函数中的变量的值

print file::variable
print function::variable 如之前使用过的print ohci_rh_resume::ohci->lock,来打印这个锁的相关消息。

查看数组的值
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:
int array = (int ) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p *array@len
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。


单步调试

在程序执行的时候按下ctrl+c 则停住程序。
在程序停住的地方通过backtrace或者bt或者info stack可以查看调用栈信息

1)next   单步运行,如果有函数调用,他不会进入函数
2)step 单步运行,如果有函数调用,他会进入该函数
3)finish 跳出当前函数,并打印函数返回时的堆栈地址和返回值及参数值等信息。
4)until 跳出一个循环
5)c 继续运行
6)r 运行或者重新运行程序

调试带参数程序

gdb xxx进入调试界面后

set args #可指定运行时参数 (如set args -l)
show args #可查看设置好的运行参数
path <dir> #可设定程序的运行路径
show paths #查看程序的运行路径
set env varname [=value] #设置环境变量
show env #查看环境变量

调试mutex死锁

在Kernel Hacking中,配置CONFIG_DEBUG_MUTEX、CONFIG_DETECT_HUNG_TASKS,这样当死锁发生时,默认120S,kernel检测到死锁,同时打印出调用栈。
在代码死锁的地方,在enable了CONFIG_DEBUG_MUTEX的情况下添加这样的代码:
​​​show_stack(<lock>.owner, NULL);​​​
是你的mutex的变量名,owner是一个struct task_struct *
利用show_stack就可以打印出mutex被谁占用了,和调用该mutex的调用栈

dump_stack:打印当前的backtrace
show_stack:打印指定task_struct的backtrace


标签:info,变量,查看,gdb,格式,断点
From: https://blog.51cto.com/u_15854579/5809886

相关文章

  • gdb调试基本操作
    38P-gdb调试基础指令使用gdb之前,要求对文件进行编译时增加-g参数,加了这个参数过后生成的编译文件会大一些,这是因为增加了gdb调试内容gdb调试工具:大前提:程序是你自己写的......
  • gdb usage
    gdbusageattachprocessgdbattach$pid查看进程内的所有线程infothread切换跟踪线程thread$thread_id  #此thread_id为infothread结果行首的threadid查看......
  • GDB常用命令
    GDB常用命令命令含义描述file装入想要的调试的可执行文件。run执行当前被调试的程序。kill终止正在调试的程序。step执行一行源代码而且进入函数内......
  • (四)GDB调试
    1什么是GDBGDB是由GNU软件系统社区提供的调试工具,同GCC配套组成了一套完整的开发环境,GDB是Linux和许多类Unix系统中的标准开发环境。一般来说,GDB主要帮助你......
  • 关于gdb调试
    ①gcctest.c-otest-g(生成所需文件)②gdbtest(进入gdb模式)③setargsab(设置参数a,b,空格隔开)④showargs(获取所设置的参数)⑤使用q或quit退出gdb模式 gdb模式下的......
  • gdb命令
    调用gdb编译需要在cc后面加-g参数再加-o;#gdb调试文件:启动gdb(gdb)l:从第一行开始列出源码(gdb)breakn:在第n行处设置断点(gdb)breakfunc:在函数func()的入口处......
  • Linux系统编程05-GDB调试
    首先需要加入调试选项-g,在可执行文件中加入源代码信息,打开所有警告-Wallgcc-g-Wallprogram.c-oprogram启动:gdb可执行程序退出:quit设置参数:set......
  • 使用gdb调试多进程和多线程程序
    默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)......
  • 数据库故障处理优质文章汇总(含Oracle、MySQL、MogDB等)
    数据库告警、紧急问题处理这些项目对于大多数朋友来讲应该不陌生了。从墨天轮社区整理的“最受DBA欢迎的技术文档合辑”系列中可以发现,大家对“故障诊断专题”的热情居高不......
  • gdb调试多进程和多线程命令
    1.默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:pare......