GDB基本用法(转载)

基本命令

进入GDB:#gdb test
  test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。

查看源码:(gdb) l
  源码会进行行号提示。

如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。

设置断点:(gdb) b 6
  这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。

查看断点处情况:(gdb) info b
  可以键入"info b"来查看断点处情况,可以设置多个断点;

运行代码:(gdb) r

显示变量值:(gdb) p n

在程序暂停时,键入"p 变量名"(print)即可;

GDB在显示变量值时都会在对应值之前加上 N N",而无需写冗长的变量名;

观察变量:(gdb) watch n
在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;

单步运行:(gdb) n

程序继续运行:(gdb) c

使程序继续往下运行,直到再次遇到断点或程序结束;

退出GDB:(gdb) q

断点调试

在这里插入图片描述

数据命令

在这里插入图片描述
在使用print命令时,可以对变量按指定格式进行输出,其命令格式为print /变量名 + 格式,其中常用的变量格式:x:十六进制;d:十进制;u:无符号数;o:八进制;c:字符格式;f:浮点数。

调试运行环境相关命令

在这里插入图片描述

堆栈相关命令

在这里插入图片描述
backtrace/bt 也可以在该命令后加上要打印的栈帧指针的个数,查看程序执行到此时,是经过哪些函数呼叫的程序,程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)

跳转执行

jump:指定下一条语句的运行点。可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表式着下一条运行语句从哪里开始。相当于改变了PC寄存器内容,堆栈内容并没有改变,跨函数跳转容易发生错误。

信号命令

signal:signal SIGXXX,产生XXX信号,如SIGINT。一种速查Linux查询信号的方法:# kill -l

运行Shell命令

如(gdb)shell ls来运行ls

更多程序运行选项和调试

程序运行参数

set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

运行环境

path 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
工作目录
cd 相当于shell的cd命令。
pwd 显示当前的所在目录。
程序的输入输出
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb
调试已运行的程序
两种方法:
(1)在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序。
(2)先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。
暂停 / 恢复程
序运行当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。 在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops),如果要恢复程序运行,可以使用c或是continue命令。
线程(Thread Stops)
如果程序是多线程,可以定义断点是否在所有的线程上,或是在某个特定的线程。
break thread
break thread if …
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,可以通过“info threads”命令来查看正在运行程序中的线程信息。如果不指定thread 则表示断点设在所有线程上面。还可以为某线程指定断点条件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
当你的程序被GDB停住时,所有的运行线程都会被停住。这方便查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。

调试core文件

Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来。开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考

生成Core文件

一般默认情况下,core file的大小被设置为了0,这样系统就不dump出core file了。修改后才能生成core文件。
#设置core大小为无限
ulimit -c unlimited
#设置文件大小为无限
ulimit unlimited

这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限

core文件生成路径:输入可执行文件运行命令的同一路径下。若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo “1” > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo “/corefile/core-%e-%p-%t” > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
用gdb查看core文件
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test core

或gdb ./a.out
core-file core.xxxx
gdb后, 用bt命令backtrace或where查看程序运行到哪里, 来定位core dump的文件->行.

待调试的可执行文件,在编译的时候需要加-g,core文件才能正常显示出错信息

1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
用gdb实时观察某进程crash信息
启动进程
gdb -p PID
c
运行进程至crash
gdb会显示crash信息
bt

`GDB` (GNU Debugger) 是一款强大的开源调试器,用于单步执行、设置断点、检查内存状态、跟踪调用栈等,主要用于C/C++程序的调试。以下是一些基本的 `GDB` 使用步骤和命令: 1. **启动GDB**:打开终端,然后运行 `gdb` 加上要调试的可执行文件名,例如: ``` gdb my_program ``` 2. **设置断点**:在源代码中的特定行号设置断点,使用 `break` 命令后跟行号或函数名,如: ```shell break function_name break line_number ``` 3. **启动程序**:使用 `run` 或 `r` 命令启动程序,如果设置了断点,它会在第一个断点处暂停。 4. **单步执行**:`step` 进入下一行,`next` 执行当行并进入下一行(如果是函数内部)。 - `stepi` 单步指令执行。 - `nexti` 类似于 `next`,但只针对指令级别。 5. **查看变量值**:使用 `print` 或 `p` 显示变量值,如: ```shell print variable_name p variable_type variable_name ``` 6. **检查内存**:`x` 命令用于查看内存中的数据,例如: ```shell x/10i $pc // 查看十条指令的内容 x/10d variable // 查看变量的十六进制和十进制表示 ``` 7. **查看调用堆栈**:`backtrace` 或 `bt` 可以显示函数调用栈。 ```shell bt ``` 8. **继续执行**:当你想从当位置继续执行直到下一个断点时,可以使用 `continue` 命令。 ```shell continue ``` 9. **退出GDB**:完成调试后,使用 `quit` 或 `q` 结束调试进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值