`
dazhilao
  • 浏览: 246079 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【转】内存访问过界

阅读更多
原文地址:http://hi.baidu.com/liheng_2009/blog/item/c065e880cc09129ef603a6e8.html

最近公司一台服务器的某个服务无故死掉,查看系统日志/var/log/messages ,发现有如下报错:

segfault at 0000000000000000 rip 0000000000878bd1 rsp 00007fffffa0e220 error 6


查找了一下,出现这个故障,一般是内存访问过界,以下是找到的资料。


/var/log/messages中一个关于APACHE的奇怪报错

最近以来,我的服务器/var/log/messages 中有一段日志,非常奇怪,而且我的apache经常并发很高,无故的死掉,我的环境是前端是nginx做代理,后端是apache,都在同一台机器上,下面我贴出日志,求大哥,大姐们,帮小弟看看了!
[root@168 logs]# tail /var/log/messages
Oct   9 00:29:20 168 kernel: httpd[24110]: segfault at 00007fff5989d878 rip 00002b8dd9595174 rsp 00007fff5989d880 error 6
Oct   9 00:34:55 168 kernel: httpd[24323]: segfault at 00007fff5989d878 rip 00002b8dd9595174 rsp 00007fff5989d880 error 6
Oct   9 00:47:26 168 kernel: httpd[24997]: segfault at 00007fff5989d878 rip 00002b8dd9595174 rsp 00007fff5989d880 error 6

答:

   这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number.
在上面的例子中,error number是6, 转成二进制就是110, 即bit2=1, bit1=1, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。
error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
根据segfault信息调试定位程序bug:
#include<stdio.h>int main(){        int *p;        *p=12;        return 1;}
1. gcc testseg.c -o testseg -g,运行./testseg查看dmesg信息如下:
testseg[26063]: segfault at 0000000000000000 rip 0000000000400470 rsp 0000007fbffff8a0 error 6
2. 运行addr2line -e testseg 0000000000400470,输出如下:
/home/xxx/xxx/c/testseg.c:5 [...]

***********************

内存不足不会引起段错误。段错误通常出现在访问了非法的地址后,非法地址分为3类:
1. 访问的地址没有对应的物理内存。这类错误主要出现在越界访问,例如栈越界。比如说当前进程的栈只有5个页和它对应,共20k大小(x86平台),你访问的地址超过了这个范围,就会发生segmentation fault。

2.对地址的操作与该地址的属性不符合。例如该地址对应的内存是只读的,如文本段,你却试图进行写操作。

3.低权限访问高权限地址。这类情况发生在用户进程试图访问内核空间。例如x86中,TASK_SIZE以上的地址为内核空间,当用户态进程试图访问这些地址时,segmentation fault。********************


estseg[24850]: segfault at 0000000000000000 rip 0000000000400470 rsp 0000007fbffff8a0 error 6
这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是最后的error number. 在上面的信息中,error number是4 ,下面详细介绍一下error number的信息:
在上面的例子中,error number是6, 转成二进制就是110, 即bit2=1, bit1=1, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。

error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
根据segfault信息调试定位程序bug:
#include
int main()
{
int *p;
*p=12;
return 1;
}

1. gcc testseg.c -o testseg -g,运行./testseg查看dmesg信息如下:
testseg[26063]: segfault at 0000000000000000 rip 0000000000400470 rsp 0000007fbffff8a0 error 6
2. 运行addr2line -e testseg 0000000000400470,输出如下:
/home/xxx/xxx/c/testseg.c:5


参考资料:

http://en.wikipedia.org/wiki/Segmentation_fault

http://hi.baidu.com/sky_hacker/blog/item/86a933dcd6a858abcc116623.html

http://blog.5iwww.com/read.php/1109.htm


分享到:
评论

相关推荐

    《僵尸玩过界》阿文读书笔记ppt模板.rar

    《僵尸玩过界》是阿文在2015年9月创作的一份读书笔记,以PPT模板的形式呈现,旨在分享他对这本书的理解和感悟。这份笔记不仅体现了阿文对末日生存主题的深入思考,同时也展示了一种创新的读书笔记方式——利用PPT这...

    《僵尸玩过界》读书笔记PPT作品.rar

    《僵尸玩过界》读书笔记PPT作品是一个以僵尸为主题,深入浅出讲解神经科学的创新阅读体验。这本书巧妙地将僵尸这一流行文化元素作为载体,引领读者探索大脑的奥秘,同时也提供了一种寓教于乐的学习方式。PPT的形式...

    《僵尸玩过界》读书笔记PPT作品.pptx

    《僵尸玩过界》读书笔记PPT作品.pptx

    《僵尸玩过界》读书笔记PPT作品 (2).pptx

    《僵尸玩过界》读书笔记PPT作品 (2).pptx

    美股-投资策略-中国经纪人行业:A股有些过界,更看好H股-2019.12.12-71页.rar

    美股-投资策略-中国经纪人行业:A股有些过界,更看好H股-2019.12.12-71页.rar

    《僵尸玩过界》读书笔记PPT

    《僵尸玩过界》读书笔记PPT是一部以僵尸文化为主题的深度阅读分享,共计38页,采用黑色调和人物剪影的设计风格,为读者呈现了一种独特的视觉体验。本PPT旨在通过精炼的文字和创意的图形,帮助读者理解并探讨这本书的...

    基于DS18B20传感器的数字温度计设计

    4. **过界报警功能**:系统通过按键输入设定过界报警温度,当实际温度超过预设阈值时,会触发报警,提醒用户注意温度状况。这种功能在工业生产、实验室环境或者家庭应用中都具有重要的安全意义。 5. **RS-232-C接口...

    数字温度监控预警系统[单片机][毕业设计]

    下位机方面,利用STC89C52单片机控制DS18B20数字温度传感器进行数据采集,通过矩阵键盘按键控制实现过界报警温度值设定和实时监控,利用AT24C02外部EEPROM芯片进行数据存储,并由1602液晶模块显示结果。上位机方面,...

    瑞信-美股-投资策略-中国经纪人行业:A股有些过界,更看好H股-2019.12.12-71页.pdf

    根据提供的文件信息,本篇报告主要涉及的是中国证券经纪行业的投资策略分析,特别关注了A股市场与H股市场的比较,并给出了对未来的市场展望和投资建议。报告指出,从2019年下半年开始,中国资本市场改革步伐明显加快...

    c代码-security access

    - **缓冲区溢出**:C语言中数组没有边界检查,过界写入可能导致覆盖相邻数据,引发安全问题。使用`strncpy()`代替`strcpy()`,`snprintf()`代替`sprintf()`来防止溢出。 2. **输入验证**: - 输入数据应进行验证...

    lcd光固化3D打印机固件带上限位

    总的来说,这个固件包旨在提升5英寸LCD 3D打印机的性能和安全性,通过0.9度步进电机和1204滚珠丝杆的组合确保精度,同时利用“带上限位”的功能防止过界操作。对于用户而言,理解这些技术细节有助于更好地利用和维护...

    双飞燕天遥g7键盘驱动程序v10.10v12官方版

    双飞燕天遥g7键盘驱动程序是一款由...“针光引擎”技术, 具有超强的过界能力;而今,又精心研制出革命性的无孔“幽灵隐擎”,一举封闭鼠标底部的光孔。A4TECH(艾思钛克)的精湛技术和创新精神, 始终引领着行业的进步

    专题资料(2021-2022年)北大纵横—北京世博伟业房地产调查问卷.doc

    11. **职责过界的原因**:问题19分析了导致职责过界可能的根源,如权力斗争、职责不明确或执行中的妥协等。 这些问题的调查结果可以帮助管理层识别并解决组织内部的问题,优化流程,提高工作效率,并营造更加和谐的...

    易语言取空白文本命令使用讲解

    同时,它还可以用于防止数据写入时过界,因为在向内存中写入数据时,预先填充的空格可以作为安全的缓冲区。 例如,如果你正在编写一个程序,需要在用户输入的数据前加上固定格式的标签,如时间戳,你可以先用"取...

    芯邦最新量产工具UMPTool V5521_2010.11.27.rar

    软件介绍: 最新版本的芯邦(2093A1 2093P 2095 2193A1 2193P)量产工具UMPTool V5521更新日期:2010.11.27可以自定设置高级或低级扫描、格式...未修改量产地址过界问题。2.修改ONFI FLASH问题(2C680446A9). 

    ARM 44B0 C模板 轻松掌握ARM

    地址分配原理见44B0数据手册内存管理那章的内存分配图 想在RAM里调试就添0XC000000(比如0XC008000)的地址 但是注意的是地址不要添过界,比如想在RAM里调试却添0X00000000 程序可以 进入C代码 但没法运行 ...

    自制3D打印机设计模型_零件图_机械工程图_机械三维3D设计图打包下载.rar

    8. **传感器**:如热敏电阻(检测喷嘴温度)、限位开关(防止过界)等,用于监控和保护打印机。 9. **软件**:除了硬件,3D打印还需要切片软件,如Cura、Slic3r,将3D模型转换成G-code,这是3D打印机可以理解的指令...

    javascript实现完美拖拽效果

    3.判断是否过界 html代码: &lt;div id=div1&gt;&lt;/div&gt; css代码: #div1{width:100px;height:100px;background:red;position:absolute} javascript代码: [removed]=function(){ var oDiv=document.getElementById...

    androidQQ侧滑

    这种设计模式提升了用户体验,使得用户可以快速访问不同的菜单或功能,而无需通过传统导航栏进行多次点击。 侧滑效果的实现主要涉及到两个关键的技术点:手势识别和视图滑动动画。在Android中,我们可以使用`...

    针光鼠标是什么.docx

    首先,针光技术成功克服了鼠标过界问题。传统光学、激光以及蓝影鼠标在光滑的玻璃表面或布料等材质上使用时,常常会出现光标无法移动或发生抖动的情况,影响操作的流畅性。针光技术的出现彻底改变了这一状况。它通过...

Global site tag (gtag.js) - Google Analytics