Linux gdb调试入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
断点调试就这么多了,有兴趣的可以学习设置观察点,捕捉点调试。

 

以上是关于Linux gdb调试入门的主要内容,如果未能解决你的问题,请参考以下文章

『Linux从入门到精通』第 ⑪ 期 - Linux调试器——gdb使用详解

闭关学pwn番外——入门gdb

代码调试篇:gdb调试快速入门指南

gdb入门

GNU开发工具——GDB快速入门

linux禁止gdb调试