ubuntu C 语言 段错误 (核心已转储)
2012-12-22 23:08
411 查看
一 般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指 向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的 表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了 越界访问,cpu就会产生相应的异常保护,于是segmentation
fault就出现了. 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的
1)访问系统数据区,尤其是往 系统保护的内存地址写数据 最常见就是给一个指针以0地址
2)内存越界(数组越界,变量类型不一致等
3) 访问到不属于你的内存区域
这是我程序
可以看到很明显的错误行,使用bt命令:
可以判断是stack出错了,用反汇编
百度一把,看了别人的方法判断,我的某个指针初始化,出现了野指针。把*p=NULL,就好了。
但是我还是不太明白,怎么发现。
早上起来接着调试,中午吃完午饭,看了gdb手册,有所发现,使用单步调试
可以看到到第二次循环时,len乱了,P指针也指向了0,这个在Linux是受保护的。错误完全定位了。
fault就出现了. 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的
1)访问系统数据区,尤其是往 系统保护的内存地址写数据 最常见就是给一个指针以0地址
2)内存越界(数组越界,变量类型不一致等
3) 访问到不属于你的内存区域
这是我程序
#include <stdio.h> #include <string.h> int main() { char s1[100]={0}; char s2[20]; char *p=NULL,cl;//如果此处*p为空,就会引起断错误 int i=0; int a=0,b=0,len=0,k; printf("input the string NO\n"); scanf("%i",&i); printf("the NO is %d\n",i ); k=i; for(;i>0;i--) { scanf("%s",s2); cl = getchar(); len = strlen(s1); printf("%d\n",len ); if(len!=0) { s1[len]=cl; s1[len+1]='\0'; } strcat(s1,s2); } printf("string input over\n" ); printf("%s\n",s1); for (;k>0;k--) { p=strchr(s1,cl); len=p-s1; s1[len] = ' ' ;//此处 为空格 printf("%d\n",len); printf("the string is %s\n",s1 ); } }使用GDB调试
可以看到很明显的错误行,使用bt命令:
可以判断是stack出错了,用反汇编
百度一把,看了别人的方法判断,我的某个指针初始化,出现了野指针。把*p=NULL,就好了。
但是我还是不太明白,怎么发现。
早上起来接着调试,中午吃完午饭,看了gdb手册,有所发现,使用单步调试
可以看到到第二次循环时,len乱了,P指针也指向了0,这个在Linux是受保护的。错误完全定位了。
相关文章推荐
- ubuntu C 语言 段错误 (核心已转储)
- Ubuntu——段错误 核心已转储
- Ubuntu——段错误 核心已转储
- c语言打印字符乱码和char *字符循环赋值时“段错误 (核心已转储)”问题解决
- c语言打印字符乱码和char *字符循环赋值时“段错误 (核心已转储)”问题解决
- Caffe2:段错误(核心 已转储)
- C语言基础问题2 段错误(核心已储存)修改错误的经历
- 解决Linux c语言运行时候“段错误 (核心已转储)”问题-采用gdb 解决
- ubuntu (16.04) server 英文原版 添加中文语言支持 消除java 程序、mysql 数据库不能处理中文的错误
- “段错误 (核心已转储) ”一种可能原因及其解决方法
- 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
- ORA-07445: 出现异常错误: 核心转储 [qctosop()+1263] [ACCESS_VIOLATION] [ADDR:0x170] [PC:0x9556D97] [UNABLE_TO_R
- 段错误 (核心已转储)
- c语言使用DES_ncbc_encrypt以及段错误 (核心已转储) 解决
- c语言使用DES_ncbc_encrypt以及段错误 (核心已转储) 解决
- gcc编译错误:段错误?核心已转储
- 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
- ORA-07445: 出现异常错误: 核心转储 [evaopn3()+252]
- YOLO 测试出错:段错误 (核心已转储)
- GCC 4.6.3段错误(核心已转储)