问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用gdb调试,报这个异常什么意思

发布网友 发布时间:2022-04-07 21:37

我来回答

2个回答

懂视网 时间:2022-04-08 01:58


使用gdb调试C++程序时,感觉不按流程执行,跳来跳去的解决办法

标签:

热心网友 时间:2022-04-07 23:06

我们打算使用gdb去解决为什么下面的程序(文件为segfault.c)引起了段错误的问题。下面的这段程序是从用户那里读入一行文本字串然后显示在屏幕上。然而,如下当前的程序并不会如期执行...

[cpp] view plaincopyprint?
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
char *buf;

buf = malloc(1<<31);

fgets(buf, 1024, stdin);
printf("%s\n", buf);

return 1;
}</span>

第一步是使用带有调试标志(debugging flags)的方式编译这段代码,如下:

~# gcc -g segfault.c

然后运行:

~# a.out

Hello World!

Segmentation fault

这并不是我们所期待的。是时候启动强大的gdb了。

~# gdb a.out
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
(gdb)

我们直接运行就来看看到底发生了什么:

(gdb) run
Starting program: /home/dgawd/cpsc/363/a.out
test string

Program received signal SIGSEGV, Segmentation fault.
0x4007fc13 in _IO_getline_info () from /lib/libc.so.6

我们收到了来自操作系统的SIGSEGV信号。这就意味着我们试图去访问一段非法的内存,让我们试试backtrace(= bt)命令:

(gdb) backtrace
#0 0x4007fc13 in _IO_getline_info () from /lib/libc.so.6
#1 0x4007fb6c in _IO_getline () from /lib/libc.so.6
#2 0x4007ef51 in fgets () from /lib/libc.so.6
#3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10
#4 0x40037f5c in __libc_start_main () from /lib/libc.so.6

这里我们只关心我们自己的代码,因此我们就切换到3号堆栈帧(stack frame3)来看看程序在哪里崩溃的:

(gdb) frame 3
#3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10
10 fgets(buf, 1024, stdin)

哦,原来是调用fgets引起的崩溃。一般的,我们都假设库函数比如fgets都可以正确地工作(如果不是这样的话,我们的麻烦就大了)。因此这个问题的原因就一定是其中我们的一个参数的问题。你也许不知道‘stdin’是一个全局的变量,它是被stdio 库创建的。因此我们假定这个参数是正确的。那么剩下的就只能是‘buf’了,然后查看buf当前的值:

(gdb) print buf
$1 = 0x0
buf的值是0x0,也就是NULL指针。这并不是我们锁期待的 —— buf应该指向第8行代码分配到的内存。因此我们需要返回到第8行并看看在哪里发生了什么。首先kill掉我们程序当前运行的调用:

(gdb) kill
Kill the program being debugged? (y or n) y
(注意:不用使用quit直接退出gdb,这样比较麻烦。直接kill掉当前的程序调用即可)

然后在第8行设置一个断点:

(gdb) break segfault.c:8
Breakpoint 1 at 0x8048486: file segfault.c, line 8.

再次运行程序:

(gdb) run
Starting program: /home/dgawd/cpsc/363/a.out

Breakpoint 1, main (argc=1, argv=0xbffffaf4) at segfault.c:8
8 buf = malloc(1<<31);

我们检查malloc调用前后buf值的变化。初始化buf以前,其值应该是一个随机杂乱值(garbage),就像这里的:

(gdb) print buf
$2 = 0xbffffaa8 "鳃?\177\003@t`\001@\001"

我们step over(单步执行)malloc调用然后再次检查buf的值:

(gdb) next
10 fgets(buf, 1024, stdin);
(gdb) print buf
$3 = 0x0

可见调用了malloc之后,buf是NULL。如果你查看malloc的手册页(man page),你就会发现malloc在不能分配够所需的内存的时候就会返回NULL。因此确定是我们的malloc失败了。让我们返回到代码再次看看:

7 : buf = malloc(1<<31);
哦,表达式1<<31(整型1左移31次,原文错写为右移)是429497295, 或4GB (gigabytes).很少有机器会有这样的内存——大多数只有256MB(显然这篇文章有年头了,都什么年代了,这点内存操作系统估计启动一半就挂了)。因此malloc必然会失败。此外,在fgets中我们只读入1024字节。所有的额外空间都会白白浪费掉,尽管我们可以分配到。这里我们将1<<31改为1024(或者1<<9),这样程序就会按照我们的期望运行了:

~# a.out
Hello World!
Hello World!

这样你就可以知道怎样使用gdb来调试段错误了,这是非常有用的。这个例子同时也说明了一个非常重要的准则:总是检查malloc的返回值!拥有美好的一天(说实在,我让段错误恶心了一天。但以后就应该不太恶心了,以后每一天都美好吧 ^_^)。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不想让老婆看到我电脑里的一些东西怎么办? 桥好路由器停电后在来电老是获取lp 勒索病毒加密的文件如何恢复? TPU贴合膜多少钱 华为手机如何将输入法改为简体 肉丝炒金针菇做法 仓储冷链信息怎么申报 什么是药品冷链物流 浙江食品冷链运输多少钱 生物冷链具备什么资质 大学新生为什么不喜欢住宿舍一楼? 为什么现在的大学生不喜欢住宿舍一楼? 大学宿舍一般是什么样的? wacom的手绘板bamboo跟bamboo one 哪款比较好用? WACOM CTL472手绘板和HUION H430P哪个好用? 学生用哪款wacom数位板好一点? 画漫画啊什么的用WACOM的哪种好? wacom的新帝系列那个好用? wacom绘画板哪一款比较好用? 海信自动洗衣机怎么加水 海信洗衣机调好水位后为什么又会自动变更? 求一款WACOM数位板 适合初学者并且长期使用 质量出众!问下那个版本最好啊!!! Wacom哪个型号最好用呢? 专业画画,想买个数位板,wacom一千多块钱的哪个型号好用呀? 海信洗衣机水位怎么调 海信洗衣机的水位怎么调? 佳能ds126311怎么调自动对焦 佳能相机驱动问题。 佳能ds126621是单反相机吗 佳能mark二机身DS126561什么时候上市 大学的一个宿舍一般几个人? EXCEL 依次提取单元格中的数字?? 大学宿舍一个半夜不睡 这个表情“&#xF4AD;”为什么iPad里没有了? iPad怎么用 emoji 表情?详细步骤 ipad怎么用Emoji表情软件, 怎么安装,具体点. 国际键盘里面的我都试... IPAD下载了emoji表情软件怎麼使用 ipad miniQQ空间里转发说说时发的表情为什么没有emoji表情? 能不能装一个emoji表情啊?怎么弄?详细一点 ipad里“设置”-“国际键盘”里表情符号是emoji符号,这是原来自带?还是我曾经下载安装过emoji留下的? 这里面表情在哪里弄得 手机上看不了iPad发的表情包,怎么办? 红火蚁已传播至我国435个县市区,如何预防红火蚁的入侵? 充电宝的电池怎么连接的 充电宝电池连接图充电宝里的电池怎么接才能导出电 五节充电宝电池下三上二。怎么接,求图 传播至我国435个县市区的红火蚁叮咬可致人死亡,如何做好防范工作?_百 ... 20个18650电池做充电宝电池怎么接发才能不烧板最好有图? 充电宝内部电池如何连接,求图 oppo相册人物怎么添加 Nova6如何把照片添加到人物相册