gdb常用命令

来源:互联网 发布:剑三炮哥捏脸数据 编辑:程序博客网 时间:2024/04/30 12:13
  1. break (b)
    break是用于设置断点的。其快捷键为b。
    用法示例: break main
                   b main                   以上两个都实现了在main()中设置断点。
                   b test1.c:21           
                   b 21                       以上两个都实现了在程序中的第21行设置断点。

    假设有文件TestStrtok.c
         1  #include <stdio.h>
         2  #include <string.h>
         3  int main ( int argc, char **argv)
         4  {
         5          char buf1[] = "aaa, ,a, ,,,bbb-c,,,ee|abc";
         6          char * token = strtok( buf1, ",-|" );
         7          int i = 0;
         8          while( token != NULL )
         9          {
        10                  printf( "%d/t",  ++i );
        11                  printf( "%s/n ", token );
        12                  token = strtok( NULL, ",-|");
        13          }
        14          printf( "/r/n" );
        15          return 0;
        16  }

    编译:必须带有-g或-ggdb
       gcc TestStrtok.c -o TestStrtok.out -ggdb

    进入gdb
       gdb TestStrtok.out

    开始调试
    (gdb) list
    1       #include <stdio.h>
    2       #include <string.h>
    3       int main ( int argc, char **argv)
    4       {
    5               char buf1[] = "aaa, ,a, ,,,bbb-c,,,ee|abc";
    6               char * token = strtok( buf1, ",-|" );
    7               int i = 0;
    8               while( token != NULL )
    9               {
    10                      printf( "%d/t",  ++i );
    (gdb)
    11                      printf( "%s/n ", token );
    12                      token = strtok( NULL, ",-|");
    13              }
    14              printf( "/r/n" );
    15              return 0;
    16      }
    (gdb)
    Line number 17 out of range; TestStrtok.c has 16 lines.
    (gdb) b 6
    Breakpoint 1 at 0x804843a: file TestStrtok.c, line 6.
    (gdb)

  2. condition
    使用条件断点。请注意gdb是如何给断点分配序号的——它是断点1。要使用条件断点,首先要指出断点的号码,然后是表达式。只有表达式为真的时候,程序才能被中断。
    用法示例:
    (gdb) condition 1 svalues[counter]->checksum>700
    (gdb) r
    Starting program: /home/test_user/ehanxuan/test5 
    Enter a string, or leave blank when done: hi
    Enter a string, or leave blank when done: hello
    Enter a string, or leave blank when done: how are you?
     
    Breakpoint 1, main () at test5.c:21
    21          maxval=counter;
    (gdb) print svalues[counter]->checksum
    $
    1 = 1122
    (gdb)

  3. delete
    删断点,后接断点编号。(断点信息可用 info breakpoints 或 i b 来查看)
    用法示例:delete breakpoints 1
                  d b 1
  4. watch
    设置观察窗口。使用watch命令,可在特定条件为真时,中止程序的执行。
    用法示例: watch counter>5

  5. run (r)
    运行程序到下一个断点。其快捷键为r。(《Linux 编程宝典》: 开始运行一个程序并调试。如果指定了参数,它们将作为程序的参数传递给程序。运行命令理解通配符和 I/O 重定向,但不包括管道。)
    用法示例: run
                       r
  6. continue
    运行程序到下一个断点。(《Linux 编程宝典》: 计数值。让程序继续执行直到遇到其他引起中断的事件。当使用这个语法时,如果遇到断点时表达式为真,断点才会引起程序中止执行。
    用法示例: continue
  7. step (s)
    单步执行(跟踪进入函数里)。其快捷键为s。
    用法示例: step
                        s
  8. next (n)
    单步执行(不跟踪进入函数里)。其快捷键为n。
    用法示例: next
                        n
  9. Enter(即按回车键)
    执行上一条指令。
  10. print (p)
    显示变量的值。其快捷键为p。
    用法示例: print varName   ——varName为变量名
                       p varName
  11. display
           在使用display的时候,每次在调试器中断程序,挂起指令时都要显示变量的值。
           用法示例:
    Enter an integer, or use -1 to exit: 100
    12          if(input==-1)exit(0);
    (gdb) display input
    2: input = 100
    (gdb) n
    13          printmessage(counter, input);
    2: input = 100
    (gdb) 
    For number 3, you entered 100 (0 more than last time)
    10        for(counter=0; counter<200; counter++){
    2: input = 100
    (gdb) 
    11          input=getinput();
    2: input = 100
    (gdb)
  12. 查看源代码
    list <linenum> 显示程序第linenum行附近的源程序
    list <function> 显示函数名为function的函数的源程序
    list                   显示当前行后面的源程序
    list-                  显示当前行前面的源程序

  13. core dump分析
    在分析core dump之前,必须首先确认你的账号是否允许这么做。使用下面的命令可使自己具有这样的权限: $ ulimit -c unlimited
    然后就可以使用core文件了。
    用法示例: $ gdb test core

    bt: 堆栈命令,可查看堆栈历史记录。gdb会告诉程序员每个函数被执行的最后一行。
    info:
    堆栈命令,可查看堆栈历史记录。
    frame 栈帧编号: 可激活栈帧编号所对应的内容。

    虽然这种core dump分析的方法非常有用,但是却不是很可靠。如果在程序完全崩溃之前堆栈已经被破坏了,就根本不能从中获得有用信息。在这种情况下,可能必须要跟踪程序才能解决问题。然而在许多情况下,core dump分析是非常有用的。



原创粉丝点击