2010-11-09 31 views
2

J'ai écrit le programme suivant qui est destiné à vider tout le trafic du périphérique réseau dans un fichier. Je sais que le problème implique l'utilisation de JpcapWriter. Pourquoi ai-je le message d'erreur ci-dessous?Jpcap briser la JVM

import jpcap.*; 
import jpcap.packet.*; 

public class dumptraffic 
{ 
    private static final int maxPackets = 100; 

    public static void main(String args[]) 
    { 
     try 
     { 
      NetworkInterface[] devices = JpcapCaptor.getDeviceList(); 

      if (args.length != 1) 
      { 
       System.out.println("You must enter a device number."); 

       int i = 0; 
       for (NetworkInterface device : devices) 
        System.out.println((i++) + ": " + device.name); 

       return; 
      } 

      JpcapCaptor jpcap = JpcapCaptor.openDevice(devices[Integer.parseInt(args[0].trim())], 2000, false, 20); 
      JpcapWriter writer = JpcapWriter.openDumpFile(jpcap, "dump.pcap"); 

      for (int i = 0; i < maxPackets; i++) 
       writer.writePacket(jpcap.getPacket()); 

      writer.close(); 

      System.out.println("Recorded packets to the file \"dump.pcap\""); 
     } 
     catch (Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

} 

Voici le journal que les décharges Java:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0234659d, pid=4900, tid=5808 
# 
# JRE version: 6.0_22-b04 
# Java VM: Java HotSpot(TM) Client VM (17.1-b03 mixed mode, sharing windows-x86) 
# Problematic frame: 
# v ~BufferBlob::jni_fast_GetLongField 
# 
# If you would like to submit a bug report, please visit: 
# http://java.sun.com/webapps/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

--------------- T H R E A D --------------- 

Current thread (0x02211c00): JavaThread "main" [_thread_in_native, id=5808, stack(0x002f0000,0x00340000)] 

siginfo: ExceptionCode=0xc0000005, reading address 0x00000000 

Registers: 
EAX=0x00000000, EBX=0x6da511e8, ECX=0x00000000, EDX=0x00000000 
ESP=0x0033f578, EBP=0x0033f5b0, ESI=0x00000022, EDI=0x00000000 
EIP=0x0234659d, EFLAGS=0x00010246 

Top of Stack: (sp=0x0033f578) 
0x0033f578: 02211d18 6d97567f 02211d18 00000000 
0x0033f588: 00000022 00000000 02211d18 6da511e8 
0x0033f598: 0033f58c 0033f19c 0033fd8c 6d9f4ed0 
0x0033f5a8: 6da2a4b0 00000000 0033fc68 015d358c 
0x0033f5b8: 02211d18 00000000 00000022 02211c00 
0x0033f5c8: 380655e0 0033fc68 380655e0 0000005b 
0x0033f5d8: 00000000 03000003 001521a8 77a94460 
0x0033f5e8: 00000000 77a94460 00000000 001219b8 

Instructions: (pc=0x0234659d) 
0x0234658d: 00 00 00 8b c1 83 e0 01 8b 54 04 0c 8b 74 24 10 
0x0234659d: 8b 12 c1 ee 02 8b 04 32 8b 54 32 04 be e0 16 a6 


Stack: [0x002f0000,0x00340000], sp=0x0033f578, free space=13d0033f0ack 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
v ~BufferBlob::jni_fast_GetLongField 
C [Jpcap.dll+0x358c] 
j dumptraffic.main([Ljava/lang/String;)V+127 
v ~StubRoutines::call_stub 
V [jvm.dll+0xf3a9c] 
V [jvm.dll+0x186591] 
V [jvm.dll+0xf3b1d] 
V [jvm.dll+0xfd365] 
V [jvm.dll+0x104fbd] 
C [java.exe+0x2155] 
C [java.exe+0x85b4] 
C [kernel32.dll+0x4d0e9] 
C [ntdll.dll+0x419bb] 
C [ntdll.dll+0x4198e] 

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 
j jpcap.JpcapWriter.writePacket(Ljpcap/packet/Packet;)V+0 
j dumptraffic.main([Ljava/lang/String;)V+127 
v ~StubRoutines::call_stub 

--------------- P R O C E S S --------------- 

Java Threads: (=> current thread) 
    0x02245800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=2888, stack(0x04550000,0x045a0000)] 
    0x0223e400 JavaThread "CompilerThread0" daemon [_thread_blocked, id=2620, stack(0x04500000,0x04550000)] 
    0x0223d400 JavaThread "Attach Listener" daemon [_thread_blocked, id=4060, stack(0x044b0000,0x04500000)] 
    0x0223a400 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=4280, stack(0x04460000,0x044b0000)] 
    0x02232000 JavaThread "Finalizer" daemon [_thread_blocked, id=5952, stack(0x04410000,0x04460000)] 
    0x02230c00 JavaThread "Reference Handler" daemon [_thread_blocked, id=5860, stack(0x008c0000,0x00910000)] 
=>0x02211c00 JavaThread "main" [_thread_in_native, id=5808, stack(0x002f0000,0x00340000)] 

Other Threads: 
    0x0222f400 VMThread [stack: 0x003b0000,0x00400000] [id=4396] 
    0x0224f400 WatcherThread [stack: 0x045a0000,0x045f0000] [id=4156] 

VM state:not at safepoint (normal execution) 

VM Mutex/Monitor currently owned by a thread: None 

Heap 
def new generation total 4928K, used 371K [0x28050000, 0x285a0000, 0x2d5a0000) 
    eden space 4416K, 8% used [0x28050000, 0x280acf00, 0x284a0000) 
    from space 512K, 0% used [0x284a0000, 0x284a0000, 0x28520000) 
    to space 512K, 0% used [0x28520000, 0x28520000, 0x285a0000) 
tenured generation total 10944K, used 0K [0x2d5a0000, 0x2e050000, 0x38050000) 
    the space 10944K, 0% used [0x2d5a0000, 0x2d5a0000, 0x2d5a0200, 0x2e050000) 
compacting perm gen total 12288K, used 86K [0x38050000, 0x38c50000, 0x3c050000) 
    the space 12288K, 0% used [0x38050000, 0x38065868, 0x38065a00, 0x38c50000) 
    ro space 10240K, 51% used [0x3c050000, 0x3c57baf8, 0x3c57bc00, 0x3ca50000) 
    rw space 12288K, 54% used [0x3ca50000, 0x3d0e76d8, 0x3d0e7800, 0x3d650000) 

Dynamic libraries: 
0x00400000 - 0x00424000  C:\Windows\system32\java.exe 
0x779d0000 - 0x77af7000  C:\Windows\system32\ntdll.dll 
0x77700000 - 0x777dc000  C:\Windows\system32\kernel32.dll 
0x761c0000 - 0x76286000  C:\Windows\system32\ADVAPI32.dll 
0x76460000 - 0x76523000  C:\Windows\system32\RPCRT4.dll 
0x10000000 - 0x10048000  C:\Windows\system32\guard32.dll 
0x76950000 - 0x769ed000  C:\Windows\system32\USER32.dll 
0x77be0000 - 0x77c2b000  C:\Windows\system32\GDI32.dll 
0x75f00000 - 0x75f08000  C:\Windows\system32\VERSION.dll 
0x77500000 - 0x775aa000  C:\Windows\system32\msvcrt.dll 
0x77b60000 - 0x77b7e000  C:\Windows\system32\IMM32.DLL 
0x76880000 - 0x76948000  C:\Windows\system32\MSCTF.dll 
0x77b10000 - 0x77b19000  C:\Windows\system32\LPK.DLL 
0x76290000 - 0x7630d000  C:\Windows\system32\USP10.dll 
0x75ef0000 - 0x75ef7000  C:\Windows\system32\fltlib.dll 
0x7c340000 - 0x7c396000  C:\Program Files\Java\jre6\bin\msvcr71.dll 
0x6d7f0000 - 0x6da97000  C:\Program Files\Java\jre6\bin\client\jvm.dll 
0x74900000 - 0x74932000  C:\Windows\system32\WINMM.dll 
0x775b0000 - 0x776f5000  C:\Windows\system32\ole32.dll 
0x763d0000 - 0x7645d000  C:\Windows\system32\OLEAUT32.dll 
0x748c0000 - 0x748fd000  C:\Windows\system32\OLEACC.dll 
0x75ec0000 - 0x75eec000  C:\Windows\system32\apphelp.dll 
0x6d7a0000 - 0x6d7ac000  C:\Program Files\Java\jre6\bin\verify.dll 
0x6d320000 - 0x6d33f000  C:\Program Files\Java\jre6\bin\java.dll 
0x6d280000 - 0x6d288000  C:\Program Files\Java\jre6\bin\hpi.dll 
0x76070000 - 0x76077000  C:\Windows\system32\PSAPI.DLL 
0x6d7e0000 - 0x6d7ef000  C:\Program Files\Java\jre6\bin\zip.dll 
0x015d0000 - 0x015f8000  C:\Windows\System32\Jpcap.dll 
0x763a0000 - 0x763cd000  C:\Windows\system32\WS2_32.dll 
0x77b20000 - 0x77b26000  C:\Windows\system32\NSI.dll 
0x045f0000 - 0x0463c000  C:\Windows\system32\wpcap.dll 
0x00920000 - 0x00938000  C:\Windows\system32\packet.dll 
0x75980000 - 0x75999000  C:\Windows\system32\iphlpapi.dll 
0x75940000 - 0x75975000  C:\Windows\system32\dhcpcsvc.DLL 
0x75e70000 - 0x75e9c000  C:\Windows\system32\DNSAPI.dll 
0x75f10000 - 0x75f24000  C:\Windows\system32\Secur32.dll 
0x75930000 - 0x75937000  C:\Windows\system32\WINNSI.DLL 
0x75900000 - 0x75922000  C:\Windows\system32\dhcpcsvc6.DLL 
0x6d600000 - 0x6d613000  C:\Program Files\Java\jre6\bin\net.dll 
0x756f0000 - 0x7572b000  C:\Windows\system32\mswsock.dll 
0x756e0000 - 0x756e5000  C:\Windows\System32\wship6.dll 

VM Arguments: 
java_command: dumptraffic 1 
Launcher Type: SUN_STANDARD 

Environment Variables: 
CLASSPATH=.;C:\Program Files\Java\jre6\lib\ext\QTJava.zip 
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\QuickTime\QTSystem\;C:\Ruby192\bin;C:\Program Files\Java\jdk1.6.0_20\bin 
USERNAME=Donald Taylor 
OS=Windows_NT 
PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 13, GenuineIntel 



--------------- S Y S T E M --------------- 

OS: Windows Vista Build 6002 Service Pack 2 

CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 15 stepping 13, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3 

Memory: 4k page, physical 2094396k(1168912k free), swap 4458364k(3080400k free) 

vm_info: Java HotSpot(TM) Client VM (17.1-b03) for windows-x86 JRE (1.6.0_22-b04), built on Sep 15 2010 00:56:36 by "java_re" with MS VC++ 7.1 (VS2003) 

time: Mon Nov 08 19:50:43 2010 
elapsed time: 0 seconds 
+0

Signaler à Sun, err Oracle ... déposer un bug avec les guides jpcap. Il n'a pas été publié depuis 2007 donc il est fort probable que vous ayez rencontré un bug assez sérieux ... – Jon

+0

Si vous ne le résolvez pas, vous pouvez jeter un oeil à http://jnetpcap.com/ – Jon

Répondre

2

Je n'ai pas la solution à votre problème, mais vous pourriez en trouver un sur le jpcap discussion board sur Google Groupes.

Balayage à travers les messages (mots-clés "jvm crash") J'en ai noté un disant que le problème s'est avéré être l'appel d'une méthode avec les mauvais paramètres. Vous pouvez donc essayer de vérifier que votre code utilise correctement l'API.

Je ne signalerais pas cela à Sun/Oracle. La preuve dans le vidage sur incident indique une erreur dans la façon dont quelque chose utilise JNI.

2

L'exécutez-vous en tant que root ou m $ équivalent? La collecte de paquets sur une interface réseau requiert de manière supplémentaire certains privilèges supplémentaires du système d'exploitation.

0

utiliser cette instruction dans votre boucle

if(captor.getPacket()==null || captor.getPacket()==Packet.EOF) break; 
1

La ligne clé est:

# The crash happened outside the Java Virtual Machine in native code. 

C'est, la bibliothèque jpcap utilise du code natif et le code natif crashait. C'est donc un bogue dans la bibliothèque jpcap, pas dans la JVM. De the documentation on Github:

Internally, jpcap implements bindings to the libpcap system library 
through JNI (the Java Native Interface). 

Maintenant, si vous voulez, vous pouvez essayer de déboguer le segfault en exécutant le tout dans GDB.

Cependant. Notant

jpcap utilizes libpcap, a widely deployed shared-library for capturing 
user-level packets. libpcap must be installed on your system in order 
to use jpcap. 

dans les documents, et compte tenu du fait qu'une cause commune de segfaults est une bibliothèque partagée manque, je suppose que vous ne disposez pas de la bibliothèque pcap installé sur votre système.