关于GDB调试一些笔记

22 篇文章 0 订阅

当程序卡住的时候,如何通过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环境

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值