[완료] 자바 에러인데요... 왜 에러가 나는지 모르겠습니다
글쓴이: tyolee83 / 작성시간: 화, 2005/08/23 - 11:33오전
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d6d80af, pid=2228, tid=2232
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_04-b05 mixed mode, sharing)
# Problematic frame:
# V [jvm.dll+0x980af]
#
# An error report file with more information is saved as hs_err_pid2228.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
이런 에러가 나버리네요 ㅠㅠ
정말 간단한 문자열 처리하는거거든요
이부분이에요 이 위에까진 println()으로 체크해봤구요
StringTokenizer info = new StringTokenizer(key, ":");
while(info.hasMoreTokens())
{
String first = info.nextToken();
String second = info.nextToken();
System.out.println(first+"==>"+second);
}
고수님들 부탁드립니다 ㅠㅠ
Forums:


VM 에러가 저 구문때문에 나는것 같진 않습니다만...풀소스를 올려주시면
VM 에러가 저 구문때문에 나는것 같진 않습니다만...풀소스를 올려주시면 좀 더 정확히 원인이 잡히지 않을까 생각하구요.
저 에러와는 상관없지만 올려주신 구문에서 토큰이 짝수가 아닐땐 마지막으로 second에 할당할 토큰이 없기 때문에 java.util.NoSuchElementException 이 nextToken() 에서 발생할 순 있겠군요.
hs_err_pid2228.log 파일 내용을 올려보세요.이런 에
hs_err_pid2228.log 파일 내용을 올려보세요.
이런 에러가 나는 경우 보통은 VM 버그입니다. 자바 코드때문에 나는 에러는 아니죠. 로그 파일 내용을 보면 더 상세히 알 수 있을 겁니다.
Re: 자바 에러인데요... 왜 에러가 나는지 모르겠습니다
일단 코드 자체에 문제가 조금 있습니다.
1. hasMoreTokens()를 호출하는 시점에 오직 하나의 토큰이 남아있어서 true를 리턴했다고 하면, 두번째 nextToken()호출(second = info.nextToken())은 문제를 발생할 소지가 있죠. 즉 위의 코드는 반드시 짝수개의 토큰이 있다는 전제하에서만 예외없는 동작이 보장됩니다.
2. hasMoreTokens()와 nextToken()은 한 쌍이라고 보시는 것이 좋습니다.
즉 hasMoreTokens()한번에 nextToken() 한 번인거죠.
while(st.hasMoreTokens()) { first = info.nextToken(); if (!info.hasMoreTokens()) break; // or something second = info.nextToken(); ... }3. StringTokenizer 자체는 deprecate되지 않았지만 Iterator로 대체 권고된 Enumeration에 의존하는 클래스입니다. 따라서 이 클래스를 사용하기 보다는 JDK1.4부터 추가된 String#split()메소드나 commons-lang의 StringUtils#split()메소드를 사용하시는 것이 더 좋을 것으로 생각됩니다.
뭐 이랬건 저랬건 VM이 뻗을 정도는 아닌데 말이죠... javadoc에는 NoSuchElementExeception이 발생한다고 나와있네요.
좀 더 확인해보고 버그 질러야 겠군요~
----
the smile has left your eyes...
로그 파일 올려봅니다.
# # An unexpected error has been detected by HotSpot Virtual Machine: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d6d80af, pid=2084, tid=2840 # # Java VM: Java HotSpot(TM) Client VM (1.5.0_04-b05 mixed mode, sharing) # Problematic frame: # V [jvm.dll+0x980af] # --------------- T H R E A D --------------- Current thread (0x00823ca0): JavaThread "main" [_thread_in_vm, id=2840] siginfo: ExceptionCode=0xc0000005, reading address 0x00000000 Registers: EAX=0x00000000, EBX=0x0082cf14, ECX=0x0006f98c, EDX=0x0082cbb4 ESP=0x0006f96c, EBP=0x0006f9b8, ESI=0x0006f98c, EDI=0x6d785bb8 EIP=0x6d6d80af, EFLAGS=0x00010246 Top of Stack: (sp=0x0006f96c) 0x0006f96c: 6d6c670f 00000000 00823ca0 6d6c95ce 0x0006f97c: 00823ca0 00000000 0006f9cc 00823d5c 0x0006f98c: 1000a628 6d64a9ab 00823ca0 0006f9b4 0x0006f99c: 6d6c6bd6 00823ca0 00000006 0000000e 0x0006f9ac: 6d785bb8 00823d5c 00000157 00000157 0x0006f9bc: 1000207d 00823d5c 0082cbb4 00000000 0x0006f9cc: 00000014 03360094 02e61f18 02dba63a 0x0006f9dc: 0082cf14 03360094 033600a8 ffffffff Instructions: (pc=0x6d6d80af) 0x6d6d809f: 44 24 04 24 fc 8b 00 8b 00 c3 8b 44 24 04 24 fc 0x6d6d80af: 8b 00 ff 74 24 04 8b c8 e8 93 fe ff ff c3 8b 44 Stack: [0x00030000,0x00070000), sp=0x0006f96c, free space=254k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0x980af] Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j jpcap.Jpcap.loopPacket(ILjpcap/JpcapHandler;)I+0 j Tcpdump.main([Ljava/lang/String;)V+180 v ~StubRoutines::call_stub --------------- P R O C E S S --------------- Java Threads: ( => current thread ) 0x008305b0 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=2708] 0x0082f890 JavaThread "CompilerThread0" daemon [_thread_blocked, id=328] 0x0082e6f0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=2788] 0x0082dac0 JavaThread "Finalizer" daemon [_thread_blocked, id=2552] 0x0082c850 JavaThread "Reference Handler" daemon [_thread_blocked, id=2608] =>0x00823ca0 JavaThread "main" [_thread_in_vm, id=2840] Other Threads: 0x0082ba00 VMThread [id=2604] 0x00831160 WatcherThread [id=2960] VM state:not at safepoint (normal execution) VM Mutex/Monitor currently owned by a thread: None Heap def new generation total 576K, used 389K [0x22be0000, 0x22c80000, 0x230c0000) eden space 512K, 76% used [0x22be0000, 0x22c415f8, 0x22c60000) from space 64K, 0% used [0x22c60000, 0x22c60000, 0x22c70000) to space 64K, 0% used [0x22c70000, 0x22c70000, 0x22c80000) tenured generation total 1408K, used 0K [0x230c0000, 0x23220000, 0x26be0000) the space 1408K, 0% used [0x230c0000, 0x230c0000, 0x230c0200, 0x23220000) compacting perm gen total 8192K, used 407K [0x26be0000, 0x273e0000, 0x2abe0000) the space 8192K, 4% used [0x26be0000, 0x26c45f18, 0x26c46000, 0x273e0000) ro space 8192K, 62% used [0x2abe0000, 0x2b0e93f0, 0x2b0e9400, 0x2b3e0000) rw space 12288K, 46% used [0x2b3e0000, 0x2b96fe20, 0x2b970000, 0x2bfe0000) Dynamic libraries: 0x00400000 - 0x0040c000 C:\Program Files\Java\jre1.5.0_04\bin\javaw.exe 0x7c930000 - 0x7c9cc000 C:\WINDOWS\system32\ntdll.dll 0x7c800000 - 0x7c92e000 C:\WINDOWS\system32\kernel32.dll 0x77f50000 - 0x77ff8000 C:\WINDOWS\system32\ADVAPI32.dll 0x77d80000 - 0x77e11000 C:\WINDOWS\system32\RPCRT4.dll 0x77cf0000 - 0x77d7f000 C:\WINDOWS\system32\USER32.dll 0x77e20000 - 0x77e66000 C:\WINDOWS\system32\GDI32.dll 0x77bc0000 - 0x77c18000 C:\WINDOWS\system32\MSVCRT.dll 0x762e0000 - 0x762fd000 C:\WINDOWS\system32\IMM32.DLL 0x62340000 - 0x62349000 C:\WINDOWS\system32\LPK.DLL 0x73f80000 - 0x73feb000 C:\WINDOWS\system32\USP10.dll 0x6d640000 - 0x6d7c9000 C:\Program Files\Java\jre1.5.0_04\bin\client\jvm.dll 0x76af0000 - 0x76b1b000 C:\WINDOWS\system32\WINMM.dll 0x6d280000 - 0x6d288000 C:\Program Files\Java\jre1.5.0_04\bin\hpi.dll 0x76ba0000 - 0x76bab000 C:\WINDOWS\system32\PSAPI.DLL 0x6d610000 - 0x6d61c000 C:\Program Files\Java\jre1.5.0_04\bin\verify.dll 0x6d300000 - 0x6d31d000 C:\Program Files\Java\jre1.5.0_04\bin\java.dll 0x6d630000 - 0x6d63f000 C:\Program Files\Java\jre1.5.0_04\bin\zip.dll 0x10000000 - 0x10012000 C:\Program Files\Java\jre1.5.0_04\bin\Jpcap.dll 0x719e0000 - 0x719f7000 C:\WINDOWS\system32\WS2_32.dll 0x719d0000 - 0x719d8000 C:\WINDOWS\system32\WS2HELP.dll 0x02db0000 - 0x02df1000 C:\WINDOWS\system32\wpcap.dll 0x02e00000 - 0x02e15000 C:\WINDOWS\system32\packet.dll 0x02e20000 - 0x02e30000 C:\WINDOWS\system32\WanPacket.dll 0x65fb0000 - 0x65fc1000 C:\WINDOWS\system32\NPPTools.dll 0x72780000 - 0x7287e000 C:\WINDOWS\system32\MFC42u.DLL 0x76970000 - 0x76aad000 C:\WINDOWS\system32\ole32.dll 0x770d0000 - 0x7715c000 C:\WINDOWS\system32\OLEAUT32.dll 0x76d10000 - 0x76d29000 C:\WINDOWS\system32\iphlpapi.dll 0x77bb0000 - 0x77bb8000 C:\WINDOWS\system32\VERSION.dll 0x61300000 - 0x6130d000 C:\WINDOWS\system32\MFC42LOC.DLL 0x5a0e0000 - 0x5a0f1000 C:\WINDOWS\system32\npp\ndisnpp.dll 0x5a480000 - 0x5a4b8000 C:\WINDOWS\system32\uxtheme.dll 0x63000000 - 0x63014000 C:\WINDOWS\system32\SynTPFcs.dll 0x74660000 - 0x746ab000 C:\WINDOWS\system32\MSCTF.dll 0x6d4c0000 - 0x6d4d3000 C:\Program Files\Java\jre1.5.0_04\bin\net.dll 0x71980000 - 0x719bf000 C:\WINDOWS\System32\mswsock.dll 0x76ed0000 - 0x76ef7000 C:\WINDOWS\system32\DNSAPI.dll 0x76f60000 - 0x76f68000 C:\WINDOWS\System32\winrnr.dll 0x76f10000 - 0x76f3c000 C:\WINDOWS\system32\WLDAP32.dll 0x76f70000 - 0x76f76000 C:\WINDOWS\system32\rasadhlp.dll VM Arguments: java_command: Tcpdump Environment Variables: CLASSPATH=.;.;C:\PROGRA~1\JMF21~1.1E\lib\sound.jar;C:\PROGRA~1\JMF21~1.1E\lib\jmf.jar;C:\PROGRA~1\JMF21~1.1E\lib;C:\WINDOWS\java\classes;. PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ESTsoft\ALZip\;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin;C:\Program Files\ESTsoft\ALZip\ USERNAME=이윤기 OS=Windows_NT PROCESSOR_IDENTIFIER=x86 Family 6 Model 11 Stepping 1, GenuineIntel --------------- S Y S T E M --------------- OS: Windows XP Build 2600 Service Pack 2 CPU:total 1 family 6, cmov, cx8, fxsr, mmx, sse Memory: 4k page, physical 514988k(203616k free), swap 1259144k(978792k free) vm_info: Java HotSpot(TM) Client VM (1.5.0_04-b05) for windows-x86, built on Jun 3 2005 02:10:41 by "java_re" with MS VC++ 6.0그리고 풀소스를 올리기는 좀 모한데... ㅠㅠ
풀소스를 보여드려야 알수 있는 건가요?
정 안되면 뒤에 풀소스 올려보도록 하겠습니다.
우선 출력되다가 에러나는걸 올려보겠습니다.
꼭 도와주세요 ㅠㅠ
//TODO
JNI랑 붙이셨나요? 에러가 난다면 거기서 잘못한게 아닐까요?
JNI랑 붙이셨나요? 에러가 난다면 거기서 잘못한게 아닐까요?
--
Passion is like genius; a miracle.
JNI요??
JNI가 뭐죠? ;;;;
모르는건데 ㅠㅠ
//TODO
자바 네이티브 인터페이스입니다.자바는 가상머신에서 돌아가기 때문에 시
자바 네이티브 인터페이스입니다.
자바는 가상머신에서 돌아가기 때문에 시스템 함수나 그리고 명령어등은 직접 호출할수 없습니다.그래서 시스템 함수나 명령어등이 필요한 모듈은 C,C++로 짠다음에 그것을 JNI로 링크시켜서 자바 상에서 호출합니다.
인생이란게 다 그런게 아니겠어요....? 뭘(?)
http://schutepen.egloos.com
풀소스 첨부합니다. 고수님들 많은 답변 부탁드려요 ㅠㅠ
import jpcap.*; import java.net.*; public class NetBlock implements JpcapHandler { public void handlePacket(Packet packet){ //패킷을 그대로 출력해 보기 System.out.println(packet); //패킷의 헤더 필드만 출력해 보기 System.out.println("헤더 : " + packet.header); //헤더의 출력을 읽을 수 있는 형태로 바꾸기 위한 StringBuffer 객체 선언 StringBuffer headerfield = new StringBuffer(); //패킷의 헤더를 한글자씩 StringBuffer 객체에 붙여쓰기 for(int i=0; i<packet.header.length; i++) headerfield.append((char)packet.header[i]); //읽을 수 있는 형태로 헤더 출력(그래도 읽을수는 없음-_-;) System.out.println("헤더 : " + headerfield); //패킷의 데이터 필드만 출력해 보기 System.out.println("데이터 : " + packet.data); //데이터의 출력을 읽을 수 있는 형태로 바꾸기 위한 StringBuffer 객체 선언 StringBuffer datafield = new StringBuffer(); //패킷의 데이터를 한글자씩 StringBuffer 객체에 붙여쓰기 for(int i=0; i<packet.data.length; i++) datafield.append((char)packet.data[i]); //읽을 수 있는 형태로 헤더 출력(데이터는 읽을 수 있게 나옴) System.out.println("데이터 : "+datafield); //내가 원하는 부분인 GET 부분을 저장하기 위한 문자열 변수 key 선언 String key = new String(); //데이터에서 GET으로 시작하는 부분을 key에 저장 // ################### 에러 발생 부분 ######################################## if(datafield.length()!=0 && datafield.substring(0,3).equals("GET")) key = datafield.toString().trim(); //key 출력해 보기 System.out.println(key); //key를 왼쪽부분과 오른쪽 부분으로 나누어야 한다. ":"을 기준으로 나누어서 문자열 배열에 저장 String[] info = key.split(":"); //카운터 변수 int i; //split으로 나누어진 문자열 배열에서 "Host" 찾기 for(i=0; i<info.length; i++) if(info[i].equalsIgnoreCase("Host")) break; //"Host" 다음 인덱스인 문자열이 내가 원하는 Hostname String hostname = info[i+1]; //hostname 출력해보기 System.out.println(hostname); // ################### 에러 발생 부분 ####################################### } public static void main(String[] args) throws java.io.IOException{ //lists 배열에 설치된 네트워크 어댑터 이름 저장 String[] lists=Jpcap.getDeviceDescription(); //Address 객체에 현재 컴퓨터의 IP 주소 저장 InetAddress Address = InetAddress.getLocalHost(); //필터링 옵션 문자열을 저장할 객체 선언 String Option = new String(); //설치된 네트워크 어댑터 출력 for(int i=0; i<lists.length; i++) { System.out.print((i+1) + "번째 네트워크 어댑터 : "); System.out.println(lists[i]); } //캡쳐를 실행할 네트워크 어댑터 선택받기 System.out.print("몇번째 네트워크 어댑터를 선택하시겠습니까?"); //숫자 입력받기. 아스키 값으로 들어오기 때문에 '0'만큼 빼줘야 함 int select = System.in.read() - '0'; System.out.println(lists[select-1] + "에서 캡쳐 시작!"); //필터링 옵션. src host가 현재 컴퓨터의 IP이고, 목적지 포트가 80인 패킷만 캡쳐하려 함 //promiscuous 모드를 끄려고 해도 safenet 때문에 말을 듣지 않아 옵션을 별도 설정하는 것임 Option = "src host "+Address.getHostAddress()+" and dst port 80"; //선택한 네트워크 어댑터를 open Jpcap jpcap=Jpcap.openDevice(Jpcap.getDeviceList()[select-1],1000,false,20); //필터를 Option대로 설정해줌 jpcap.setFilter(Option, true); //패킷 캡쳐 시작 jpcap.loopPacket(-1,new NetBlock()); } }위에분 말씀대로 StringTokenizer 대신 split 써봤구요
다해봐도 안되네요
소스 올리려고 주석을 최대한 많이 달아놨구요
에러난 부분 표시해 두었습니다.
정말 VM 버그일까요? ;;
이글 쓰고 1.4에서 컴파일을 한번 해봐야겠네요
아 빨리 해결해야 되는데 ㅠㅠ
꼭 좀 도와주세요 ㅠㅠ
//TODO
덧붙여서....
덧붙여서
제가 초보 프로그래머라 그러는데요
코딩 스타일이나 이런것도 지적 부탁드립니다 ^^
//TODO
제가 알기로는 윈도우 보안쪽에서 걸린거 같습니다.
자세히는 모르겠고요
일단 보안문제로 인해서 발생한걸로 보여집니다.
아마 서비스팩2를 설치하신거 같은데...
해결사항까지는 저도 찾아봐야겠구요. ^^
사용하시는 라이브러리중에 JNI 를 사용하시는게 있는거 같습니다.
사용하시는 라이브러리중에 JNI 를 사용하시는게 있는거 같습니다.
일단 이런 오류가 나오는 경우는 대부분 JVM 자체 버그일가능성이 크고요. 간혹 JNI 를 사용하면서 나는 오류가 있는데 이거는 정말 해결하기가 어려우실겁니다.
일단은 가장 최신 JVM 을 설치하고 테스트 해보심이....
현재 SDK 5.0으로 하고있는데;;
얼마전에 시작한거라서
5.0 update 4 깔아서 쓰고 있거든요...
근데 JNI를 쓰는 부분은 아무리 봐도 패킷 캡쳐하는 부분일텐데
캡쳐까지는 이상이 없고
문자열 처리하는곳에서 에러가 나는건 왜그럴까요....
옛날버전 SDK와 JRE를 사용해 봐야 하는걸까요? ㅠㅠ
//TODO
에혀 ㅠㅠ
JRE 1.4를 깔고 해봐도
똑같은 에러가 나네요
혹시나 하는 마음에 해봤는데 ㅠㅠ
패킷 데이터에서
호스트 네임만 잡아내면 되는데
위에 있는 방법 말고 다른 방법은 없을까요? ㅠㅠ
//TODO
라이브러리의 스레드 안정성을 확인하세요.
JpcapHandler 라는 것을 구현한것으로 보아 비동기식으로 동작하는 클래스같군요. 자바의 JNI를 이용하여 구현한 라이브러리들은, 그리고 특히 RAW_SOCKET을 다루는 경우에는 어떤 이유인지는 확실하지 않으나, 여러개의 스레드로 동작하는 경우 VM과 같이 뻗어버립니다. 1.3, 1.4, 1.5 버전 모두 그렇더군요.
작업 큐 같은것을 만들어서 동기식으로 한번에 하나씩 처리하도록 하는 별도의 스레드를 만들면 느리긴 하지만 이런 문제가 발생하지는 않을 것 같습니다.
위에분 말씀이... ㅠㅠ
제가 완전 초보라서
말이 이해가 안되는데요
대략 어떻게 하는것인지....
조금 자세하 설명해 주실수 없으신가요? ㅠㅠ
정말 죽겠네요 ㅠㅠ
//TODO
Re: 위에분 말씀이... ㅠㅠ
울지말고 웃으세요..
힘내시라고 한 여담이었습니다.
hotspot 의 고질적인 문제점
JNI 가 정상적으로 작동하였다는 가정하에...
가끔 hotspot VM 이 버그를 일으키는 상황은 빈번합니다. 보통은 코드캐시를 참조하다가 엄한 곳을 긁고 나서 뻗어버리더군요.
하위의 java버전에서 VM 실행옵션을 조절하여 hotspot 을 사용안하게 할 수 있습니다. 물론 이경우에도 jpcap 이 문제였다면 논외겠지만요.
여담입니다만, 1.5버전을 저도 사용을 해봤습니다만... 아직 성능쪽은 튜닝이 안된건지 어떻게 예전 버전보다 더 느리더군요... 과연 그들이 말하는 빠른 자바라는 것은 언제나 이루어질까요.
댓글 달기