什么是GDB:

GDB应用:

静态分析工具与动态分析工具:

GDB启动方式:

GDB启动之后会有一个交互式的命令行,可以输入GDB特定的命令让GDB去工作。

gdb test.out意思是这一次gdb启动关注的是test.out这个进程。

gdb test.out core意思是程序崩溃时产生core文件。

动态连接:

gdb test.out pid意思是gdb去跟踪test.out这个程序文件对应的进程号为pid的进程。

应用示例一:

应用示例二:

实验:

test.c程序如下:

 #include <stdio.h>
#include <unistd.h> extern int* g_pointer;
extern void func(); void test_1()
{
printf("test_1() : %p\n", test_1);
} void test_2()
{
printf("test_2() : %p\n", test_2);
} void test_3()
{
printf("test_3() : %p\n", test_3);
} int main(int argc, char *argv[])
{
typedef void(TFunc)();
TFunc* fa[] = {test_1, test_2, test_3};
int i = ; printf("main() : begin...\n"); for(i=; i<argc; i++)
{
printf("argv[%d] = %s\n", i, argv[i]);
} for(i=; i<; i++)
{
fa[i%]();
sleep(argc > );
} printf("g_pointer = %p\n", g_pointer); func(); printf("main() : end...\n"); return ;
}

func.c如下:

 #include <stdio.h>

 int* g_pointer;

 void func()
{
*g_pointer = (int)"D.T.Software"; return;
}

test程序直接运行会产生段错误:

如果想使用gdb调试,那么程序编译时需要带上调试信息,即:

gcc  -g  test.c func.c -o test.out

然后使用命令 ulimit  -c unlimited,这条命令的意思就是在程序崩溃的时候产生core文件。

再次运行程序结果如下:

可以看到产生了core文件。

下一步就可以借助gdb进行调试了。

可以看到gdb给我们指出了问题,在func.c的第七行。

g_pointer是指向0地址处的。

单独运行gdb并载入test.out:

输入run,结果如下:

gdb会动态的跟踪进程的执行,发现向0地址写东西会立即告诉我们。

再次进行如下的实验:

ctrl+c可以让test.out进程暂停,如果想继续执行,敲入continue:

gdb动态连接的实验:

先启动test.out进程:

在另一个中端里面使用ps  aux查看进程号,然后跟踪这个进程:

attach到test.out进程后,这个进程就暂停执行了。

敲入continue继续执行:

执行到最后结果如下:

gdb断点调试:

软件断点只对加载到内存中执行的程序有效。

在flash中执行的程序只能打硬件断点。

break设置的断点总是有效的,tbreak设置的断点只有一次有效。

断点相关操作:

delete删除断点可以指定断点的号,1,2,n都是短点号。

硬件断点应用:

实验:

run命令启动程序后继续向下执行,start启动程序后立即暂停:

可以看到start启动后自动设置了一个临时断点。停止在了main函数的入口处。

打断点:

next会执行下一条指令。

我们不可能用next一直执行下去,需要有其他的手段。

打印一下i的值:

$1、$2代表第一次打印和第二次打印。

我们将i的值设置为了100,再次执行next:

可以看到执行了两次next之后程序到了第41行。

设置一个一次性断点,并继续执行:

程序到了第43行,但是还没有调用func函数。

我们可以通过命令跳过第43行func函数的执行:

跳过func函数,程序没有崩溃,这说明我们之前的程序崩溃发生在func函数中。

在进行第二次调试:

程序到了第25行,我们通过tbreak打一个断点,通过函数名字打断点,然后continue继续执行:

程序停下来了,停在了func函数的第7行:

在第一次调试时,我们确定了是func函数出现了问题,为了确认就是func函数内部出了问题,现在我们通过return强制func函数返回:

返回后继续执行:

启动第三次调试:

当前系统只支持一个硬件断点。

打硬件断点,并继续执行:

程序停在了func的第七行:

打印并设置g_pointer的值:

敲continue继续执行:

可以看到程序正常结束了,没有产生崩溃。

小结:

调试利器GDB(上)的更多相关文章

  1. linux-c/c++调试利器gdb、ddd小试

    linux-c/c++调试利器gdb.ddd小试 原文链接: http://deepfuture.iteye.com/blog/749148 博客分类: C++/C/lisp CC++C#LinuxU ...

  2. 调试利器GDB(下)

    本节我们研究gdb更深层的用法: 数据断点: 可以根据变量的值来监视变量. 数据断点本质是硬件断点,数量有限. watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变 ...

  3. Linux C++调试利器-gdb

    在Linux上开发后台C++程序时,没有类似Windows VisualStudio那样强大的可视化IDE.为了提高调试效率,快速定位问题,需要掌握gdb工具的一些基本用法. 添加调试符号信息  co ...

  4. linux 调试利器gdb, strace, pstack, pstree, lsof

    1) 如何使用strace+pstack利器分析程序性能? http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html 此文有详细 ...

  5. gdb 调试利器

    1. gdb 调试利器 GDB是一个由GNU开源组织公布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.对于一名Linux下工作的c++程序猿,gdb是不可缺少的工具: 1 ...

  6. Windows GUI代码与Windows消息问题调试利器

    Windows GUI代码与Windows消息问题调试利器 记得很久前有这么一种说法: 人类区别于动物的标准就是工具的使用.同样在软件开发这个行业里面,对于工具的使用也是高手和入门级选手的主要区别,高 ...

  7. 理解WebKit和Chromium: 调试Android系统上的Chromium

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...

  8. [转] linux下的c/c++调试器gdb

    PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...

  9. 应用调试(二)GDB

    title: 应用调试(二)GDBdate: 2019/1/17 21:00:10 toc: true 应用调试(二)GDB gdb下载工具安装交叉工具链设置GDB介绍编译GDBtarget/host ...

随机推荐

  1. Loadrunner11中webservice协议脚本总结

    Loadrunner11中webservice协议脚本总结 简介     webservices协议是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接,其中最基 ...

  2. linux上docker安装centos7.2

    1.安装 docker pull centos:7.2.1511 2.启动镜像 docker run -d -i -t <IMAGE ID> /bin/bash 3.进入容器 docker ...

  3. linux 常用指令

    w 指令可以看到目前接入到服务器的用户(终端)history xx 可以查看本用户(本终端)最后执行的xx条指令last 指令可以查看登录的日志grep "str" filName ...

  4. JAVA写接口傻瓜($)教程(三)

    接上一篇 补充:事实上java的类需要在src文件夹里写,classes文件夹只是会同步src文件夹里的类.如果在classes文件夹里操作java类,是会提示文件只读的.src文件夹中进行代码编写 ...

  5. MHA实现MySQL的高可用

    一:软件简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件. 在 ...

  6. 【lintcode】 二分法总结 I

     二分法:通过O(1)的时间,把规模为n的问题变为n/2.T(n) = T(n/2) + O(1) = O(logn). 基本操作:把长度为n的数组,分成前区间和后区间.设置start和end下标.i ...

  7. 浏览器如何对HTML5的离线储存资源进行管理和加载

    在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储.如果已经访 ...

  8. 卡方分布(Chi-Square Distribution):

    定义:如果我们的随机变量是标准正态分布(详见以前博客的高斯分布),那么多个随机变量的平方和服从的分布即为卡方分布. X=Y12+Y22+⋯+Yn2 其中,Y1,Y2,⋯,Yn均为服从标准正态分布的随机 ...

  9. SQL Join 与 In的效率

    今天在优化朋友的一个系统, 主要他们前期是叫人外包写的, 越来越慢, 导出订单明细时, 基本都是TimeOut, 我查看到这里面是这样写: select * from Orders where ID ...

  10. python-并发初学

    一.操作系统简单介绍 1.多道技术:(重点)系统内可同时容纳多个作业.这些作业放在外存中,组成一个后备队列,系统按一定的调度原则每次从后备作业队列中选取一个或多个作业进入内存运行,运行作业结束.退出运 ...