zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    用批处理实现映射盘网络盘为固定盘符,请更改冲突的硬盘盘符
    linux下mysql寻找my.cnf顺序
    php写memcached ,c读取乱码问题[转]
    linux下boost安装方法
    解决php soap webservice 用c++ soap调用的问题[转]
    【转载】Servlet生命周期与工作原理
    【转载】深入理解Java多态性
    JSP中几个常用的参数与中文乱码问题
    获取数据库连接
    dom4j简单实例
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10755199.html
Copyright © 2011-2022 走看看