Jpcap 导致JVM crash 的分析笔记
【背景】
最近项目上有一个业务需要从网络上抓包和发包,应用是在JAVA平台上搭建,业界比较成熟的Winpcap组件则是在DLL的,所以我们用到一个开源组件Jpcap来桥接。Jpcap包含了一个jar包和一个dll,jar负责跟java接口,dll负责与winpcap接口。
【问题】
本来一切正常,可是到了项目后期竟然发生了一系列偶发性JVM crash事故。这类问题对我来说是比较头疼的,原因有二。第一是没有重现的规律(改过bug的程序员都知道,找到重现规律就搞定这个bug的1/3了,debug到代码行就解决了2/3了,剩下动手改只是小事一桩);第二是本地代码出错,纯粹Java的程序员往往比较恐惧跟native,因为那意味着必须跟c语言甚至汇编语言打交道。
今天周五,下周一项目交测,看来只得硬着头皮上了。
?
【思路一、分析错误日志】
STEP1: 分析工程目录下众多的hs_err_pidxxxx.log,可以看出,所有的日志都表明在同一个地方出的错--Jpcap.dll+0x1bf2
?
data=108=6c,packetLength=32885,caplen=-32651
?意思是,包长32885,抓包得到的长度是-32651,问题是显而易见的,short只支持-32768?到 32767。
?找到问题所在,剩下的就小事一桩鸟,short改成u_short,只加了2个字符。
?
第一次跟踪c代码,走了不少弯路,最后发现是这么小的问题,真是太初级了。
?
?该问题已同时提交维护组http://groups.google.com/group/jpcap
?