Linux日记-gdb命令

【程序】    

 [编译成未链接的目标程序/.o文件]
    [没有符号表被读取。请使用 "file" 命令]    
        First, did you correctly compile the c program? Like:
            gcc -g your.c -o aaa
        Once you finish compiling the program, use below command to gdb it:
            gdb aaa
        Or if you start gdb w/o specifying the program `aaa‘, you can input
            `file aaa‘
        in the gdb shell.
    [执行程序]
        run:重新执行
    [查看变量/需要断点]
        print/p +变量名
            若把断点设置在循环体内部想要循环输出变量值,则需要next命令执行下一条语句。
        [按格式输出变量]
            p i:正常输出;p/c i:字符格式;p/t i:二进制格式
            
    [调用函数/需要断点]
        break 19
        run
        print func(3)    //函数中的形参必须换成实参
    [查看数组/需要断点]
        break 12
        run
        print sz
    [自动显示变量/需要断点]
        break 15
        run
        display/d i        //格式化自动输出i
        display/d result    //格式化输出result
        step/next            //执行下一步并显示当前display中自动输出变量(i和result)的值
        info display    //查看当前display中的自动显示变量的编号+格式+变量名
        [删除自动显示变量]
            delete display 1    //根据info得到的编号删除某个自动显示变量
            undisplay            //删除当前display中所有的变量
        [启用/禁用自动提示]
            disable display [1]    //display后加行号表示禁用当前行,不加表示禁用所有行
            enable display [1]    //启用,作用同上
            disable display 1 2    //中间空格可以操作多个自动显示变量

【断点】  

 注:<1>断点之后的命令不会自动执行(无论是main还是其他函数中),只能手动一步步走;
        <2>断点会跟着调用函数从而进入外部函数体内。
    [新建断点]
        break 1
    [删除端点]
        <1>(gdb)delete breakpoint 1    //删除当前位置断点,1代表第一个断点
        <2>clear    //删除程序上次停止处的断点
        <3>clear 20    //删除第20行的所有断点
        
    [设置断点有效无效]
        enable/disable breakpoint
    [查看当前断点信息]
        info break/b
    [断点处变量数值]
        print/p +变量名
            若把断点设置在循环体内部想要循环输出变量值,则需要next命令执行下一条语句。
    [快捷键进入下一个断点]
        注:<1>[断点之后]可以使用run、continue、next、step继续执行。
            <2>断点停下来后如果被继续执行了一次,那么接下来的程序执行可以使用Enter代替刚才的命令。
            #.run continue next step的区别
              [run]:头部=>断点
                  是指把gcc -c编译好的中间程序从头执行,保留断点/自动显示等属性;
              [continue]:断点=>结束/循环一次
                  如果断点不在循环内部,那么执行一次就直接输出结果;如果断点在循环里面,那么执行一次就等于进行了一次循环(方便~);
              [step]:断点=>断点+1命令行(进入被调函数)
                  如果命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。        
              [next]:断点=>断点+1命令行(不进入被调函数)
                  则和step不同,它不会进入函数,而是在出口坐等。
            //以上四种都可以在断点后设置自动显示变量,特别是在循环内部用于监控数值变化。
    [条件断点]:符合条件时断点才会出现,用于循环/判断中
        <1>break 6    //假设info break是2号
           condition 2 i==5    //当i=2时在第6行加上断点,其他情况等于这个断点不存在
        <2>break 6 if i==5    //含义同上,只不过合起来写了            
    

   

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。