关于セグメンテーション違反です

セグメンテーション違反です,英文Segmentation fault。出现此错误一般在str函数中,今天发现feof()也会出现这个问题,就查了一下。

一、Linux下段错误(Segmentation fault)

段错误:访问的内存超出了系统给这个程序的内存空间,通常这个值是由gdtr来保存的,gdtr是一个48位的寄存器,其中的32位是保存由它指向的gdt表,中间13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。
 
二、调试方法
 
多数多线程程序出错,都是访问非法内存,也就是我们常说的"段错误"(Segmentation fault),程序发生非法内存的访问,系统会发给线程一个SIGSEGV信号,这个信号默认处理为core掉该线程。通过strace打印出的信息,我们可以对什么时候产生了一个子线程,那个线程在等待,哪个线程被唤醒,哪个线程收到信号,哪个线程core掉有一个综合的了解,这些信息对多线程调试会起到很大的作用。
 
三、如何产生core文件
 
发生段错误时如果系统core dump(吐核)功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。这对于我们发现程序bug很有帮助。
 
使用ulimit -a可以查看系统core 文件的大小限制;使用ulimit -c [kbytes]可以设置系统允许生成的core 文件大小,例如
  ulimit -c 0 不产生core 文件

  ulimit -c 100 设置core 文件最大为100k

  ulimit -c unlimited 不限制core 文件大小

ls -al core.* 查看core文件。用gdb分析之查看堆栈情况:gdb ./test core.2065 即可。

 

很多系统默认的core文件大小都是0,我们可以通过在shell的启动脚本/etc/bashrc或者~/.bashrc等地方来加入 ulimit -c 命令来指定core文件大小,从而确保core文件能够生成。

除此之外,还可以在/proc/sys/kernel/core_pattern里设置core文件的文件名模板,详情请看core的官方man手册。

四、利用backtrace和objdump进行分析

这个不是很懂,就不写了

posted @ 2012-03-30 13:06  天天hime  阅读(571)  评论(0)    收藏  举报