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
    断点调试就这么多了,有兴趣的可以学习设置观察点,捕捉点调试。

  • 相关阅读:
    fetch
    创建Vue实例传入的option
    Text and Binary modes
    daemon_int
    http 协议 c++代码 获取网页
    asp.net mvc 5 初体验
    win32 音视频相关 api
    setuid和seteuid
    用0x077CB531计算末尾0的个数
    webservice gsoap 小记
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5509702.html
Copyright © 2011-2022 走看看