• Linux相关——记录gdb基本操作(持续更新)


    -----------2018.9.26更新标记-----------

    gdb的确是个很强大的东西啊,这里记录一下gdb的基本操作吧

    后续可能会补充,但暂时感觉够用了就不写多了。

    首先是ubuntu终端的2个最基本的操作:(不然会gdb但是调不出终端也没用啊!)

    1,cd xxxx     进入xxxx目录

    2,Ctrl + Alt + T   调出终端

    3,l  列出目录里有哪些文件 & 文件夹

    接下来就是gdb了。

    前提:编译时加上 -g 选项

    比如g++ P1000.cpp -g -Wall -Wextra -o work

    (在末尾加-O2可以开O2)

    今天才知道-g选项其实也有很多种:

    1,g0  没有任何用,等于不加-g

    2,g1 只包含少量调试信息

    3,g2 默认的选项,可以满足日常使用

    4,g3 包含一些额外的信息,比如可以让你查看宏定义。

    1,gdb work 调试work

    2,gdb 进入gdb界面

    3,file 进入gdb界面后可以切换调试的程序,

    比如我先

    gdb work   -----> 现在在调试work

    file work1 -----> 切换到调试work1

     

    4,l 列出10行程序给你看

    5,r运行程序

    6,b   xxx 在xxx行设置断点/在xxx函数设置断点

    7,disp xxx  可以一直查看xxx变量(表达式),使用了之后xxx就会一直挂在上面,很方便

    8,d 删除所有断点

    9,undisp 1  删除第一个disp 的变量(就是disp之后变量前面那个数字)

    10,undisp    删除所有disp 的变量

    11,s 进入函数 + 执行下一步

    12,n 不进入函数 + 执行下一步

    13,watch xxx 监控xxx,如果xxx发生变化,程序将会停下并告诉了发生了哪些变化(注意这个命令要求先在变量所在处设置断点)

    14,call 函数名    强制执行某个函数(需要正在运行)

     又发现了一些妙妙的东西,,,

    15,break 30 if n == 4   当n==4时在30行停下,其中break可以简写为b

    16,clear xxx,删除第xxx行的断点,如果不记得xxx行的断点是第几个了,用这个就很方便

    17,d x,删除第x个断点

    18,info b,查看所有断点信息

    19,info disp,查看所有disp的信息

    20,l xxx,以xxx行/xxx函数为中心,输出10行源文件

    21,l 50,58 (中间逗号要加!)显示50~58行源文件

    22,l +/-,显示上次显示那段的上面10段/下面10段

    23,set listsize xxx,自己设置每次显示的行数

    24,show listsize,查看每次显示的行数

    25,l ,50     以50行为结束行,输出10行

    26,l 50,   以50为起始行,输出10行

    27,finish 退出函数(会把这个函数跑完),简写为fin

    28,info program  查看程序信息

    29,disable xxx ,暂停第xxx个断点

    30,enable xxx ,开启第xxx个断点

    31,ctrl + L  清屏

    32,bt    打印堆栈

    33,frame xxx  ,切换到xxx(上面bt对应的函数前的数字)

    34,info locals   接33使用,切换后可以查看对应函数的局部变量信息(准确的说是当前栈层?)

    35,*数组@ num 可以查看一个数组的前num项。

    36, command n 设置运行到第n个断点时要看的内容,但是好像需要用c指令才可以看到?

    如果不加n,那么这个内容将会被赋给最后一个断点。

    示例:command 1

      printf "have is %d ", have

      c

      end

    end表示结束

     37,u 执行到当前循环结束(貌似要先跑完一次,直到遇到循环语句再执行到当前循环结束)

    也就是说如果你写了:

    while(1)
    {
        LL now = 0;
        if(s[l] == ')') {++l; return rnt % mod;}
        ++l;
    }

    然后你在LL now = 0;这行用u是没有用的,会一直运行到while(1)这一行,然后你再用u,然后就会执行到这个循环结束再显示给你

    38,finish 运行到当前函数结束,如果函数有返回值,将会告诉你返回值。

    39,jump 强行跳转到指定行,被跳过的内容都会被运行,如果你跳到一个后续状态中不会遇到的地方,那么将会出错。

    40,return 强行return,可以返回指定值

    41,tbreak 简写为tb ,创建一个临时断点,碰到一次之后这个断点就会被删除。

    42,print x = 4 表示将x这个变量修改为4

    43,set var x = 4 效果和上面相同

    44,start 开始调试,从main开始,按程序运行顺序调试(不需要提前设置断点)。 我是不是应该把这条放到开头

    偷偷记录一些其他命令:

    1,ulimit -s 查看栈空间大小

    2,ulimit -s xxx 将栈空间设置为xxx、

    3,ulimit -a  查看有关栈空间的详细信息(可以查看一些指令的用法)

    4,time 可以查看一个程序的运行时间。 使用方法: time ./work   ----> 查看work这个程序的运行时间

  • 相关阅读:
    事事浑不着意,总得有走心的地方
    Struts2框架概述
    java算法数据结构
    shell十三问(转)
    linux:将job放在后台执行的方法
    Python性能(转)
    python collections deque
    python中的参数传递和返回值
    python中的下划线
    python学习笔记glob模块
  • 原文地址:https://www.cnblogs.com/ww3113306/p/9160311.html
Copyright © 2020-2023  润新知