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。

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

posted @ 2019-04-23 11:06  小石王  阅读(3608)  评论(0编辑  收藏  举报