집에서 java app.을 실행 하려 했더니 실행 즉시 app.이 닫혀 버리는 증상이 확인 되었습니다.

해당 app.을 다른 컴퓨터(Windows 7 구동)에서는 정상 작동 하는 것을 확인 했던 것이라 매우 이상한 상황!


Java crash log의 핵심만 요약 하면 아래와 같습니다.

. . .

# A fatal error has been detected by the Java Runtime Environment:

#

#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000062146adf, pid=8912, tid=0x00000000000009b8

#

# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)

# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode windows-amd64 compressed oops)

# Problematic frame:

# C  [msvcr100.dll+0x36adf]


. . .

. . .


Stack: [0x000000001f680000,0x000000001f780000],  sp=0x000000001f77ecc8,  free space=1019k

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)

C  [msvcr100.dll+0x36adf]


Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)

J 2701  sun.awt.shell.Win32ShellFolder2.getDisplayNameOf(JJI)Ljava/lang/String; (0 bytes) @ 0x00000000028412c9 [0x0000000002841280+0x49]

j  sun.awt.shell.Win32ShellFolder2.access$1600(JJI)Ljava/lang/String;+4

j  sun.awt.shell.Win32ShellFolder2$13.call()Ljava/lang/String;+15

j  sun.awt.shell.Win32ShellFolder2$13.call()Ljava/lang/Object;+1

J 1987 C1 java.util.concurrent.FutureTask.run()V (126 bytes) @ 0x0000000002d4764c [0x0000000002d47400+0x24c]

. . .

. . .


결론은 아래의 bug report를 보면 되는데.

요약 하면 Windows 10 최신 update로 인하여 GOD mode를 설정한 폴더명이 NULL 로 처리 되어 java awt내부 code에서 crash를 일어키는 현상 입니다.

MS를 미워할 수는 없는것이 결국 java에서 exception handling을 안해서 여서...


그런데 수정 내용을 보니, 원 Java 9에서만 수정 반영 했다는 것! 

Java 8은 그냥 쌩....


그래서 해결 방법은 만일 바탕화면에 GOD mode 설정한 폴더가 있다면 (이름이 없습니다) 이것을 삭제 하거나 다른 폴더로 이동 후 java app.을 실행 하면 됩니다.


Java 9 을 사용할 계획이 없다면 가장 적절한 선택일 것 같습니다.


위 내용에 대한 java bug report는 아래 URL에서 확인 가능 합니다.

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8179014


관련 사항은 아래와 같이 여러 리포트가 있습니다.

Backport:
Backport:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Relates:
Relates:


이로서 Bug는 가만히 있어도 (남들에 의해서) 만들어 진다는 진리? 를 아주 큰 S/W 기업에서도 확인이 되었네요^^ (그렇다고 엄청난 예외 code를 넣는 것도 쉽지 않으니)


보너스~ 해당 문제 해결 code 변경 사항은 아래와 같습니다.

http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/a7c8147f1891


files src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp test/javax/swing/JFileChooser/GodMode/JFileChooserTest.java

--- a/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp	Tue May 09 12:19:08 2017 -0700
+++ b/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp	Thu May 11 12:41:35 2017 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -205,14 +205,19 @@
 static jstring jstringFromSTRRET(JNIEnv* env, LPITEMIDLIST pidl, STRRET* pStrret) {
     switch (pStrret->uType) {
         case STRRET_CSTR :
-            return JNU_NewStringPlatform(env, reinterpret_cast<const char*>(pStrret->cStr));
+            if (pStrret->cStr != NULL) {
+                return JNU_NewStringPlatform(env, reinterpret_cast<const char*>(pStrret->cStr));
+            }
+            break;
         case STRRET_OFFSET :
             // Note : this may need to be WCHAR instead
             return JNU_NewStringPlatform(env,
                                          (CHAR*)pidl + pStrret->uOffset);
         case STRRET_WSTR :
-            return env->NewString(reinterpret_cast<const jchar*>(pStrret->pOleStr),
-                static_cast<jsize>(wcslen(pStrret->pOleStr)));
+            if (pStrret->pOleStr != NULL) {
+                return env->NewString(reinterpret_cast<const jchar*>(pStrret->pOleStr),
+                    static_cast<jsize>(wcslen(pStrret->pOleStr)));
+            }
     }
     return NULL; 

} 


즐 개발 / 즐 컴퓨팅 되시길~


+ Recent posts