GDB基本操作和常见面试题

GDB基本操作和常见面试题

基本操作

GDB是 GNU开源组织发布的一个强大的Unix/Linux下的程序调试工具。

作用:

  • 1、启动用户程序后,可以按照用户的要求随意运行程序
  • 2、可让被调试的程序在用户所设定的断点处停住
  • 3、当程序被停住时,可以检查或者说监视此时程序中的数值。
  • 4、可动态改变用户程序的执行环境

基本的操作大概有十个:

file <文件名> 加载被调试的可执行程序文件
run 重新开始运行文件
start 单步执行,运行程序,停在第一执行语句
list 查看源代码,简写l
set 设置变量的值
next 单步调试(逐过程,一行一行运行),简写n
step 单步调试(逐语句,跳入函数内部运行),简写s
backtrace 查看函数调用的栈帧和层级关系,简写bt
frame 切换函数的栈帧,简写f
info 查看函数内部局部变量的数值,简写i
finish 结束当前函数,返回到函数调用点
continue 继续运行,简写c
print 打印值及地址,简写p
quit 退出gdb,简写q

具体如下所示:

启动

gcc -g hello.c -o hello //默认得到release版本的文件

gdb ./hello //进入调试状态

image

但通常是生成debug版本的文件

gcc -o mytest test.c -std=c99

readelf -S mytest//查看调试信息
readelf -S mytest | grep -i debug //更加详细的调试信息

查看

| 0 //查看代码
(gbd)list 5 //显示以第5行为中心的10行代码

image

(gdb) list main//显示函数名为main的函数的源代码

image

(gdb)list - : 显示当前行前面的代码

断点

(gdb) b main :为函数打断点,在进入函数的时候停止。

b 数字(行数) //打断点

info b//找断点

d 编号 //删断点

disable breakpoint 编号 //设置空断点

enable breakpoint 编号//开启断点

n(next)//逐过程(一行一行)

s(step)//逐语句(跳入函数内部)

监视

(gdb)watch 变量名//当变量值发生变化时,自动跳转


(gdb) print /a &变量名//打印变量地址

运行

(gdb)r [run的缩写] :开始运行程序,程序运行到断点的位置会停下来,如果没有遇到断点,程序会一直运行下去。

(gdb) continue//让程序继续执行

退出

(gdb) quit : 退出gdb调试

常见面试题

gdb调试死锁

答:
ps 可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性
ps工具标识进程的5种状态码:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵尸 a defunct (”zombie”) process
查找僵尸进程 ps aux | grep Z
top 可以动态地持续监听进程地运行状态
netstat:显示相关网络统计信息。netstat -au展示所有udp协议,netstat -at展示所有tcp协议。
find 查找指定目录下的文件 sudo find / -name mysql.h
ps ef | grep aaaaa 文本搜索
history 查看历史命令
chmod 加权限
查进程  netstat -a | grep 9006
查看日志末尾200行 tail -200f be.info
backtrace 简称 bt,查看堆栈信息,中文是反向追踪

查看进程号
ps-ef |grep "a.out-name"
gdb 调试该进程
info thread;//查看所有进程信息,可以看到lock_wait,可能有死锁
thread 2 进入进程2
bt 查看堆栈
f 3 查看编号位置代码。
判断死锁完毕。

posted @ 2023-08-30 19:40  我好想睡觉啊  阅读(368)  评论(0编辑  收藏  举报