1.工具介绍
pstack 在 Linux 平台上的简单介绍
pstack 是 Linux(比如 Red Hat Linux 系统、Ubuntu Linux 系统等)下一个很有用的工具,它的功能是打印输出此进程的堆栈信息。可以输出所有线程的调用关系栈。
程序异常,可以通过
pstack 进程号 #查看各个线程的堆栈信息。
需要连续多次执行 pstack 进程号 命令。 查看每个线程的函数调用关系的堆栈,进行分析。当进程吊死的时候,多次使用,死锁的线程将一直处于等锁的状态,确定某些线程一直没有变化,一直处于等锁的状态。那么这些线程很可能是死锁了。如果怀疑哪些线程发生死锁了,可以采用gdb 进一步attach线程并进行分析。
gdb 在 Linux 平台上的简单介绍
GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。Linux 系统中包含了 GNU 调试程序 gdb,它是一个用来调试 C 和 C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况 .
- gdb 所提供的一些主要功能如下所示:
1 运行程序,设置能影响程序运行的参数和环境 ;
2 控制程序在指定的条件下停止运行;
3 当程序停止时,可以检查程序的状态;
4 当程序 crash 时,可以检查 core 文件;
5 可以修改程序的错误,并重新运行程序;
6 可以动态监视程序中变量的值;
7 可以单步执行代码,观察程序的运行状态。
core 文件
在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息,core文件生成过程叫做core dump(核心已转储)。系统默认不会生成该文件。
通过命令查看
ulimit -a
#默认不产生core文件,通过下面命令修改core file size,再次运行可生成
ulimit -c 1024 #命令修改core file size
ulimit -c unlimited #core文件无限制大小。
使用gdb工具查看core文件,定位error
gdb core.2635086 #core.2635086 为程序异常时生成的core文件,2635086是程序执行起来对应进程的pid
使用bt命令打印栈回溯信息。
查看线程栈信息
info stack,这个命令只能查看当前正在运行的某个线程的栈信息
info threads查看所有线程id,前面有的,代表正在运行的线程,其他没有的极有可能是在阻塞或者死锁的
调试线程死锁
gdb attach 9368(进程号) #进入gdb调试终端
gdb终端查看线程信息
info thread
调试奔溃程序
调试带参数程序
gdb --args ./testprg arg1 arg2
#例如:
gdb --args /usr/bin/ceph-mgr -f --cluster ceph --id node1 --setuser root --setgroup root
GDB 调试器启动后,可以借助 set args设置参数:
(gdb) set args -f --cluster ceph --id node1 --setuser root --setgroup root
还可以使用 run 或者 start 启动目标程序时,指定其所需要的数据
(gdb) run a.txt
(gdb) start a.txt3)
run(r)运行程序,如果要加参数,则是run arg1 arg2 …
#如果设置了断点,会执行到设置了断点的位置后暂停运行
查看源代码
list(l):查看最近十行源码
list fun:查看fun函数源代码
list file:fun:查看flie文件中的fun函数源代码
设置断点与观察断点
break (b)行号/fun设置断点。
break file:行号/fun设置断点。
break if<condition>:条件成立时程序停住。
info break(缩写:i b):查看断点。
watch expr:一旦expr值发生改变,程序停住。
delete n:删除断点。
break <函数名> 对当前正在执行的文件中的指定函数设置断点
break <行号> 对当前正在执行的文件中的特定行设置断点
break <文件名:行号> 对指定文件的指定行设置断点,最常用的设置断点方式
break <文件名:函数名> 对指定文件的指定函数设置断点
break <+/-偏移量> 当前指令行+/-偏移量出设置断点
break <*地址> 指定地址处设置断点
单步调试
continue(c):运行至下一个断点。
step(s):单步跟踪,进入函数,类似于VC中的step in。
next(n):单步跟踪,不进入函数,类似于VC中的step out。
finish:运行程序,知道当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
until:当厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序知道退出循环体。
查看运行时数据
print(p):查看运行时的变量以及表达式。
ptype:查看类型。
print array:打印数组所有元素。
print *array@len:查看动态内存。len是查看数组array的元素个数。
print x=5:改变运行时数据。
显示栈帧
backtrace 命令可以在遇到断点或异常而暂停执行时显示栈帧,该命令简写为 bt。此外,backtrace 的别名还有 where 和 info stack。
bt 显示所有栈帧
bt <N> 只显示开头 N 个栈帧
bt <-N> 只显示最后 N 个栈帧
bt full 不仅显示 backtrace,还要显示局部变量
bt full <N> 显示栈帧之后,就可以看出程序在何处停止,以及程序的调用路径。
https://blog.csdn.net/men_wen/article/details/75220102
Linux环境下的GDB调试方法