首页 > 其他分享 >gdb常用操作

gdb常用操作

时间:2023-05-28 10:36:23浏览次数:19  
标签:常用 list GDB break 命令 gdb 操作 断点


2014-12-12日学习笔记

gdb调试

一、启动dgb

1、源代码编译

操作:GCC要带-g选项,目的是让编译器将符号表(对应于程序的变量和代码行的内存地址列表)保存在生成的可执行文件中。这样才能在调试会话过程中引用源代码中的变量名和行号。

举例:gcc –g –o main main.c

2、启动

启动gdb的方法有以下几种:

(1)gdb + ProgramName

说明:ProgramName 也就是可执行程序文件,一般在当前目录下

举例:gdb main

(2)gdb + ProgramName +core

说明:如果一个程序发生了错误,而且生成了core文件,core文件是程序非法执行后core dump产生的文件。一个程序必须开启core file size后才能生存core文件,用ulimite –a命令可以查看当前可执行程序的core file size。开启core file size的方法:ulimit -c unlimited。

举例:gdb main core

(3)gdb + ProgramName +PID

说明:如果程序是一个服务程序,那么可以通过制定服务程序运行时的PID,gdb会自动的attach上去。

(4) gdb -command=z x

说明:在调用GDB时可以指定启动文件,如:$gdb-command=z x

表示要在可执行文件x上运行GDB,首先要从文件z中读取命令。

gdb启动文件

有时候我们在完成调试前可能需要退出GDB,比如需要离开比较长的一段时间而且不能保持登录在计算机中。为了不丢失某些信息,可以将断点和设置的其他命令放在一个GDB启动文件中,然后每次启动GDB时会自动加载它们。

GDB启动文件默认名为.gdbinit。可以将一个文件放在主目录中用于一般用途,另一个文件放在特定项目专用的目录中。例如,可以将设置断点的命令放在后一个目录的启动文件中,在主目录的.gdbinit文件中存储开发的一些通用的宏。最好不要将编程项目放在主目录中,因为不能将项目特有的信息放在.gdbinit中。

带参数的可执行程序

如果可执行程序带有参数,可在启动gdb后,set args + 参数,就可设定程序运行时需要的参数,show paths 查看程序的运行路径。

3、以TUI模式运行GDB

在调用gdb的时候指定-tui选项或者在处于非TUI模式时在GDB中使用Ctrl+X+A组合键,可以将终端屏幕分成原文本窗口和控制台的多个子窗口

二、查看代码

list命令可用于显示指定位置处的源代码。list命令会影响当前行和当前文件。list命令有多种方式指定要显示的源代码范围,可以是行号,函数名,甚至是指令地址。常用的如下:

list linenum:显示指定行数附近的代码。

list function:显示指定函数附近的代码。

list + 列出当前行的后面代码行。

list - 列出当前行的前面代码行。

list *addr:显示指定地址附近的代码。

默认情况下,GDB显示指定位置处以及其前后的10行代码,但是这是一个可设置的值。

set listsize count:设置list命令显示的源代码数量最多为count行,0表示不限制行数。

show listsize:显示listsize的值。

三、断点设置

1、设置断点

(1)break line_number:在某一行设置断点。

(2)break function(函数名):在某个函数的入口(第一行可执行代码)处设置断点。

(3)break filename:function:在源代码文件filename的函数function入口处处设置断点。

(4)conditionbreak_p_num(断点编号) cond(条件):将正常断点转变为条件断点

举例:condition 30  index == 5

(5)break line_num(行号) if cond(条件):用break if可以将break和condition命令组合成一个步骤:举例:(gdb) break 30 if index == 5

2、查看断点

info break:显示所有断点信息

3、删除断点:

(1)deletebreak_point_num:删除编号为break_point_num的断点;

(2)delete:删除所有断点;

(3)clear function:删除在function函数处设定的断点

(4)clearfilename:funtion删除在filename文件的function函数处设定的断点

(5)clear line_number:删除在line_number行设定的断点

(6)clearfilename:line_number:删除在filename文件的line_number行设定的断点

4、禁用与启用断点

(1)disablebreakpoint-list(是用空格分隔开的多个断点标识符):禁用断点

(2)disable:禁用所有现存断点

(3)enablebreakpoint-list:启用断点

(4)enable oncebreakpoint-list:在下次引起GDB暂停执行后禁用

5、断点命令列表

让GDB在每次到达某个断点时自动执行一组命令,从而自动完成某一任务。

使用commands命令设置命令列表:

commands breakpoint_number

...

commands

...

end


如果嫌GDB输出太冗长,可以使用silent命令,只需将其添加到设置的命令列表最开始处即可。 

四、调试

1、启动:run

2、查看栈帧:frame num(栈帧编号)

注意栈帧编号规则,当前正在执行的函数的帧被编号为0,其父帧(即该函数的调用者的栈帧)被编号为1,父帧的父帧被编号为2,以此类推。

跳到调用栈中的下一个父帧:up

引向相反方向:down

显示整个栈,即当前存在的所有帧的集合:backtrace

3、输出当前值:print或者p

4、浏览以前的GDB命令:上一个Ctrl+P、下一个Ctrl+N

5、可以直接按下回车再次执行最近执行过的那条命令

6、运行

(1)单步执行:step(s)、next(n),仅执行到代码的下一行后再次暂停。

注意二者区别:在函数调用时step会进入函数,next导致下一次暂停出现在调用函数之后。next被称为单步越过(stepping over)函数,而step被称为单步进入(stepping into)函数。

next和step都可以采用一个可选的数值参数,来表示要使用next或step执行的额外行数。

(2)无条件恢复程序的执行:continue(c)

直到遇到另一个断点或者程序结束。

continue可以接受一个可选的数值参数n,要求GDB忽略下面n个断点。

(3)用finish(fin)或until(u)命令恢复。

finish命令指示GDB恢复执行,直到恰好在当前帧完成之后为止。

until命令通常用来在不进一步在循环中暂停(除了循环中的中间断点)的情况下完成正在执行的循环。until会执行循环的其余部分(如果遇到断点,还是会暂停),让GDB在循环后面的第一行代码处暂停。

until命令也可以接受源代码中的位置作为参数,其用法与break命令同。


如果GDB触发了main函数入口处的一个断点,那么可以使用下面这些命令方便地使程序一直执行到swap()的入口:

until 13

until swap

until swapflaw.c:13

until swapflaw.c:swap

跳出循环:

until NUM   执行到一个比当前行号大的行,或者也可以指定在当前frame(我理解成函数)中的某一行

跳出函数:
finish      执行,直到选定的frame执行结束,然后打印返回值,将其放入历史值中,停止


7、退出:quit

 

标签:常用,list,GDB,break,命令,gdb,操作,断点
From: https://blog.51cto.com/u_16131207/6364825

相关文章

  • MongoDB基本操作记录
    MongoDB基本操作记录连接Mongo:mongo--host127.0.0.1--port27017-uroot-p123456显示数据库列表:showdbs选择数据库:useCX_tb显示所有表名:db.getCollectionNames()删表:db.xxx.drop()显示帮助:db.xxx.help()插入一条数据:db.xxx.insert({"id":"1","add_time":&q......
  • 常用提高图片质量的正反提示词
    正向:bestquality,最高质量masterpiece,精品ultrahighres,高分辨率photorealistic, 照片真实感反向:worstquality,最差质量lowquality,差质量normalquality,一般质量lowres,低分辨率badanatomy,差的身体结构,作用于人像ba......
  • 操作系统中进程的就绪和等待两个状态的区别
    在操作系统中,进程可以处于不同的状态,其中包括就绪状态和等待状态。就绪状态表示进程已经准备好被调度执行,而等待状态表示进程因为某种原因而暂时无法执行,需要等待特定事件的发生或条件的满足。1.就绪状态就绪状态是指进程已经满足了所有的运行条件,并且已经准备好被调度执行,只需......
  • 2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两
    2023-05-27:给你一个只包含小写英文字母的字符串s。每一次操作,你可以选择s中两个相邻的字符,并将它们交换。请你返回将s变成回文串的最少操作次数。注意,输入数据会确保s一定能变成一个回文串。输入:s="letelt"。输出:2。答案2023-05-27:大体过程如下:1.定义结......
  • Appium自动化(13):Appium常用操作之TouchAction操作
    TouchAction操作Appium的辅助类,主要针对手势操作,比如滑动、长按、拖动等。其原理是将一系列的动作放在一个链条中,然后将该链条传递给服务器。服务器接受到该链条后,解析各个动作,逐个执行。TouchAction类支持的动作很多;常用操作如下:1、press(self,el=None,x=None,y=None): 按......
  • 操作系统(2.8)--线程的实现
    线程的实现方式1.内核支持线程(KST)内核支持线程,与进程相同,是在内核的支持下运行的,即无论是用户进程中的线程,还是系统进程中的线程,他们的创建、撤消和切换等也是依靠内核,在内核空间实现的。这种线程实现方式主要有如下四个优点:(1)在多处理器系统中,内核能够同时调度同一进程中多个线......
  • 2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两
    2023-05-27:给你一个只包含小写英文字母的字符串s。每一次操作,你可以选择s中两个相邻的字符,并将它们交换。请你返回将s变成回文串的最少操作次数。注意,输入数据会确保s一定能变成一个回文串。输入:s="letelt"。输出:2。答案2023-05-27:大体过程如下:1.定义结构体Index......
  • Odoo常用字段属性
     string是字段的默认标签,在用户界面中使用。除Selection和关联字段外,它都是第一个位置参数,所以大多数情况下它用作关键字参数。如未传入,将由字段名自动生成。default设置字段默认值。可以是具体值(如active字段中的default=True),或是可调用引用,有名函数或匿名函数均可。help提......
  • HTTP状态码是什么?常用的状态码有什么?
    HTTP(HypertextTransferProtocol)是一种用于传输超文本和其他内容的应用层协议。历史:HTTP最早的版本是HTTP/0.9,它只支持简单的GET请求,而不支持其他操作。HTTP/1.0版本增加了许多新特性,如支持多个请求,请求和响应头信息,以及管道化传输。HTTP/1.1版本是当前最常用的版本,它引入了持......
  • HTTP状态码是什么?常用的状态码有什么?
    HTTP(HypertextTransferProtocol)是一种用于传输超文本和其他内容的应用层协议。历史:HTTP最早的版本是HTTP/0.9,它只支持简单的GET请求,而不支持其他操作。HTTP/1.0版本增加了许多新特性,如支持多个请求,请求和响应头信息,以及管道化传输。HTTP/1.1版本是当前最常用的版本,它引入了持......