• Linux gdb调试入门


      没有使用过gdb调试过程序的觉得gdb是个很神奇的东东,如果你使用它调试一次保证你想忘记它都难,下面看看它的庐山真面目吧!

    GDB概述

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

    一般来说,GDB主要帮忙你完成下面四个方面的功能:

        1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
        2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
        3、当程序被停住时,可以检查此时你的程序中所发生的事。
        4、动态的改变你程序的执行环境。

    从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。

    #include<iostream>
    using namespace std;
    int sum(int arg1,int arg2)
    {
            return arg1+arg2;
    }
    int main()
    {
            int a=1;
            int b=2;
            cout<<"sum = "<<sum(a,b)<<endl;
            return 0;
    
    }
    

    第一步:编译

    [root@localhost CppProject]# g++ -g sum.cpp -o sum

    查看下文件

    第二步:使用gdb设置断点调试

    [root@localhost CppProject]# gdb sum

    (gdb) l
    1       #include<iostream>
    2       using namespace std;
    3       int sum(int arg1,int arg2)
    4       {
    5               return arg1+arg2;
    6       }
    7       int main()
    8       {
    9               int a=1;
    10              int b=2;
    (gdb) 
    11              cout<<"sum = "<<sum(a,b)<<endl;
    12              return 0;
    13
    14      }
    (gdb) 
    

    在第11行设置断点

    (gdb) break 11
    Breakpoint 1 at 0x8048742: file sum.cpp, line 11.

    直接在函数名处设置断点

    (gdb) break sum
    Breakpoint 2 at 0x80486a7: file sum.cpp, line 5.

    查看已设置断点信息

    (gdb) info break
    Num Type Disp Enb Address What
    1 breakpoint keep y 0x08048742 in main at sum.cpp:11
    2 breakpoint keep y 0x080486a7 in sum(int, int) at sum.cpp:5

    运行:

    (gdb) run
    Starting program: /root/CppProject/sum

    Breakpoint 1, main () at sum.cpp:11
    11 cout<<"sum = "<<sum(a,b)<<endl;

    查看代码:

    (gdb)

    (gdb) l
    1       #include<iostream>
    2       using namespace std;
    3       int sum(int arg1,int arg2)
    4       {
    5               return arg1+arg2;
    6       }
    7       int main()
    8       {
    9               int a=1;
    10              int b=2;
    (gdb) 
    11              cout<<"sum = "<<sum(a,b)<<endl;
    12              return 0;
    13
    14      }
    (gdb) 

    (gdb) n表示next单步进行

    Breakpoint 1, main () at sum.cpp:11
    11 cout<<"sum = "<<sum(a,b)<<endl;
    (gdb) n
    sum = 3
    12 return 0;
    (gdb)

    gdb下查看变量的值:p 变量名

    (gdb) p a
    $1 = 1
    (gdb) p b
    $2 = 2

    查看函数内存地址:

    (gdb) p sum
    $3 = {int (int, int)} 0x80486a4 <sum(int, int)>
    (gdb) p sum(a,b)
    $4 = 3

    调用函数
    (gdb) p sum(100,200)
    $5 = 300
    断点调试就这么多了,有兴趣的可以学习设置观察点,捕捉点调试。

  • 相关阅读:
    [项目管理]如何写好项目验收材料
    [英语学习]英语高级口译证书考试 备查
    A1042 Shuffling Machine洗牌机器
    B1018锤子剪刀布
    B1012数字分类
    B1008数组元素循环右移问题
    B1046划拳
    B1026 程序运行时间
    B1016部分A+B
    B1011A+B和C
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang0519.html
Copyright © 2020-2023  润新知