有同事反馈说自己的线程不工作,查看堆栈发现其打印如下:

#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异常引发的异常相关推荐

  1. 关于程序运行中出现的bug“Project1.exe 已触发了一个断点”和“ntdll.dll处引发的异常”和“指针对象为0xdddddddd”

    最近自己做了一个数组+链表的结构.在写完后频频出现 "Project1.exe 已触发了一个断点"和"ntdll.dll处引发的异常"和"指针对象为0 ...

  2. Opencv4测试报错00007FFB3253A9C0 (ntdll.dll)处引发的异常: 0xC0000005: 读取位置 0x0000000000000010 时发生访问冲突

    报错信息如下: 0x00007FFB3253A9C0 (ntdll.dll)处(位于 test1.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000010 时发 ...

  3. staticextension 上提供值时引发了异常_干!一张图整理了 Python 所有内置异常

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  4. staticextension 上提供值时引发了异常_牛!一张图整理出了 Python 所有内置异常

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  5. WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常

    在"System.Windows.StaticResourceExtension"上提供值时引发了异常 因应需要,写了一个转换器,然后窗体上引用,结果就出来这个错.编译的时候没事, ...

  6. 什么是引发?Java运行时系统引发的异常如何处理?

    到目前为止,你只是获取了被Java运行时系统引发的异常.然而,程序可以用throw语句引发明确的异常.Throw语句的通常形式如下: throw ThrowableInstance; 这里,Throw ...

  7. .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突

    .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突 在进行c++代码编译时,出现了.dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问 ...

  8. (xxx.dll)处(位于xxx.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000003F 时发生访问冲突。已解决。

    下面两个这种类型的报错都一样.(跟xxx.dll和xxx.exe都没关系) 0x794CECC1 (Qt5Cored.dll)处(位于 xxx.exe 中)引发的异常: 0xC0000005: 读取位 ...

  9. (ntdll.dll)处(位于 .exe 中)引发的异常: 0xC0000139: Entry Point Not Found

    症状 起因是我加了个QAxObject的lib,然后好好的程序就会报错(ntdll.dll)处(位于 .exe 中)引发的异常: 0xC0000139: Entry Point Not Found 网 ...

最新文章

  1. 编程小白学python知乎周刊_在知乎上学 Python - 入门篇
  2. jmeter服务器测试项目,JMeter-项目测试
  3. 简单比对照片是否相同_小新说法 | 如何认定商标是否侵权?
  4. 在服务器上搭建基于yolo3 与crnn 实现中文自然场景文字检测及识别,GPU版本
  5. .NET实现之(自动更新
  6. 金三银四 | 吃透这套题,面试更有底气
  7. 第三方网站调用微信公众号的图片被禁止
  8. 教程-TObjectList.Clear、TStringList.Clear方法对象有没有被释放
  9. Linux系统中安装Nginx
  10. Uiautomator入门(初学者用)
  11. 指纹匹配算法matlab,指纹识别算法matlab程序
  12. 【慕课网】前端零基础入门---步骤一:页面结构层HTML---01-HTML基础
  13. 【第17天】SQL进阶-查询优化- SHOW STATUS(SQL 小虚竹)
  14. 图像标注的基础内容介绍
  15. 工程力学专业考研转计算机,“初见不知提桶意,再见已是提桶人”,土木跨考计算机可行吗?...
  16. python实现软件自动点击_鼠标自动点击、键盘自动输入?几行Python代码搞定
  17. 一篇很好的EDP入门介绍文章——了解AUX,PSR,ASSR 以及EDP版本的差异
  18. TypeScript 初学者指南
  19. ThinkPad T440s 改 T450s
  20. 提高生产力和效率的小方法

热门文章

  1. iOS开发 关于启动页和停留时间的设置
  2. redhat6.5 yum源
  3. 菜鸟物流云是如何帮助快递合作伙伴解决双11巨大业务负荷的?
  4. 【FE前端学习】第二阶段任务-基础
  5. F5第一个10000台
  6. qt练习11 鼠标,按键,滚轮事件学习
  7. 数据依赖症:当今AI领域的核心风险
  8. linux系统开机静态分配ip地址
  9. 18.SSM整合_搭建开发环境
  10. Android 之Tasks和Back Stack(任务和返回栈)