文档章节

GDB调试的简单用法

卜星星
 卜星星
发布于 2015/02/12 17:08
字数 1048
阅读 1658
收藏 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
141
0
Linux下gdb用法简单介绍

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

晨曦之光
2012/03/02
5.1K
0
Python 脚本调试如何C代码--工程小札记

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

joshuaxx316
2017/04/25
0
0
新手看招:调试工具GDB基本知识全接触

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

范堡
2009/05/07
942
0
使用 gdb 工具调试 Go

排除应用程序故障是比较复杂的,特别是处理像 Go 这样的高并发语言。它更容易在具体位置使用 print 打印语句来确定程序状态,但是这个方法很难根据条件发展去动态响应你的代码。 调试器提供了...

oschina
2015/08/07
6.7K
8

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
7
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
7
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
4
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部