• 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

     

  • 相关阅读:
    【Purple Pi OH RK3566鸿蒙开发板】OpenHarmony音频播放应用,真实体验感爆棚!
    单片机卡死的几大原因、分析、解决
    【编译原理】LL(1)文法
    【算法三】冒泡排序
    02.5 自动微分
    【附源码】计算机毕业设计JAVA宠物收养管理
    【python基础题】——程序题(一)
    【付费推广】常见问题合集,激励规则FAQ
    ​毕设作品案例-基于JAVA-SSM实现-小程序-商品展示系统-微信外卖小程序-附源码+LW(文档+PPT)+示例视频
    黑猫带你学UFS协议第2篇:UFS相关名词释义
  • 原文地址:https://blog.csdn.net/l_shadow_m/article/details/126144763