GDB使用(常用命令、CORE文件调试、远程调试、附加进程、容器调试等)

您所在的位置:网站首页 调试core文件 GDB使用(常用命令、CORE文件调试、远程调试、附加进程、容器调试等)

GDB使用(常用命令、CORE文件调试、远程调试、附加进程、容器调试等)

2024-02-21 21:14| 来源: 网络整理| 查看: 265

资源下载: http://sourceware.org/gdb/wiki/STLSupport?action=AttachFile&do=view&target=stl-views-1.0.3.gdbhttps://github.com/jgarvin/joe-etc/blob/master/gdb/stl-views-1.0.3.gdb 1.常用命令

● 断点/观察点

命令说明b/break n在当前进入的文件的第n行加入断点b/break filename:n在filename文件n行加入断点b/break 0xXX在内存0xXX位置设置断点b/break n if XX在n行设置条件断点,满足XX条件时进入,循环中非常实用tbreak n在n行设置临时断点,断点进入后立即被删除info b/break查看设置的所有断点信息info b/break n查看断点n的信息,断点编号在设置断点或查看所有断点时可查询,下同clear n清除n行的断点,GDB会给出提示信息delete n清除断点n的相关信息,GDB不会给出提示信息disable/enable n使断点n使能或失效,一次设置多个断点可用空格分隔awatch/watch var设置观察点,当var变量被读取或写入时进入rwatch var设置观察点,当var变量被读取时进入

● 变量管理

命令说明display expr显示expr表达式(可以为变量)的值,每次断点被命中时均自动显示info display展示当前所有需要自动显示的表达式的信息,会显示编号和使能状态delete display n删除编号为n的表达式值的显示,表达式编号在添加或展示时可以获取disable/enable display n使编号为n的表达式值显示失效或使能undisplay display n停止显示编号为n的表达式的值p/print expr直接显示expr表达式(可以为变量)的值,可以控制输出格式whatis expr显示expr表达式(可以为变量)的数据类型set var=value设置var变量的值为valuex/[长度][格式] 查看指定地址、指针开始 指定长度的内存数据,可使用C语言格式化字符

● 调试过程

命令说明set args arg1设置程序运行的参数,多个参数使用空格分隔show args查看运行参数set width n设置GDB的行宽为ncd dir将工作目录切换至dir目录run程序开始运行,附加到进程时可能不生效s/step进入到子函数中(该函数必须要有调试信息才支持)n/next单步执行,不会进入子函数中c/continue继续执行,直到下一个断点或程序结束u/until n运行到n行finish运行到函数结束,并打印函数相关的堆栈、返回值、参数信息return value直接结束当前函数,并返回value(会改变程序流程)call func直接调用func函数

● 堆栈信息

命令说明bt/backtrace [n]打印堆栈信息,可指定打印的堆栈的层数frame [n]打印第n个堆栈帧,当前调用的函数帧号为0,不指定帧号打印当前帧info reg查看寄存器使用情况info stack查看堆栈使用情况up/down跳到上一层/下一层函数

● 其他命令

命令说明gdb 目标程序进入GDB调试模式,源文件编译时需使用“-g”选项生成调试信息l首次使用列出程序开始时或断点附近的10行代码,再次使用列出后10行,直到文件结束 2.调试Core文件 2.1 使用场景   Linux系统中程序(使用 “-g -Wall”选项编译)发生段错误等异常时,系统内核会自动生成一个带调试信息的内存印象文件,使用GDB工具调试该文件,能够获取到出错的代码行等信息。 2.2 core文件参数设置 ● 设置core文件的大小   直接在命令终端输入命令即可,大小可作为开关使用。 ulimit -c 0 # 将core文件大小设置为0,此时将不生成core文件 ulimit -c 2 # 将core文件大小设置为2KB,自动生成core文件,文件大小达到2KB时发生截断 ulimit -c unlimited # 将core文件大小设置为无上限,自动生成core文件,文件大小不添加特殊限制

● 设置文件生成目录、命名规则   修改“/proc/sys/kernel/core_pattern”文件内容可以设置core文件名包含的信息内容和目录(目录必须存在),注意使用echosysctl命令,vim可能不能成功编辑内容。   信息内容参数包括:%p - pid;%u - 当前uid;%g - 当前gid;%s - 导致产生core的信号;%t - core文件生成时的unix时间;%h - 主机名;%e - 命令名。

echo "/home/core/core_%p_%t" > core_pattern # 将core文件统一生成到“/home/core”目录下,产生的文件名为“core_pid_时间” sysctl -w "kernel.core_pattern=core_%p_%t" >/dev/null # 文件生成到默认目录(进程目录),文件名格式为“core_pid_时间”

● 设置文件名中以进程ID作为扩展   修改“/proc/sys/kernel/core_uses_pid”文件,文件内容为1,添加进程ID作为文件扩展,为0不添加。

echo "1" > /proc/sys/kernel/core_uses_pid # 以进程ID作为core文件扩展名,生成的文件名称类似于“core.13125”

2.3 调试core文件(有多种命令序列,思路类似) 【1】使用GDB执行“GDB 应用程序目录文件名 core文件名”命令打开core文件; 【2】在GDB交互界面执行“bt”/“backtrace”命令,等待GDB分析完成即可得到出错的文件和代码行。

3.远程调试 3.1 说明   需首先在程序执行的主机上安装GDBServer程序,远程调试特别适用于代码和程序运行环境不是同一台主机的情况。 3.2 调试步骤 【1】在程序运行的主机上执行“gdbserver IP:Port 可执行程序路径文件名”,显示如下界面,说明开启GDBServer成功;

在这里插入图片描述 【2】在需要进行客户端调试的主机上,执行“gdb 可执行程序路径文件名”,进入GDB调试状态; 【3】在客户端GDB交互命令行输入“target remote IP:Port ”命令,此处的IP和Port为步骤【1】中开启监听的IP和端口; 【4】客户端显示类似下图1表明连接成功(服务端也会有对应提示,如下图2),此时可直接在客户端中执行GDB交互。 在这里插入图片描述在这里插入图片描述

4.附加进程调试   GDB客户端使用“gdb attach pid”附加到指定进程;  GDBServer使用“gdbserver IP:Port --attach pid”附加到指定进程。 5.显示容器信息   将本文开始时的资源下载(《stl-view-1.0.3.gdb》,该文件可去其他网站自行下载)对应文件拷贝至当前用户主目录,命名为“~/.gdbinit”,即可在GDB调试时使用pmap、pset、plist等命令查看容器相关信息(可在每次需要调试容器时使用“source”命令动态导入该文件)。 pset setVar # 查看setVar的set容器变量的基本信息,包括元素类型、元素个数等 pset setVar string # 查看setVar的set容器变量的具体元素,注意带上元素类型string


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3