一个free异常引发的异常
有同事反馈说自己的线程不工作,查看堆栈发现其打印如下:
#0 0x00007f291f72e7be in __lll_lock_wait_private () from /lib64/libc.so.6 #1 0x00007f291f6c2e4e in _L_lock_9925 () from /lib64/libc.so.6 #2 0x00007f291f6c1101 in free () from /lib64/libc.so.6 #3 0x00000000004b5b85 in pcap_close (p=0x561cab0) at ./pcap.c:1888 #4 0x000000000041f811 in ExitClean () at rp.c:5722 #5 0x00007f291f678655 in __run_exit_handlers () from /lib64/libc.so.6 #6 0x00007f291f6786a5 in exit () from /lib64/libc.so.6 #7 0x000000000041f590 in SigHandler (signo=6, info=0x7f291ed49d70, context=0x7f291ed49c40) at rp.c:5654 #8 <signal handler called> #9 0x00007f291f675875 in raise () from /lib64/libc.so.6 #10 0x00007f291f676e51 in abort () from /lib64/libc.so.6 #11 0x00007f291f6b68bf in __libc_message () from /lib64/libc.so.6 #12 0x00007f291f6bc0c8 in malloc_printerr () from /lib64/libc.so.6 #13 0x00007f291f6c110c in free () from /lib64/libc.so.6 #14 0x000000000042b1ef in reqReleasePacketInfo (pPacketInfo=0x5628230) at rp.c:11033 #15 0x0000000000438542 in DnsPacketCaptureEntry (ptConfig=0x741cc0 <atParamConfig>, ethIndex=0, threadIndex=0) at rp.c:16316 #16 0x000000000043954b in DnsPacketCaptureTask (ptThrPara=0x55cbf60 <TaskParaDnsCapConfig>) at rp.c:16715 #17 0x00007f292005e806 in start_thread () from /lib64/libpthread.so.0 #18 0x00007f291f72167d in clone () from /lib64/libc.so.6 #19 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.进程工作与否,不能简单通过查看进程存在来判断。
转载于:https://www.cnblogs.com/10087622blog/p/10370713.html
一个free异常引发的异常相关推荐
- 关于程序运行中出现的bug“Project1.exe 已触发了一个断点”和“ntdll.dll处引发的异常”和“指针对象为0xdddddddd”
最近自己做了一个数组+链表的结构.在写完后频频出现 "Project1.exe 已触发了一个断点"和"ntdll.dll处引发的异常"和"指针对象为0 ...
- Opencv4测试报错00007FFB3253A9C0 (ntdll.dll)处引发的异常: 0xC0000005: 读取位置 0x0000000000000010 时发生访问冲突
报错信息如下: 0x00007FFB3253A9C0 (ntdll.dll)处(位于 test1.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000010 时发 ...
- staticextension 上提供值时引发了异常_干!一张图整理了 Python 所有内置异常
在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...
- staticextension 上提供值时引发了异常_牛!一张图整理出了 Python 所有内置异常
在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...
- WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常
在"System.Windows.StaticResourceExtension"上提供值时引发了异常 因应需要,写了一个转换器,然后窗体上引用,结果就出来这个错.编译的时候没事, ...
- 什么是引发?Java运行时系统引发的异常如何处理?
到目前为止,你只是获取了被Java运行时系统引发的异常.然而,程序可以用throw语句引发明确的异常.Throw语句的通常形式如下: throw ThrowableInstance; 这里,Throw ...
- .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突
.dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突 在进行c++代码编译时,出现了.dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问 ...
- (xxx.dll)处(位于xxx.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000003F 时发生访问冲突。已解决。
下面两个这种类型的报错都一样.(跟xxx.dll和xxx.exe都没关系) 0x794CECC1 (Qt5Cored.dll)处(位于 xxx.exe 中)引发的异常: 0xC0000005: 读取位 ...
- (ntdll.dll)处(位于 .exe 中)引发的异常: 0xC0000139: Entry Point Not Found
症状 起因是我加了个QAxObject的lib,然后好好的程序就会报错(ntdll.dll)处(位于 .exe 中)引发的异常: 0xC0000139: Entry Point Not Found 网 ...
最新文章
- 编程小白学python知乎周刊_在知乎上学 Python - 入门篇
- jmeter服务器测试项目,JMeter-项目测试
- 简单比对照片是否相同_小新说法 | 如何认定商标是否侵权?
- 在服务器上搭建基于yolo3 与crnn 实现中文自然场景文字检测及识别,GPU版本
- .NET实现之(自动更新
- 金三银四 | 吃透这套题,面试更有底气
- 第三方网站调用微信公众号的图片被禁止
- 教程-TObjectList.Clear、TStringList.Clear方法对象有没有被释放
- Linux系统中安装Nginx
- Uiautomator入门(初学者用)
- 指纹匹配算法matlab,指纹识别算法matlab程序
- 【慕课网】前端零基础入门---步骤一:页面结构层HTML---01-HTML基础
- 【第17天】SQL进阶-查询优化- SHOW STATUS(SQL 小虚竹)
- 图像标注的基础内容介绍
- 工程力学专业考研转计算机,“初见不知提桶意,再见已是提桶人”,土木跨考计算机可行吗?...
- python实现软件自动点击_鼠标自动点击、键盘自动输入?几行Python代码搞定
- 一篇很好的EDP入门介绍文章——了解AUX,PSR,ASSR 以及EDP版本的差异
- TypeScript 初学者指南
- ThinkPad T440s 改 T450s
- 提高生产力和效率的小方法