一个free异常引发的异常
有同事反馈说自己的线程不工作,查看堆栈发现其打印如下:
# 0x00007f291f72e7be in __lll_lock_wait_private () from /lib64/libc.so.
# 0x00007f291f6c2e4e in _L_lock_9925 () from /lib64/libc.so.
# 0x00007f291f6c1101 in free () from /lib64/libc.so.
# 0x00000000004b5b85 in pcap_close (p=0x561cab0) at ./pcap.c:
# 0x000000000041f811 in ExitClean () at rp.c:
# 0x00007f291f678655 in __run_exit_handlers () from /lib64/libc.so.
# 0x00007f291f6786a5 in exit () from /lib64/libc.so.
# 0x000000000041f590 in SigHandler (signo=, info=0x7f291ed49d70, context=0x7f291ed49c40) at rp.c:
# <signal handler called>
# 0x00007f291f675875 in raise () from /lib64/libc.so.
# 0x00007f291f676e51 in abort () from /lib64/libc.so.
# 0x00007f291f6b68bf in __libc_message () from /lib64/libc.so.
# 0x00007f291f6bc0c8 in malloc_printerr () from /lib64/libc.so.
# 0x00007f291f6c110c in free () from /lib64/libc.so.
# 0x000000000042b1ef in reqReleasePacketInfo (pPacketInfo=0x5628230) at rp.c:
# 0x0000000000438542 in DnsPacketCaptureEntry (ptConfig=0x741cc0 <atParamConfig>, ethIndex=, threadIndex=) at rp.c:
# 0x000000000043954b in DnsPacketCaptureTask (ptThrPara=0x55cbf60 <TaskParaDnsCapConfig>) at rp.c:
# 0x00007f292005e806 in start_thread () from /lib64/libpthread.so.
# 0x00007f291f72167d in clone () from /lib64/libc.so.
# 0x0000000000000000 in ?? ()
根据代码逻辑,发现其free的时候出现异常,导致了信号的产生,并且被SigHandler 处理,由于注册了退出清理函数,
atexit(ExitClean);
这个 ExitClean 会调用 pcap_close 来清理pcap_open 申请的一些资源,很悲剧的是,这些资源释放的时候,获取的锁看起来被占用了,导致我们exit的时候,被阻塞了。exit的时候,还没有走到
_exit()函数,就阻塞在锁的等待上面。
这些锁被占用的概率,按照glibc的内存管理方式,不应该这么久,唯一的可能就是,这些锁的状态被异常覆盖了,导致认为被占用了。
反过头来看,一开始的free为什么异常,就能理解这个逻辑了。
查看对应时间点附近的系统日志,发现了很多报文的校验和错误,走查我们的代码,发现三层的错误并没有排查,而是直接采用拷贝的模式,
而拷贝传入的长度,是没有检验的长度,导致了我们malloc的内存越界。这种越界,最终在free的时候被发现。
改进点结论:
1.校验pacp_next返回的pcap_pkthdr中的len成员,大于我们用户的缓存区时,不要越界拷贝,解决malloc的越界,然后free就正常了。
2.进程工作与否,不能简单通过查看进程存在来判断。
一个free异常引发的异常的更多相关文章
- WPF控件ComboBox 每个Item的ToolTip引发的异常
介绍 首先介绍下要实现的任务.做一个下拉框,当选择每个项的时候将鼠标发在上面显示该项的ToolTip的内容(Image). 实现 Model: public class SkinInfo : Noti ...
- 关于Cocos的内存管理机制引发一些异常的解决方案
错误:引发了异常: 读取访问权限冲突. this 是 0xDDDDDDDD.或者hero是 0xDDDDDDDD.hero是在GameController里创建的对象 这个的意思是this所指向的内存 ...
- 在MS单元测试中引发期望异常
首先准备一个引发异常的方法. public static void ThrowException() { throw new ArgumentException(); } 然后在单元测试项目中,写下测 ...
- WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常
在"System.Windows.StaticResourceExtension"上提供值时引发了异常 因应需要,写了一个转换器,然后窗体上引用,结果就出来这个错.编译的时候没事, ...
- TCP端口复用引发的异常,用setsockopt来解决
TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允 ...
- java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏
Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...
- 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...
- 选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
异常: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. ...
- VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决
VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...
随机推荐
- 真机*Appium
一.真机连接电脑123 1.一般android手机的的USB调试模式在设置里的开发者选项中,找到开发者选项,打开USB调试 2.cmd命令→[adb devices]→回车,得到真机设备 可能存在问题 ...
- 支付宝电脑支付沙箱配置(JAVA)
支付宝电脑支付API地址:https://docs.open.alipay.com/270/105899/.支付宝提供了沙箱环境提供测试,具体配置步骤如下 1.先下载测试DEMO工程 下载地址:htt ...
- Oracle(二)在 Mysql 的基础上学习 Oracle
毕竟我是先学的mysql,对数据库的一切认知都会有一个先入为主的思想在里面,如果不搞清楚其中的异同,我感觉Oracle我是学不会 了,甚至会把它们混淆.那么,不会mysql的没必要往下看了. 下边第一 ...
- CSS3 transform变形(3D转换)
一.三维坐标 空间中三维坐标如下图所示: 向上为-Y,向下为+Y,向左为-X,向右为+X,向前为+Z,向后为-Z. 二.perspective(n)为 3D 转换元素定义透视视图 perspectiv ...
- 位运算 - a^b
求 a 的 b 次方对 p 取模的值. 输入格式 三个整数 a,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数据范围 1≤a,b,p≤109 输入样例: 3 ...
- centos安装redis步骤
1.官网或wget下载redis-4.0.9.tar.gz: cd /home/tar wget http://download.redis.io/releases/redis-4.0.9.tar.g ...
- Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)
在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项 /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令 #pragma pack ...
- 高性能网络编程之IO和NIO阻塞分析
一.内容 1.阻塞和非阻塞是什么? 2.传统IO模型,他存在哪些阻塞点 3.NIO模型 4.对比总结 1.阻塞和非阻塞是什么? 阻塞:做某件事情,直到完成,除非超时,如果没有完成,继续等待. 非阻塞: ...
- python3中的编码
python2字符串编码存在的问题: 使用 ASCII 码作为默认编码方式,对中文处理不友好 把字符串分为 unicode 和 str 两种类型,将unicode作为唯一内码,误导开发者 python ...
- 血红蛋白值的临床意义(hemoglobin ,Hb,HGB)
血红蛋白临床意义: 血红蛋白增高.降低的临床意义基本和红细胞计数的临床意义相似,但血红蛋白能更好地反映贫血的程度. 血红蛋白增多有以下情况: (1)生理性增多:见于高原居民.胎儿和新生儿,剧烈活动 ...