关于GDB调试一些笔记

当程序卡住的时候,如何通过GDB判断卡在哪里?

 

程序运行没有“反应”,或出现卡死现象,此时除了猜测代码逻辑以外,可以通过GDB进行调试

 

首先获取进程的PID,可以通过Top命令获取

也可以通过

ps -aux | grep xxx     xxx为你程序前几个字符,区分大小写,可以一个字母也可以多个,但要连续。

 

获取PID,之后

输入 gdb -p xxxx    xxxx 为前面获得的pid号,数字

含义: “GDB进入正在运行的进程”

 

此时,程序会断点在某一处

如果程序真的卡死,此时就是断点在卡死的地方,可以通过打印出来信息,然后再结合源码,猜测问题所在

 

此时,一般来说,要输入 bt   查看下主线程的 栈 的情况(栈是最后的表象,通过栈信息可以反推出现问题的地方)

 

但,大部分还不是真的卡死,只是某个线程卡死,导致表面卡死,这种是比较讨厌的。

可以先简单试验下

输入 n

 

此时,如果有信息有变化,说明不是完全卡死。

 

输入 info threads

可以查看,本进程里包含哪些线程,然后在进入某个线程(需要线程号)

 

输入 thread x     x为前面看到的线程号

 

此时,一般常规操作,输入 bt

查看栈情况

往往,出错了会导致栈出错,最常见分析方法(下面的图,是引用的,也有连接)

 

 

 

其他,也比较常用的一些手段

 

比如,可以运行几步,但连续运行又不行的情况

此时,可以输入  n   (单步运行,相对于VS里的 F10)

然后也可以输入 c  (继续运行,直到出错或下一个断点,F5)

 

不断,交替使用bt

然后分析

 

GDB本身是很强大的,但也不复杂,常用的也不多,多试几次,就记住了。

 

扩展阅读:

参数列表

命令

命令缩写

命令说明

list

l

显示多行源代码

break

b

设置断点,程序运行到断点的位置会停下来

info

i

描述程序的状态

run

r

开始运行程序

display

disp

跟踪查看某个变量,每次停下来都显示它的值

step

s

执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句

next

n

执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)

print

p

打印内部变量值

continue

c

继续程序的运行,直到遇到下一个断点

set var name=v

 

设置变量的值

start

st

开始执行程序,在main函数的第一条语句前面停下来

file

 

装入需要调试的程序

kill

k

终止正在调试的程序

watch

 

监视变量值的变化

backtrace

bt

产看函数调用信息(堆栈)

frame

f

查看栈帧

quit

q

退出GDB环境

 

posted @ 2020-12-29 10:34  小刚学长  阅读(628)  评论(0编辑  收藏  举报