zoukankan      html  css  js  c++  java
  • GDB基础学习

    GDB基础学习

    • 要调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g参数可以做到这一点,比如:
    gcc -g test.c -o test
    

    GDB 的命令概貌

    使用help命令

    • 通过gdb test启动gdb后,就进入了gdb的调试环境,就可以使用gdb 的命令开始调试程序了,gdb的
      命令可以使用help命令来查看:

    • 这里可以看到help命令只是列出了gdb命令的种类,如果要知道所有的命令可以输入help all,也可以通过help <class>查看种类中的命令,或通过help <command>查看命令的帮助。

    • 比如我们可以通过help breakpoints来查看断点的命令:

    • 『需要注意』:gdb中的命令可以简写,如设置断点的break可以简写为b(当然,命令的前几个字符要标志着唯一的命令);在linux下,可以敲击两次TAB键来补齐命令的 全称,如果有重复的,gdb会把其列出来。比如输入b敲击两次TAB键:

    基本命令

    命令 解释 示例
    List(l) 列出文件的代码清单 (gdb) l
    Printf(p) 显示指定变量(临时变量或全局变量)的值。 (gdb) p i
    (gdb) p nGlobalVar
    Run(r) 运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 (gdb) r
    Continue(c) 继续执行被调试程序,直至下一个断点或程序结束。 (gdb) c
    Breakpoint(b) 1.函数断点: 在进入指定函数时停住。
    2.行断点:在指定行号停住。
    3.条件断点:break ... if ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
    4.临时断点:(tb 行号)
    (gdb) b main
    (gdb) b 8
    (gdb) b if i=100
    (gdb) tb 15
    Step(s) 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数
    相当于其它调试器中的“Step Into (单步跟踪进入)”。
    (gdb) s
    Next(n) 执行一行源程序代码,此行代码中的函数调用也一并执行;
    相当于其它调试器中的“Step Over (单步跟踪)”。
    (gdb) n
    Info(i) 显示各类信息 (gdb) i r
    Backtrace(bt) 打印函数调用堆栈 (gdb) bt
    Quit(q) 退出gdb调试 (gdb) q

    实例学习

    我们用下面的代码来学习:

    #include <stdio.h> 
    int func(int n)
    {
        int sum=0,i;
        for(i=0; i<n; i++)
        {
             sum+=i; 9
            
        }
            return sum; 
    }
    
    main() 
    {
        int i;
        long result = 0; 
        for(i=1; i<=100; i++) 
        {
            result += i;
        }
        printf("result[1-100] = %d 
    ", result );
        printf("result[1-250] = %d 
    ", func(250) ); 
        
    }
    

    首先vim一个test.c,再输入gcc -g test.c -o test进行编译,编译成功后输入gdb test启动gdb进行调试:

    输入l列出源码,再敲击回车可以看到所有代码:

    接下来在第16行通过b 16设置断点;通过b func在func函数处设置断点,info b可以查看断点信息如图:

    输入r运行程序,会停到断点处;再输入n单条语句执行,可以看到循环在一条一条执行;为了快速一点,输入c直接把循环执行完:

    我们也可以输入b 16 if i=50来设置条件断点,run之后可以看到程序停到了断点处,此时printf i的值为50:

  • 相关阅读:
    Linux下常用的ctrl命令
    网络编程函数笔记(二)
    javascript中函数构造器和原型研究
    javascript对象定义需开辟内存空间才能访问
    读取iframe里面的js全局变量
    网络编程函数笔记(一)
    Inside.MySQL_InnoDB.Storage.Engine 学习笔记
    jquery对象原理笔记(一)
    javascript(一)正则表达式
    c++学习笔记(模板)(一)
  • 原文地址:https://www.cnblogs.com/haoliberale/p/8146053.html
Copyright © 2011-2022 走看看