没有使用过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) l

(gdb) l
#include<iostream>
using namespace std;
int sum(int arg1,int arg2)
{
return arg1+arg2;
}
int main()
{
int a=;
int b=;
(gdb)
cout<<"sum = "<<sum(a,b)<<endl;
return ; }
(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
断点调试就这么多了,有兴趣的可以学习设置观察点,捕捉点调试。

最新文章

  1. 当Eclipse报版本低时的处理方法
  2. 实现从Oracle增量同步数据到GreenPlum
  3. linux系统的初化始配置(包括网络,主机名,关闭firewalld与selinux)
  4. hackerrank Similar Pair
  5. How to setup SVN?
  6. QT-【转】Qt 4迁移至Qt 5
  7. Networking - IPv4 报文格式
  8. idea中自动生成实体类
  9. 转载:dos批处理中路径获取
  10. spring cloud + spring boot + springmvc+mybatis分布式微服务云架构
  11. FTP--FileZilla-主动模式和被动模式
  12. 文件上传漏洞靶场:upload-labs安装及第一关教程
  13. Min_25筛学习笔记
  14. [转] Async/Await替代Promise的6个理由
  15. shell_mysql_ alias 快速启动
  16. 机器学习初入门02 - Pandas的基本操作
  17. 用yum下载rpm包(不安装)到制定目录
  18. JAVA 从头开始&lt;四&gt;
  19. 思维导图(JavaScript基础)——温习一下下
  20. css之背景(background)家族

热门文章

  1. vs开发常用快捷键
  2. 网页CSS2
  3. 类库dll引用不成功问题
  4. centos上如何安装mysql
  5. root用户安装的软件在普通用户不生效
  6. ORACLE的order by中文排序
  7. 学习在创建好的工程里面添加CoreData
  8. C++ list用法
  9. Java系列--第七篇 基于Maven的Android开发实战项目
  10. 安装spark1.3.1单机环境