文档章节

GDB调试的简单用法

卜星星
 卜星星
发布于 2015/02/12 17:08
字数 1048
阅读 1653
收藏 0

        好久不用GDB,一直写的是跨平台的,用vs调试了,最近又转到linux下,那天使了一下GDB,擦,忘了怎么用了。

先说第一点:使用GDB之前,程序编译最好加上-g选项,这样方便GDB调试。

一般小错误就是段错误,也就是内存的错误,这种错误,我直接就是使用gdb运行程序,自己就会停到段错误处,

然后使用bt命令,看看栈的情况,是停在哪个调用上了,使用frame切换这些栈帧,来看相应的栈上的变量的值之类的。

test.cpp

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
using namespace std;
struct xx {
    int a;
    int b;
    int c;
};
int main(int argc, char *argv[])
{
    for (int i = 0; i < 5; i ++)
        xx *x = new xx;
    xx *p = (xx *)malloc(sizeof(xx));
    char *pp;
    int *parray = (int *)malloc(10 * sizeof(int));
    parray[9] = 1;
    pid_t pid = fork();
    int array[10];
    array[10] = 1;
    memcpy(pp, p, 10);
    return 0;
}

这都是瞎写的,本来是学valgrind用的,现在加了一句来写一下,这个编译

g++ test.cpp -Wall -g

然后使用gdb ./a.out来执行

进入了gdb里面是这样的:

Traceback (most recent call last):
  File "<string>", line 35, in <module>
  File "/usr/local/share/gdb/python/gdb/__init__.py", line 19, in <module>
    import _gdb
ImportError: No module named _gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<>...
Reading symbols from /home/xx/test/a.out...done.
(gdb)

然后输入:r

运行起来就会直接到错的地方停住了,看下面:

(gdb) r
Starting program: /home/xx/test/a.out 
Detaching after fork from child process 7034.
Program received signal SIGSEGV, Segmentation fault.
0x000000358648983e in memcpy () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.x86_64 libgcc-4.4.7-3.el6.x86_64 libstdc++-4.4.7-3.el6.x86_64
(gdb)

这里Segmentation fault就是段错误,内存使用问题,主要看下面一句:

0x000000358648983e in memcpy () from /lib64/libc.so.6

这说明是memcpy错了,哪的呢?

现在打bt,看下面:

(gdb) bt
#0  0x000000358648983e in memcpy () from /lib64/libc.so.6
#1  0x000000000040081a in main (argc=1, argv=0x7fffffffe208) at test.cpp:30
(gdb)

这里显示的是main函数里面,也就是test.cpp第30行调用了memcpy,这就直接定位到错的地方了,看看怎么错了吧。

使用frame 1,切换到main函数的栈上。

(gdb) frame 1
#1  0x000000000040081a in main (argc=1, argv=0x7fffffffe208) at test.cpp:30
30     memcpy(pp, p, 10);
(gdb)

到了这里,他们传给memcpy的参数有没有问题,

那么就用p来显示相应的变量值,这个p是命令啊,不是memcpy里的变量,后面加变量名,看下面:

(gdb) p pp
$1 = 0x0
(gdb) p p
$2 = (xx *) 0x1
(gdb)

这里就看到了,pp的值是0,说明根本没有分配空间存东西,你硬往里存,就错了。

看到这就回去改代码去,执行quit退出gdb

(gdb) quit
A debugging session is active.
 Inferior 1 [process 7031] will be killed.
Quit anyway? (y or n) [answered Y; input not from terminal]

完事了,当然这是最最简单的使用,因为程序也是最最简单的程序,深入使用还需要更进一步学习,

比如多进程、多线程调试等,我下了一个GDB手册在官网上,打算好好学习一下,并且边学边记录。

这是官网:http://www.sourceware.org/gdb/ 在这下手册和最新版本的gdb就可以了,

我鄙视现在所有存各种文档的地方,下载还要积分,原本人家的软件都是免费给大家用的,你把一个中文手册还要个积分,

真心。。。。。。,现在不论代码,还是文档,太多网站了,很乱,好像竞争很激烈的样子,大家也好像只能这样来

赚钱,其实我觉得是走入了中国互联网的怪圈。其实如果你一家做的好,不需要什么下载券之类或者积分之类的东西,

好好管理,分类明确点,资源多点,大家都用你的,你根本就不会缺钱,用户多,流量多就是钱,钱从用户身上出,

永远不是好办法。






© 著作权归作者所有

共有 人打赏支持
卜星星
粉丝 27
博文 111
码字总数 68736
作品 0
海淀
程序员
Linux下gdb用法简单介绍

GDB是GNU开源组织发布的一个强大的UNIX下调试程序工具。或许各位比较喜欢那种图形界面方式的,像VC,BCB等IDE的调试,但如果你是在UNIX平台下作软件,你会发现GDB这个调试工具有比VC,BCB的图...

长平狐
2013/01/06
111
0
Linux下gdb用法简单介绍

GDB是GNU开源组织发布的一个强大的UNIX下调试程序工具。或许各位比较喜欢那种图形界面方式的,像VC,BCB等IDE的调试,但如果你是在UNIX平台下作软件,你会发现GDB这个调试工具有比VC,BCB的图...

晨曦之光
2012/03/02
572
0
新手看招:调试工具GDB基本知识全接触

GDB(GNU symbolic debugger)简单地说就是一个调试工具。它是一个受通用公共许可证即GPL保护的自由软件。 2、GDB特性 象所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地...

范堡
2009/05/07
916
0
Python 脚本调试如何C代码--工程小札记

有的时候我们写了一个C语言下的库文件,或者载入一个动态调用库文件,在python脚本里,可以通过一定得接口实现python程序内部嵌入C接口。 当程序遇到问题,需要调试的时候,如何通过脚本进入...

joshuaxx316
2017/04/25
0
0
iOS内核调试教程

        由于iOS内核是一个非常复杂的系统,所以必须要使用调试器才能很方便地进行调试,这样,你就可以很轻松地分步执行代码,设置断点,读取和写入内存和寄存器。鉴于调试器的便利性...

嘶吼RoarTalk
01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis应用之分布式锁(set)

Redis应用之分布式锁(set) 在单机应用的场景下,我们常使用的锁主要是synchronized与Lock;但是在分布式横行的大环境下,显然仅仅这两种锁已经无法满足我们的需求; 需求:秒杀场景下,有若干...

GMarshal
20分钟前
0
0
python实现简单的文件加密与解密

对于任意的一个文件,本质上来讲都是二进制的。 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m; 如果再讲上面得到的e用m进行...

Aomo
21分钟前
0
0
Android开发应用程序生成以太坊钱包

Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚: 1.在app/build.gradle中集成以下依赖项: compile ('org.web3j:core-android:2.2.1') web3j核心是...

geek12345
37分钟前
0
0
ArrayList嘿嘿嘿

数组扩容技术: //扩容技术 将原数组objs类容复制到新数组并且长度为11 Object[] newObjs = Arrays.copyOf(objs,11); 数组比较大那么System.arraycopy比较有优势,因为其使用的是内存复制,省...

熊猫你好
今天
2
0
Android平台下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

python版的sxtwl_cpp传送入口 在build.gradle的allprojects中加入 maven { url 'https://dl.bintray.com/yuangu/sxtwl' } 最终如下面代码所示: allprojects { repositories { ......

元谷
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部