zoukankan      html  css  js  c++  java
  • Linux gdb调试

    Linux gdb调试

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

    GDB概述

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    (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) l 

    复制代码
    (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)psum(a,b)3=int(int,int)0x80486a4<sum(int,int)>(gdb)psum(a,b)4 = 3

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

  • 相关阅读:
    Code Forces Gym 100886J Sockets(二分)
    CSU 1092 Barricade
    CodeChef Mahesh and his lost array
    CodeChef Gcd Queries
    CodeChef GCD2
    CodeChef Sereja and LCM(矩阵快速幂)
    CodeChef Sereja and GCD
    CodeChef Little Elephant and Balance
    CodeChef Count Substrings
    hdu 4001 To Miss Our Children Time( sort + DP )
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5509702.html
Copyright © 2011-2022 走看看