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

段错误的段错误的常见形式

发布网友 发布时间:2022-04-08 09:56

我来回答

2个回答

懂视网 时间:2022-04-08 14:17

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!

通过gdb快速定位“段错误”的位置

标签:linux   gdb   

热心网友 时间:2022-04-08 11:25

在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。
1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址。
2)内存越界(数组越界,变量类型不一致等): 访问到不属于你的内存区域。
解决方法:我们在用C/C++语言写程序的时候,内存管理的绝大部分工作都是需要我们来做的。实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就段错误这个内存访问越界的错误谈谈如何快速定位这些段错误的语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法: 1 mmy_function (void)
2 {
3 unsigned char *ptr = 0x00;
4 *ptr = 0x00;
5 }
6
7 int main (void)
8 {
9 mmy_function ();
10
11 return 0;
12 } 作为一个熟练的C/C++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。我们尝试编译运行它: xiaosuo@gentux test $ ./a.out
段错误 出错并退出。 这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上“-g -rdynamic的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下: xiaosuo@gentux test $ gcc -g -rdynamic d.c
xiaosuo@gentux test $ gdb ./a.out
GNU gdb 6.5
Copyright (C) 2006 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...Using host libthread_db library /lib/libthread
(gdb) r
Starting program: /home/xiaosuo/test/a.out
Program received signal SIGSEGV, Segmentation fault.
0x08048524 in mmy_function () at d.c:4
4 *ptr = 0x00;
(gdb) 不用一步步调试我们就找到了出错位置d.c文件的第4行,其实就是如此的简单。
从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man 7 signal),我们知道SIGSEGV默认handler的动作是打印”段错误的出错信息,并产生Core文件,由此我们又产生了方法二。 The default action of certain signals is to cause a process to terminate and proce a core mp file, a disk file containing an image of the process's memory at the time of termination. A list of the signals which cause a process to mp core can be found in signal(7). 以 上资料摘自man page(man 5 core)。不过奇怪了,我的系统上并没有找到core文件。后来,忆起为了渐少系统上的垃圾文件的数量,禁止了core文件的生成,查看了以下果真如此,将系统的core文件的大小*在512K大小,再试: xiaosuo@gentux test $ ulimit -c
0
xiaosuo@gentux test $ ulimit -c 1000
xiaosuo@gentux test $ ulimit -c
1000
xiaosuo@gentux test $ ./a.out
段错误 (core mped)
xiaosuo@gentux test $ ls
a.out core d.c f.c g.c pango.c test_iconv.c test_regex.c core文件终于产生了,用gdb调试一下看看吧: xiaosuo@gentux test $ gdb ./a.out core
GNU gdb 6.5
Copyright (C) 2006 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...Using host libthread_db library /lib/libthread.
warning: Can't read pathname for load map: 输入/输出错误。
Reading symbols from /lib/lib6...done.
Loaded symbols for /lib/li6
Reading symbols from /lib/ld-.2...done.
Loaded symbols for /lib/ld-linux.s2
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048524 in mmy_function () at d.c:4
4 *ptr = 0x00;dfg #include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
/* A mmy function to make the backtrace more interesting. */
void
mmy_function (void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
void mp(int signo)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf (Obtained %zd stack frames.\n, size);
for (i = 0; i < size; i++)
printf (%s\n, strings[i]);
free (strings);
exit(0);
}
int
main (void)
{
signal(SIGSEGV, &mp);
mmy_function ();
return 0;
}
运行结果:xiaosuo@gentux test $ gcc -g -rdynamic g.c
xiaosuo@gentux test $ ./a.out
Obtained 5 stack frames.
./a.out(mp+0x19) [0x80486c2]
[0xffffe420]
./a.out(main+0x35) [0x804876f]

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
把身份证和3000元给教练了,同时他也带我去体检入指纹了!之后没给我 从中国农业大学东校区到北京植物园 有没有人看过小石头小豆子版的&lt;&lt;霸王别姬&gt;&gt;? 我买的iphone4s显示可能是官翻机是不是正品行货? 怎样能看出我新买的iPhone 4S的真伪、。还有我想知道这款手机有没有被... 水货iphone4s想知道是不是假的我看分辨率不像假的但还是不确定哪位好心... 请帮鉴定下这部iphone 4S是真的不? 前段时间老公跟别人发过520.5920.我怀疑老公出轨对我不忠,这么长时间过 ... ...下是不是翻新机,谢谢了。型号md239ch 序例号c3kj920mdtd2 imei... ...给教练帮我报名了因家里情况现在不想去了该怎么办呢?我身份证... OPPOR17手机号怎么存储到SIM卡里 怎么在iphone手机上存号码 买的炉石 有送身份证 但密码改了 忘了 怎么办 手机号不是自己的 炉石传说如何用身份证快速找回 苹果手机怎么把手机号存到卡上 炉石传说创建账号没有身份证怎么办 oppoa37怎么设置把手机号直接存到手机卡里,不是电话里 炉石传说只有身份证号能申诉账号么 炉石传说我的帐号绑定的身份证是在网上找的,当时验证成功了,也是成年的,但是,后来玩着玩着就发现不得 儿童智能手表怎样才能退出微聊群 炉石传说忘记安全问题了,以及身份证号码忘记了怎么办 苹果7p如何把通讯录导入sim卡 炉石传说。(修改账号修改密码这类的)忘了是干啥的时候需要身份证的 京东钱包转钱出显示无法连接服务器怎么回事? 炉石传说怎么用身份证改密码 Z6怎么撤销微聊信息 京东钱包无法充值,已实名认证 炉石传说号被全部改绑,除了身份证和邮箱? 京东钱包怎么用,苹果手机打不开 炉石传说忘记注册用的身份证怎么办 oppoA77存新手机号怎么存手机卡上 快递丢了可以打12315投诉吗 件丢了怎么投诉快递公司 俗称小V的可能是什么车啊? 快递丢了怎么投诉最有效 快递丢失如何维权。请懂的人给我意见 标识为一个圆圈,下面一个倒写的v的轿车是什么品牌?价格多少? 百世快递把我的物品给弄丢了我要怎么维权 诚信物流给我把货搞丢了怎么投诉? 物流把急用的货弄丢了态度还特别恶劣怎么投诉? v形标志是什么车 运满满司机拉货货搞丢了怎么投诉 泸定下高速核酸报告多少小时失效? 核酸检测久出结果?结果有效期几天? 核酸检测八天后才拿到结果,是不是过期? THK KX90834花键参数 花键轴都有哪些种类类型? 渐开线花键都有哪些参数? 花键轴齿数如何选择?? 谁有英雄联盟主播卡尔听的战歌列表,可以告诉我吗