当前位置:  操作系统/服务器>linux
本页文章导读:
    ▪segmentation fault      Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。来自:http://oss.lzu.edu.cn/blog/article.php?uid_7/tid_700.html#comment背景   最近一段时间.........
    ▪【收录】RRDtool中的数据类型GAUGE、COUNTER和DERIVE      » 作者:LSX » 原创文章版权归作者所有,未经作者同意请保留以下声明. » 本文链接:http://blog.lishixin.net/?p=1217 » 转载请注明来源:LSX·Blog » 《【收录】RRDtool中的数据类型GAUGE、COUNTER和DERIVE.........
    ▪每天一个linux命令(61):wget命令      Linux系统中的wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget支持HTTP,HTTPS和FTP协议,可以.........

[1]segmentation fault
    来源:    发布时间: 2013-10-22
Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。

来自:http://oss.lzu.edu.cn/blog/article.php?uid_7/tid_700.html#comment

背景

   最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不过,目前写一个一千行左右的代码,也很少出现段错误,或者是即使出现了,也很容易找出来,并且处理掉。

   那什么是段错误?段错误为什么是个麻烦事?以及怎么发现程序中的段错误以及如何避免发生段错误呢?

   一方面为了给自己的学习做个总结,另一方面由于至今没有找到一个比较全面介绍这个虽然是“FREQUENTLY ASKEDQUESTIONS”的问题,所以我来做个抛砖引玉吧。下面就从上面的几个问题出发来探讨一下“Segmentationfaults"吧。

目录

1。什么是段错误?
2。为什么段错误这么“麻烦”?
3。编程中通常碰到段错误的地方有哪些?
4。如何发现程序中的段错误并处理掉?

正文

1。什么是段错误?

下面是来自Answers.com的定义:

Asegmentation fault (often shortened to segfault) is a particularerror condition that can occur during the operation of computersoftware. In short, a segmentation fault occurs when a programattempts to access a memory location that it is not allowed toaccess, or attempts to access a memory location in a way that isnot allowed (e.g., attempts to write to a read-only location, or tooverwrite part of the operating system). Systems based onprocessors like the Motorola 68000 tend to refer to these events asAddress or Bus errors.

Segmentation is one approach to memory management and protection inthe operating system. It has been superseded by paging for mostpurposes, but much of the terminology of segmentation is stillused, "segmentation fault" being an example. Some operating systemsstill have segmentation at some logical level although paging isused as the main memory management policy.

On Unix-like operating systems, a process that accesses invalidmemory receives the SIGSEGV signal. On Microsoft Windows, a processthat accesses invalid memory receives the STATUS_ACCESS_VIOLATIONexception.



另外,这里有个基本上对照的中文解释,来自http://www.linux999.org/html_sql/3/132559.htm

所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了



通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。

2。为什么段错误这么麻烦?

中国linux论坛有一篇精华帖子《Segment fault 之永远的痛》(http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=193239&page=2&view=collapsed&sb=5&o=all&fpart=1&vc=1)
在主题帖子里头,作者这么写道:

写程序好多年了,Segment fault是许多C程序员头疼的提示。指针是好东西,但是随着指针的使用却诞生了这个同样威力巨大的恶魔。

Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。

不知道什么时候才可以有能够处理NULL的glibc库诞生啊!

不得已,我现在为好多的函数做了衣服,避免glibc的函数被NULL给感染,导致我的Mem访问错误,而我还不知道NULL这个病毒已经在侵蚀我的身体了。

Segment fault 永远的痛......



   后面有好多网友都跟帖了,讨论了Segmentationfaults为什么这么“痛”,尤其是对于服务器程序来说,是非常头痛的,为了提高效率,要尽量减少一些不必要的段错误的“判断和处理”,但是不检查又可能会存在段错误的隐患。

   那么如何处理这个“麻烦”呢?
   就像人不可能“完美”一样,由人创造的“计算机语言“同样没有“完美”的解决办法。
   我们更好的解决办法也许是:

   通过学习前人的经验和开发的工具,不断的尝试和研究,找出更恰当的方法来避免、发现并处理它。对于一些常见的地方,我们可以避免,对于一些“隐藏”的地方,我们要发现它,发现以后就要及时处理,避免留下隐患。

   下面我们可以通过具体的实验来举出一些经常出现段错误的地方,然后再举例子来发现和找出这类错误藏身之处,最后处理掉。

3。编程中通常碰到段错误的地方有哪些?

为了进行下面的实验,我们需要准备两个工具,一个是gcc,一个是gdb
我是在ubuntu下做的实验,安装这两个东西是比较简单的

sudo apt-get install gcc-4.0 libc6-dev
sudo apt-get install gdb


好了,开始进入我们的实验,我们粗略的分一下类

1)往受到系统保护的内存地址写数据

   有些内存是内核占用的或者是其他程序正在使用,为了保证系统正常工作,所以会受到系统的保护,而不能任意访问。

例子1:

Code:

[Ctrl+A SelectAll]
   编译和执行一下

$ gcc -o segerr segerr.c
$ ./segerr
10
段错误


   咋一看,好像没有问题哦,不就是读取一个数据然后给输出来吗?

下面我们来调试一下,看看是什么原因?

$ gcc -g -o segerrsegerr.c      --加-g选项查看调试信息
$ gdb ./segerr
(gdb) l               --用l(list)显示我们的源代码
1      #i nclude <stdio.h>
2
3      int
4      main()
5    

    
[2]【收录】RRDtool中的数据类型GAUGE、COUNTER和DERIVE
    来源:    发布时间: 2013-10-22

» 作者:LSX

» 原创文章版权归作者所有,未经作者同意请保留以下声明.

» 本文链接:http://blog.lishixin.net/?p=1217

» 转载请注明来源:LSX·Blog » 《【收录】RRDtool中的数据类型GAUGE、COUNTER和DERIVE》

GAUGE类型

GAUGE翻译过来是计量器的意思。可以理解为最终图表上显示的数据就是采集来的第一手数据。比如气温,停车场中空车位的数目,这种数据随时间变化,并且可上可下,没有固定的规律。

COUNTER类型

COUNTER是计数器的意思。这种类型一般用于记录连续增长的数据,例如某张网卡上流出的数据量。COUNTER数据源会假设计数器的值永远不会减小,除非发生溢出。更新操作会考虑到发生溢出的可能性。计数器会被以每秒的速率存储。当计数器溢出时,RRDtool会检查溢出发生在32bit或是64bit的边界,并对数据加上一个适当的值。

DERIVE类型

DERIVE翻译过来是导出的意思。DERIVE数据类型用于表示本次测量值与最后一次测量值之间的变化,例如单位时间内驶入和驶出停车场的数量。在RRDtool内部,除了没有溢出检查之外,DERIVE和COUNTER的工作原理是完全一致的。

本文链接


    
[3]每天一个linux命令(61):wget命令
    来源:    发布时间: 2013-10-22

Linux系统中的wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

1.命令格式:

wget [参数] [URL地址]

2.命令功能:

用于从网络上下载资源,没有指定目录,下载资源回默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

1)支持断点下传功能;这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;

2)同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;

3)支持代理服务器;对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;

4)设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;

5)程序小,完全免费;程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的。

3.命令参数:

启动参数:

-V, –version 显示wget的版本后退出

-h, –help 打印语法帮助

-b, –background 启动后转入后台执行

-e, –execute=COMMAND 执行`.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

记录和输入文件参数:

-o, –output-file=FILE 把记录写到FILE文件中

-a, –append-output=FILE 把记录追加到FILE文件中

-d, –debug 打印调试输出

-q, –quiet 安静模式(没有输出)

-v, –verbose 冗长模式(这是缺省设置)


    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3