14, bad address

近期程序总是会在启动阶段崩溃,而这是一个网络服务程序,启动时会产生大量的网络通信工作。从现象来看是比较典型的内存溢出导致堆栈被摧毁的问题,即使是用gdb调试也看不到出错的问题点,可以推断出其实是发生了比较严重写非法内存区的动作。

经过不断排查,有一处网络接收逻辑与预期不符。具体现象是服务端已经发送了数据,而接收端recv方法报错,可是套接字状态却是正常的establish。再将errno值与描述打印出来查看是14, bad address提示。此时犯了一个大意的错误,想当然的将其归为套接字地址的异常,直至后来搜索时才发现其实是地址不可写,实际上是指用来接收的缓存区是不可写的。

问题到此发现,再将缓存区内存地址打印出来查看,果然是因为一个作为下标计算的值未经过网络字节序转换而导致数组越界太多。从此处也可以发现系统调用写内存方法其实对缓存区是有一个判断的,推测其原则是若内存区处于内核态则会返回bad address错,防止对系统造成破坏,但如果内存区处于用户态,则系统不会阻止,结果造成程序堆栈被破坏而导致崩溃。

时间: 2024-10-30 03:43:32

14, bad address的相关文章

System and method for critical address space protection in a hypervisor environment

A system and method in one embodiment includes modules for detecting an access attempt to a critical?address?space?(CAS) of a guest operating system (OS) that has implemented?address?space?layout?randomization?in a hypervisor environment, identifying

Multiple address space mapping technique for shared memory wherein a processor operates a fault handling routine upon a translator miss

Virtual addresses from multiple address spaces are translated to real addresses in main memory by generating for each virtual address an address space identifier (AID) identifying its address space. Then, the virtual address and its AID are used to o

Centos7上安装Kubernetes集群部署docker

一.安装前准备 1.操作系统详情 需要三台主机,都最小化安装 centos7.3,并update到最新 cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)  角色主机名IP Master      master192.168.1.14 node1    slave-1192.168.1.15 node2slave-2192.168.1.16 2.在每台主机上关闭firewalld改用iptables 输入以下命令,关闭fire

栈回溯技术

转载于:http://blog.csdn.net/yangzhiloveyou/article/details/9042137 1.    前言 段错误.非法地址访问等问题导致程序崩溃的现象屡屡发生,如果能找到发生错误的函数,往往一眼就能看出BUG所在--对于这类比较简单的问题,比如使用空指针进行读写等,利用栈回溯技术可以很快定位.但是对于数组溢出.内存泄漏等问题导致的程序错误,往往隐藏很深,它们并不当场发作,即使我们一步一步跟踪到发生错误的语句时,也经常会让人觉得"这个地方根本不可能出错啊&q

Linux errno

Linux/include/uapi/asm-generic/errno-base.h #ifndef _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERIC_ERRNO_BASE_H #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #defi

ORM框架(ITDOS实战源码)

ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁. 如以下示例: 1 public int GetSystemAccreditMessageInfo(AccreditParam param) 2 { 3 var where = new Where<User>(); 4 var countMesage = 0;//记录提醒次数 5 HttpCookie cookie = HttpContext.Curr

SpringMVC的各种参数绑定方式

1. 基本数据类型(以int为例,其他类似):  Controller代码: 1 @RequestMapping("saysth.do") 2 public void test(int count) { 3 } 表单代码: 1 <form action="saysth.do" method="post"> 2 <input name="count" value="10" type=&quo

MySQL Error Codes MYSQL的错误代码

OS error code 1: Operation not permitted OS error code 2: No such file or directory OS error code 3: No such process OS error code 4: Interrupted system call OS error code 5: Input/output error OS error code 6: No such device or address OS error code

Objective-C(iOS)严格单例模式正确实现

注:本文所有权归作者所有,转载请注明出处 当希望在一个应用程序中某个类的对象只能存在一个的时候就可以考虑用单例模式来实现,单例模式在C++中比较容易实现(只需把构造函数声明为private),而在Objective-C中对象可以通过NSObject的alloc来产生,所以需要编写一些额外的代码来确保对象的唯一性,考虑到现在编写iOS APP代码几乎都是ARC方式,且GCD也已经被用烂了,故本文给出一种利用GCD技术来实现严格单例模式的ARC版本,具体代码如下所示,所有的注意点都写在了注释里面: