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

#  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异常引发的异常的更多相关文章

  1. WPF控件ComboBox 每个Item的ToolTip引发的异常

    介绍 首先介绍下要实现的任务.做一个下拉框,当选择每个项的时候将鼠标发在上面显示该项的ToolTip的内容(Image). 实现 Model: public class SkinInfo : Noti ...

  2. 关于Cocos的内存管理机制引发一些异常的解决方案

    错误:引发了异常: 读取访问权限冲突. this 是 0xDDDDDDDD.或者hero是 0xDDDDDDDD.hero是在GameController里创建的对象 这个的意思是this所指向的内存 ...

  3. 在MS单元测试中引发期望异常

    首先准备一个引发异常的方法. public static void ThrowException() { throw new ArgumentException(); } 然后在单元测试项目中,写下测 ...

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

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

  5. TCP端口复用引发的异常,用setsockopt来解决

    TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允 ...

  6. java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏

    Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...

  7. 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

    今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...

  8. 选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。

    异常: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. ...

  9. VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决

    VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...

随机推荐

  1. 剑指Offer 58. 对称的二叉树 (二叉树)

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目地址 https://www.nowcoder.com/practice/ ...

  2. ProtocolBuffer for Objective-C 运行环境配置及使用

    1,我已经安装了brew.pod.protoc,如果您没安装,请按照下面方式安装. 安装很简单,对着README操作一遍即可,我贴出自己在终端的命令行.需要输入的命令行依次为:1)打开终端,查看mac ...

  3. QMD ST表 倍增

    #include<iostream> #include<cmath> using namespace std; ; int a[maxn]; ]; ]; int quick(i ...

  4. 深入学习Motan系列(四)—— 客户端

    困惑的袋鼠,对框架的把握有些茫然,但是仍然一步步向前,行动总比一直迷茫停止不前要好,您说呢,各位客官? 这篇开始客户端的分析.有些地方的代码,就不每段都标出了,中间有跳跃的地方,请自己对照代码来看.鄙 ...

  5. JavaScript 快速排序详解

    使用的是<JavaScript数据结构与算法>一书中的快速排序,并加上自己的理解. 经测试,此算法的速度比内置的 sort 更快!而阮一峰的那个快排更像是归并排序,虽然写法简单很多,但是性 ...

  6. 验证代理ip是否可用

    改编自:http://www.jianshu.com/p/588241a313e7 # _*_ coding:utf-8 _*_ import urllib2 import re class Test ...

  7. 图像小波变换去噪——MATLAB实现

    clear; [A,map]=imread('C:\Users\wangd\Documents\MATLAB\1.jpg'); X=rgb2gray(A); %画出原始图像 subplot(,,);i ...

  8. Tag (input) should be an empty-element tag.

    因为:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  9. VS2017调试出现异常浏览器直接关闭的解决办法

    最近升级完VS2017后,出现了各种不适应. 1.F5调试时总是会打开新的浏览器,过去都是在现有窗口右侧打开新的新的浏览器标签页. 这一点就让很不爽,勉强接受吧,继续调试代码但是还有第二种情况. 2. ...

  10. redis高可用(主从复制)

    熟练掌握redis需要从 reids如何操作5种基本数据类型,redis如何集群,reids主从复制,redis哨兵机制redis持久化 reids主从复制 的作用可以:实现数据备份,读写分离,集群, ...