文档章节

GDB调试的简单用法

卜星星
 卜星星
发布于 2015/02/12 17:08
字数 1048
阅读 1652
收藏 0
点赞 0
评论 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就可以了,

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

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

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

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

永远不是好办法。






© 著作权归作者所有

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

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

长平狐 ⋅ 2013/01/06 ⋅ 0

Linux下gdb用法简单介绍

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

晨曦之光 ⋅ 2012/03/02 ⋅ 0

新手看招:调试工具GDB基本知识全接触

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

范堡 ⋅ 2009/05/07 ⋅ 0

Python 脚本调试如何C代码--工程小札记

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

joshuaxx316 ⋅ 2017/04/25 ⋅ 0

iOS内核调试教程

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

嘶吼RoarTalk ⋅ 01/10 ⋅ 0

使用 GDB 调试多进程程序

GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较。 GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统...

长平狐 ⋅ 2012/09/03 ⋅ 0

Linux基础 30分钟GDB调试快速突破

引言 Linus心灵鸡汤   在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds   Unix 始于上个世纪60年代,在70年代得到了迅猛的发...

xumaojun ⋅ 04/23 ⋅ 0

使用 GDB 调试多进程程序

转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/ GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考...

长平狐 ⋅ 2013/01/11 ⋅ 0

Vimgdb调试器使用说明

![VimGDB调试窗口][1] 打开vim执行下列命令,生成帮助文档: :helptags ~/.vim/doc 运行vim,按下F7键后左下角会有gdb keys mapped的字样,提示您已打开vimgdb的键映射,正常编辑时可再次按F...

inkling ⋅ 2013/04/29 ⋅ 1

GDB中的常用命令

转载于博客:http://blog.csdn.net/liigo/article/details/582231,如有侵权,请告知删除。 命令 解释 示例 file 加载被调试的可执行程序文件。 因为一般都在被调试程序所在目录下执行GDB,因...

oqqHuTu12345678 ⋅ 2017/12/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

阿里云云栖社区 ⋅ 13分钟前 ⋅ 0

Ubuntu部署django问题汇总

使用Anaconda3的Python3.6的pip安装UWSGI报错 原因是gcc版本不兼容,安装4.7并修改gccsudo apt-get install gcc-4.7sudo mv /usr/bin/gcc /usr/bin/gcc.baksudo ln -s /usr/bin/gcc-4.......

wuyaSama ⋅ 16分钟前 ⋅ 0

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

猫耳m ⋅ 16分钟前 ⋅ 0

Docker减肥小记

如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察 如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无用的镜像、容器、网络和数据卷… 1、查看...

寰宇01 ⋅ 27分钟前 ⋅ 0

微信小程序中如何使用WebSocket实现长连接(含完整源码)

本文由腾讯云技术团队原创,感谢作者的分享。 1、前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架、组件以及 API,在这个平台上面的想象空间很大。腾讯云研究了一...

JackJiang- ⋅ 35分钟前 ⋅ 0

定制库到Maven本地资源库

1.如果只有定制库的JAR文件 下载链接如下:pdf.jar 2.使用命令转换成Maven本地资源 mvn install:install-file -Dfile=/Users/manager/Downloads/clj-pdf-2.2.33.jar -DgroupId=clj-pdf -Dar......

年少爱追梦 ⋅ 39分钟前 ⋅ 0

高仿springmvc之xuchen-mvc

package org.mvc.framework.servlet; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.......

徐志 ⋅ 41分钟前 ⋅ 0

关于自定义URLStreamHandler的一次踩坑

关于自定义URLStreamHandler的一次踩坑 20180625 lambo init 说明 一般自定义实现url的协议解析.方案为实现URLStreamHandler.实现其 openConnection 就可以了, 如果我们执行 new URL("xx://...

林小宝 ⋅ 42分钟前 ⋅ 0

【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书

演示证书文件 链接: https://pan.baidu.com/s/1ijHNnMQJj7jzW-jXEVd6Gg 密码: vfva 所需jar包 <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependenc......

小帅帅丶 ⋅ 43分钟前 ⋅ 0

用Calendar 实现 计算 一段时间的毫秒值

Calendar c=Calendar.getInstance();c.add(Calendar.MONTH, -1);int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH)......

岸芷汀兰 ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部