• Linux调试器-gdb使用


    1. 背景

    程序的发布方式有两种,debug模式和release模式
    Linux gcc/g++出来的二进制程序,默认是release模式
    要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,生成debug模式的程序 

    2. 开始使用

    对源文件编译的时候加上-g选项,否则会提示没有调试符号


    下面是对于debug版本程序的调试

    gdb进入调试

    注意:gdb会记录最近一条命令,如果命令无变化,可以直接回车 


    q或quti:退出调试


    l或list:显示出源代码,每次显示10行

    1. (gdb) l 0
    2. 1 #include
    3. 2
    4. 3 int AddToTop(int top)
    5. 4 {
    6. 5 int sum = 0;
    7. 6 int i = 0;
    8. 7 for (i = 0; i < top; i++)
    9. 8 {
    10. 9 sum += i;
    11. 10 }
    12. (gdb)
    13. 11 return sum;
    14. 12 }
    15. 13
    16. 14 int main()
    17. 15 {
    18. 16 int top = 100;
    19. 17
    20. 18 int ret = AddToTop(top);
    21. 19
    22. 20 printf("ret:%d\n", ret);
    23. (gdb)
    24. 21
    25. 22 return 0;
    26. 23 }
    27. (gdb)
    28. Line number 24 out of range; test.c has 23 lines.

     指令l 0意为从代码第一行开始显示


    r或run:开始调试

    如果没有遇到断点就直接运行结束,并且每次都从最开始运行程序

     


    b(breakpoint) 行号:给特定的行号打断点

    1. (gdb) l 0
    2. 1 #include
    3. 2
    4. 3 int AddToTop(int top)
    5. 4 {
    6. 5 int sum = 0;
    7. 6 int i = 0;
    8. 7 for (i = 0; i < top; i++)
    9. 8 {
    10. 9 sum += i;
    11. 10 }
    12. (gdb)
    13. 11 return sum;
    14. 12 }
    15. 13
    16. 14 int main()
    17. 15 {
    18. 16 int top = 100;
    19. 17
    20. 18 int ret = AddToTop(top);
    21. 19
    22. 20 printf("ret:%d\n", ret);
    23. (gdb)
    24. 21
    25. 22 return 0;
    26. 23 }
    27. (gdb) b 16
    28. Breakpoint 1 at 0x40056a: file test.c, line 16.
    29. (gdb) b 18
    30. Breakpoint 2 at 0x400571: file test.c, line 18.
    31. (gdb) b 20
    32. Breakpoint 3 at 0x40057e: file test.c, line 20.

    info b:查看断点

    1. (gdb) info b
    2. Num Type Disp Enb Address What
    3. 1 breakpoint keep y 0x000000000040056a in main at test.c:16
    4. 2 breakpoint keep y 0x0000000000400571 in main at test.c:18
    5. 3 breakpoint keep y 0x000000000040057e in main at test.c:20

     Num表示的是断点的编号


    d 断点编号:删除断点

    1. (gdb) d 1
    2. (gdb) d 2
    3. (gdb) d 3
    4. (gdb) info b
    5. No breakpoints or watchpoints.

    n:逐过程开始调试

    需要先打一个断点然后用r进入到调试模式


    p 变量名:打印变量内容

    要确保变量没有被销毁才能打印出来 

    1. (gdb) p ret
    2. $5 = 4950

    s:逐语句,遇到函数会进入到函数内部

     


    bt:查看当前的调用堆栈 

    1. (gdb) bt
    2. #0 AddToTop (top=100) at test.c:7
    3. #1 0x000000000040057b in main () at test.c:18

    finish:将当前函数跑完,就停下来

    1. (gdb) finish
    2. Run till exit from #0 AddToTop (top=100) at test.c:7
    3. 0x000000000040057b in main () at test.c:18
    4. 18 int ret = AddToTop(top);

    display :设置常显示

    每调试一步都会将设置了常显示的变量的值给显示出来

     


    undisplay:取消设置常显示 

    1. (gdb) undisplay
    2. Delete all auto-display expressions? (y or n) y

     until:跳转到指定行

     


    c:运行至下一个断点处就停下来 

     


    disable/enable 断点编号:关闭和打开断点

    (gdb) disable 2
    

    set var:设置变量的值

    1. (gdb) set var top
    2. warning: Expression is not an assignment (and might have no effect)
    3. (gdb) set var top=80
    4. (gdb) p top
    5. $3 = 80

     

  • 相关阅读:
    超越 Transformer开启高效开放语言模型的新篇章
    什么是RTC
    狄拉克函数及其性质
    Spring Boot前后端简单集成MinIo开发
    HIVE存储格式和压缩方式详解
    bootstrap 布局大屏,pc,小屏,移动屏自适应
    GHostNet网络最通俗易懂的解读【不接受反驳】
    Java中的继承——详解
    mysql 编程 高精端问题
    小艺的英文名编程求助(帮忙检查)
  • 原文地址:https://blog.csdn.net/l_shadow_m/article/details/126144763