GDB调试的简单用法
GDB调试的简单用法
卜星星 发表于3年前
GDB调试的简单用法
  • 发表于 3年前
  • 阅读 1645
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: GDB调试的简单用法

        好久不用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就可以了,

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

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

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

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

永远不是好办法。






共有 人打赏支持
粉丝 23
博文 110
码字总数 68736
×
卜星星
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: