当前位置:
文档之家› linux_gdb与shell命令
linux_gdb与shell命令
分析core文件 对core进行gdb后需要分析core文件。分析 core文件一般有如下两个步骤 ① 查看core文件的堆栈 通知bt命令查看产生core文件的堆栈 ② 分析每层堆栈信息 通过f 堆栈序号命令迁移到每层堆栈。然后 调用gdb的常用命令进行分析。 注:gdb core文件时有时core文件信息不全通过 bt命令不能查看到堆栈信息
continue, step, next,finish
continue(简写:c), step(简写:s), next(简写: n),finish(简写:fin)实现恢复程序运行和单步调试功能。 continue 运行到下一个断点 step 进行函数内部 next 单步执行
continue, step, next,finish
delete、disable、enable
disable断点号i 断点号j … 使断点号i,j,...的断点无效即断点号为 i,j,…的断点未删除但已经不生效 enable 断点号i 断点号j … 使断点号i,j,…的断点有效 disable使断点暂时不使用,并没有删除 如果想继续使用只要enable即可。
break,watch
break … if 条件 是设置条件断点,程序运行时满足if后的条件, 运行到断点处才停止。 info break 是查看本程序中设置断点
break,watch
watch命令设置观察点。与watch相关的命令 如下所示 watch rwatch awatch info watchpoints
目录
Gdb调试基础知识 Gdb调试技巧 Shell脚本的基本知识
GDB调试基础知识
本章主要介绍gdb调试基础知识,通过 介绍这些基础知识能够掌握gdb调试。 本章主要内容如下: GDB介绍 GDB调试方法 GDB调试命令
GDB介绍
GDB是GNU开源组织发布的一个强大的 程序调试工具。 gdb - GNU debugger gdb官方网址 /software/gdb/gd b.html gdb下载地址 /gnu/gdb/
list
使用list命令时需要将程序的源代码与可执行 程序放到同一磁盘上且源代码与编译程序时 的目录结构相同。否则执行list命令没有结果 显示。在测试线上代码与程序不在同一磁盘 上,执行list命令没有结果显示。
print
print(简写:p)为查看当前程序的运行数据。 通常命令使用格式有两种 print 变量名称 print /格式 变量名称
finish 跳出函数
thread,info thread
thread,info thread为操作线程的命令 thread 线程序号i 切换到线程序号为i的线程 info thread 查看当前程序中的所有线程 这两个命令通常一起使用,一般先通过命令info thread 查找到线程的序号再切换线程。使用info thread命令 后显示的结果的第一列为线程的序号
GDB调试方法
常用的gdb调试方法有两种 调试一个新进程 调试一个正在运行的进程
调试一个新进程
调试一个新进程为将一个编译好的程序以gdb 方式运行起来。在以gdb方式运行前先确定此 程序是否可以进行gdb。程序都是由.c文件通 过编译连接生成的。在编译.c时如果没有添加 -g编译选项则不能进行gdb调试。例如有一个 test.c文件,编译连接时执行
确定core文件与执行文件同一目录
确定core文件与执行文件同一目录 将core文件与产生core的程序放在同一个目 录下
gdb core文件
gdb core文件 core文件与产生core文件的程序在同一个目 录下后则以gdb方式进行调试。调试命令为: gdb 程序名称 core文件名称
分析core文件
定位cpu使用过高
①
在运行时发现某个进行的cpu使用率过 高,可以通过gdb方式定位cpu过高的 原因。定位cpu过高的步骤如下所示: 查看每个进程中的每个纤程使用cpu的 占用率 在linux的shell界面上执行命令: ps xm –eo pid,tid,pcpu,comm 执行完毕命令后显示结果中显示每个进 程的每个纤程的cpu使用率,找到使用 率最高的线程,记录线程id
print
print 变量名称 查看变量值 print /格式 变量名称 以某种格式显示变量名称。格式种类如下所示:
print
x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十六进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 c 按字符格式显示变量。 f 按浮点数格式显示变量。
break,watch
break(简写为:b)命令来设置断点 有几种设置断点的方法: break 函数名 break 文件名file:行号line break 行号line break … if 条件 info break
break,watch
break 函数名 是在一个函数上设置断点,如果程 序运行到此函数则程序停止 break 文件名file:行号line 是在文件名为file文件的line行上设 置断点。 break 行号 line 是在当前文件的line行上设置断点
break,watch
info watchpoints 查看设置的watch点。info break同时显示 break断点与watch断点。故可以用info break 来查看
delete、disable、enable
delete(简写:d)、disable(简写:dis)、
enable(简写:ena)为维护断点的命令 delete 断点号i 断点号j … 为删除断点号为i, j, …的断点。如果delete后 没有参数则删除所有断点。 断点号:设置的第几个断点。可以通过info break命令查看
调试一个正在运行的进程
调试一个正在运行的进程为如果程 序已经运行,在运行时通过log, 黑匣子或其他功能发现正在运行的 程序出现问题,此时可以通过gdb 调试正在运行的程序。调试正在运 行程序的步骤如下所示
查找正在运行的进程号(pid) 2. 执行命令 gdb –p 进程号 查找正在运行程序的进程号的方式很多。 一般使用ps -ef命令。
gcc test.c –o test 则编译出的test程序不能进行gdb调试。执行 gcc –g test.c –o test 编译出的程序test可以进行gdb调试
调试一个新进程
确认程序可以进行gdb调试后,gdb调试一个 新的进程方式如下所示 gdb 程序名称 例如gdb test程序 gdb test
调试core文件
调试core文件是通过以gdb的方式分析 core文件查找出出现core的原因。Core 文件分析一般有如下步骤。 确定core文件类型 core文件与执行文件同一目录 gdb core文件 分析core文件
调试core文件
① ②
确定core文件类型 从外场或测试线发现的core文件现有 两种基本类型。 压缩后的core文件 没有压缩的core文件 对于压缩后的core文件需要解压。一 般的解压命令为tar xzvf 压缩后的core 文件名
x
b表示单字节 h表示双字节 w表示四字节 g表示八字节 如果不填写则默认按照四字节显示
call
call为强制调用函数命令 call 函数名function 强制调用函数名为function的函数。如果函数 function带参数在参数必须填写否则函数调用 失败。如调用printf函数进行打印hello call printf(“hello”) 不能这样调用 call printf “hello”
run
run(简写为r)为程序启动运行命令。有两种使 用格式 run run 启动参数
run
run 在gdb一个新的程序时程序启动不需要任何参数,运行 此命令则程序开始运行。或程序以gdb方式启动后运 行一段时间之后需要重新运行则可以执行此命令 run 启动参数 在gdb一个新的程序时程序启动需要启动参数,运行此
命令使用技巧
快速匹配 gdb调试的命令比较多有时不能记住命令的全 部字段,可以通过快速匹配解决此问题。只要 记住命令的前面 几个字母,然后按两次tab键 则自动匹配命令。 如果命令后的参数为程序中的内容,也可以通 过按两次tab键来匹配。
命令使用技巧
对上面内容通过举例来说明。 例如显示变量g_pstSmfnpmGlbMemMng 则需要执行如下命令 print g_pstSmfnpmGlbMemMng 如果通过匹配命令可以如下
print
例如以16进制显示变量i print /x I 程序默认以10进制显示
x
x(小写)为查看内存命令 x /内存的长度/显示格式/请求的字节数 内存的长度:表示显示内存的长度,也就是说从 当前地址向后显示几个地址的内容 显示格式:显示的格式如以16进制显示则填x 请求的字节数:表示gdb每次从内存中读取字节 的单位。可以是如下几个值:
break,watch
watch 全局变量名称 如果全局变量值发生变化则程序在全局变量发 生变化位置停止 rwatch 全局变量名称 如果全局变量被读取则程序在全局变量被读取 的位置停止 awatch全局变量名称 如果全局变量被读取或修改则程序在全局变量 被读或写的位置停止。 上面命令的全局变量如果是指针,上面的命令 可能不起作用。
命令使用技巧