gdb 常用命令
gdb 常用命令
1,启动程序
- r(un):执行程序,如果没有设置断点,则直接把程序都执行完
- start:执行程序到main函数后,停住。
2,常用命令
- n(ext):下一条指令(不进入函数)
- s(tep):进入函数
- 回车:执行上一条命令
- c:执行到下一个断点停住,如果后面没有断点,程序执行结束。
- q:退出gdb
3,设置断点
-
b(reak):设置断点,b后面指定行号。
- 指定行号
- 指定文件名:行号
- 指定 函数
- 指定文件名:函数
-
设置条件断点
-
有个循环,当只想在循环变量i=2的时候,程序停住:【b 行号 if i == 2】
(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000555555554748 in main at main.c:10 stop only if i == 2
-
-
设置临时断点:tbreak args
设置一个只中断一次的断点。args 和break 命令里的参数一样,断点设置也一样,但断点在第一次程序中断后自动 删除。 -
用正则表达式设置断电:rbreak regex
在所有匹配正则表达式regex 的函数上设置断点。这个命令会在所有匹配的函数上设置无条件的断点,也打印设置的断点列表
正则表达式的语法是标准的,就如grep
工具用的一样。注意,和shell用的不一样,例如foo匹配开头是fo,接下来有0 或者多个o 的函数。在你的正则表达式的开头和结尾有个隐含的.,所以要想只匹配foo 开头的函数,用^foo.在调试C++程序,在非特定类的成员函数的重载函数的设置断点上,rbreak 很有用。
直接运行rbreak:在所有函数上设置断点。
4,查看源文件
- l(list):查看源文件
- 指定行号
- 指定文件名:行号
- 指定 函数
- 指定文件名:函数
5,查看设置了哪些断点
- info b
6,删除断点
- d (el)断点的号码
例子:先用info b查看有哪些断点,注意Num列,如果想删除【src/add.c:4】处的断点,就执行【d 2】
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000555555554667 in add at src/add.c:4
3 breakpoint keep y 0x000055555555468b in main at main.c:5
删除3号(src/add.c:4处的)断点:
(gdb) d 2
再用info b看看,发现2号断点没有了。
(gdb) info b
Num Type Disp Enb Address What
3 breakpoint keep y 0x000055555555468b in main at main.c:5
7,查看变量的值和变量的类型
- 查看任何东西(变量/函数等)的值:p
- 查看任何东西(变量/函数等)的类型:ptype
8,设置程序的启动参数
- 先执行【set args 参数1],然后【r】
- 直接执行【r 参数1】
9,修改变量的值
- set var 变量=newValue
10,查看帮助
- help 命令名字:比如查看set命令的具体用法,可以使用【help set】
11,每次单步执行都想观察变量的值,请使用【display】,不想看了,就用【undisplay】加Num的号码
- display 变量的名字
- undisplay Num(号码)
- info display:可以查看display的Num(号码)
12,调试core文件,当出现:段错误(核心已转储)[Segmentation fault (core dumped)]时,可以使用【gdb 程序名 core文件名】后,就能直接看到在哪行出错,如果没有显示,可以输入【where】,也可以定位到哪行出错。
但是core文件默认是不被生成的,如何让它生成呢,
- 首先确认当前状态:【ulimit -c】,如果结果为0,说明不能生成core文件
- 那么就设置core文件的允许大小:【ulimit -c unlimited】,也就是core文件大小没有限制,这样设置的好处是当core文件特别大的时候也能够被生成。当然也可以指定具体的大小【ulimit -c 1024000】等。
之后就有了下面的问题:
程序第一次执行出了[Segmentation fault]错误后,就会在当前目录生成一个名字为【core】的文件,问题来了,如果又执行了一次,又出了[Segmentation fault]错误后,又会生成一个【core】,这次的【core】就会覆盖掉上次的【core】,所以就需要设置如何生成【core】的文件名,达到每次生成的【core】的名字都不相同,就不会覆盖掉上次的core文件了。
选项如下:
%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 添加程序名
修改办法:
-
切换到root用户
sudo su
-
编辑/proc/sys/kernel/core_pattern文件,只能用下面的方法
echo "core-%e-%t" > /proc/sys/kernel/core_pattern
然后生成的core文件的名字就变为:【core-app-1555987945】,注意程序的名字为app。