【背景】
最近项目上有一个业务需要从网络上抓包和发包,应用是在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
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code,
C=native code)
V [jvm.dll+0x105eed]
C [Jpcap.dll+0x2506]
C [Jpcap.dll+0x1ac6]
j jpcap.JpcapCaptor.getPacket()Ljpcap/packet/Packet;+0
STEP 2:将Jpcap.dll 反向工程,我使用的是VC/bin/dumpbin.exe /exports /disasm Jpcap.dll > Jpcap.asm
10001AC1: E8 7A 04 00 00 call 10001F40
10001AC6: 8B 44 24 2C mov eax,dword ptr [esp+2Ch]
10001ACA: 83 C4 18 add esp,18h
10001ACD: 5F pop edi
10001ACE: 5E pop esi
10001ACF: 59 pop ecx
10001AD0: C2 08 00 ret 8
找到10001AC6(要加ImageBase,一般是10000000,可以通过dumpbin /headers确认),发现发生错误的时候在call 10001F40,本段asm对应JpcapCaptor.c的Java_jpcap_JpcapCaptor_getPacket方法,从c代码可以看出getPacket方法只有三个位置在call其他方法。回到asm,离ret 8如此之近,猜想应该是最后一个位置的get_packet();
get_packet()的c代码长达近两百行,通过asm与c对比的方式寻找错误位置显然不太现实,此路不通,尝试第二方案。
【思路二、调试代码】
STEP3:
前面的尝试虽然失败,但至少可以知道问题出在get_packet();于是我在该方法里部署了很多printf,重新编译成dll,然后就等着JVM crash,遗憾的是,从上午9点等到13点,一次错误都没有。突然想起来,今天周六,其他人的机器都不开,看来跟网络环境有关。没办法,只能等周一才能继续了,回家打机去。
STEP4:
周一,果然零星出现了几次crash,在反复几次修改printf之后,总算有点收获了。
void get_packet(struct pacp_pkthdr header,u_char *data,jobject *packet,int id){
u_short nproto,tproto;
short clen=header.caplen,hlen;
u_char *orig_data=data;
printf("data=%d=%x,packetLength=%d,caplen=%d
\n",*data,*data,header.len,clen);
...
}
打出来的结果是:
data=108=6c,packetLength=32885,caplen=-32651
意思是,包长32885,抓包得到的长度是-32651,问题是显而易见的,short只支持-32768 到 32767。
找到问题所在,剩下的就小事一桩鸟,short改成u_short,只加了2个字符。
第一次跟踪c代码,走了不少弯路,最后发现是这么小的问题,真是太初级了。
该问题已同时提交维护组http://groups.google.com/group/jpcap
分享到:
相关推荐
通过"0219_基于Jpcap的TCPIP数据包分析.doc"和"基于Jpcap的IP数据包分析.pdf"这两个文档,你将能够更深入地了解如何使用Jpcap库进行具体的实践操作,包括代码示例和可能遇到的问题及解决方案。 总的来说,Jpcap为...
基于JPcap的网络流量分析研究与应用 《基于JPcap的网络流量分析研究与应用》报告详细介绍了Jpcap的类和接口,分析网络流量,并进行研究分析。该报告对Jpcap的类库进行了详细的分析和应用,并对网络流量分析进行了...
《基于Jpcap的IP数据包分析》是一个深入探讨网络数据包捕获和分析的教育资源。Jpcap是一个Java库,专门设计用于处理网络数据包,它为开发人员提供了强大的功能,可以捕获、过滤、解析和重发网络流量。在本资料中,...
《基于Jpcap的TCP/IP数据包分析》 在信息技术领域,网络协议分析是至关重要的一个环节,它有助于我们理解网络通信的过程,检测网络安全问题,优化网络性能等。本资料主要探讨了如何利用Jpcap库进行TCP/IP数据包的...
jpcap是Java Packet Capture的缩写,是一个开源的网络协议分析库,允许开发者在Java应用程序中进行网络数据包的捕获和处理。在计算机网络中,抓包是一种常用的技术,用于监控网络流量,排查网络问题,或进行网络安全...
可以捕获和分析IP数据包,NETBEAN下运行通过。只要jpcap配置正确,保证可以运行。xixi代码,保证质量。谢谢大家长时间的支持!我会继续努力,为大家上传过多有用的资源的!!!改一下文件名哦~~~
Jpcap,全称为Java Packet Capture,是一个用于网络封包分析的开源库,专为Java编程语言设计。其核心功能是允许开发者在Java环境中捕获、过滤、分析以及回放网络数据包。这个库在网络安全、网络监控和性能测试等领域...
- **兼容性问题**:确保Jpcap.dll与操作系统的版本匹配,否则可能导致加载失败。 - **权限问题**:捕获网络数据包可能需要管理员权限,因此在运行程序时需要相应的权限。 - **错误处理**:捕获和分析数据包过程中...
《深入解析Jpcap库:基于jpcap-1.0.jar的网络数据包捕获与分析》 在计算机网络领域,数据包捕获和分析是至关重要的环节,它可以帮助我们深入了解网络通信的过程,排查故障,甚至进行网络安全研究。本文将详细探讨...
标题 "64位jpcap.jar及对应jpcap.dll下载" 暗示了这是一个针对64位操作系统的Java库,主要用于网络数据包捕获和分析。jpcap是一个开源项目,它提供了Java接口来处理网络接口卡(NIC)的数据包捕获,类似于著名的...
2. **数据包分析**:jpcap提供了解析和分析数据包的能力,可以获取每个包的详细信息,如源IP、目的IP、端口号、协议类型等。这在网络安全、性能监测和故障定位中非常有用。 3. **数据包发送**:除了捕获,jpcap还...
Jpcap是一个强大的Java库,允许开发者捕获、分析和过滤网络数据包,这对于网络监控、安全分析以及性能调试等工作至关重要。 Jpcap库提供了丰富的API,可以方便地访问网络接口信息,包括但不限于设备列表、网络...
Jpcap是一个强大的Java库,它为网络数据包捕获和分析提供了接口。这个库是为那些希望在Java环境中进行网络监控、数据分析或者网络安全研究的开发者设计的。Jpcap的全称是Java Packet Capture,它的主要功能是允许...
《Jpcap:Java平台上的数据包捕获与分析库》 Jpcap是一个专为Java平台设计的数据包捕获和分析库,它允许开发者在Java应用程序中实现网络监控和数据包处理功能。这个库的核心组件包括两个主要部分:`jpcap.jar`和`...
Jpcap是一款强大的网络数据包捕获库,它为Java开发者提供了接口,使得在Java环境中捕获和分析网络流量成为可能。这篇文章将详细讲解如何在Windows环境下,特别是在Win7专业版上,安装并配置Jpcap。 首先,我们需要...
这种灵活性使得Jpcap在进行网络数据分析时尤为强大。 总的来说,Jpcap是Java开发人员处理网络底层协议的宝贵工具,它提供了全面的功能集,可以帮助开发出功能强大的网络应用。无论是进行学术研究、网络安全分析还是...
本文将深入探讨jpcap.jar和jpcap.dll这两个组件,它们是Java平台上的一个网络封包捕获库,为开发者提供了强大的网络分析能力。 首先,jpcap.jar是jpcap的主要Java库文件,它提供了用于捕获、过滤和分析网络封包的...
《jpcap.jar与jpcap.dll:网络数据包捕获与分析的利器》 在IT行业中,网络数据包的捕获与分析是一项至关重要的任务,对于网络安全、故障排查、性能优化等领域都有着广泛的应用。jpcap.jar和jpcap.dll就是这样的工具...