文档章节

GDB调试的简单用法

卜星星
 卜星星
发布于 2015/02/12 17:08
字数 1048
阅读 1656
收藏 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
海淀
程序员
私信 提问
新手看招:调试工具GDB基本知识全接触

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

范堡
2009/05/07
916
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
Python 脚本调试如何C代码--工程小札记

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

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

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

嘶吼RoarTalk
01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在ubuntu下选择crontab计划任务的编辑器

在ubuntu下,首次编辑crontab计划任务的时候,会提示让选择编辑器。由于对nano编辑器不是很熟悉,若是选择nova编辑的话,会有些麻烦。 可以重置编辑器,方法如下: [root@wang ~]# select-...

季书歌
35分钟前
4
0
在线BASE64加密解密、UrlEncode编码/解码、native/ascii在线转换工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
35分钟前
1
0
laravel命令

https://blog.csdn.net/aaroun/article/details/79140618

vio小黑
36分钟前
3
0
记录一个vue directive实现点击指令外部区域调用函数的方案

根据directive提供的API来写一个点击外部区域可以让其下拉列表消失的菜单 <div id="app" v-clock> <div class="main" v-clickoutside="handleClose"> <button @click="show = !show">点......

呵呵闯
40分钟前
3
0
Oracle一列的多行数据拼成一行显示字符

Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数。 先介绍:WMSYS.WM_CONCAT 例: id name 1 aa 2 bb 3 cc 要的结果是"aa,bb,cc" select WMSYS...

voole
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部