2015-06-18 14 views
7

Tôi đang làm việc trên một ứng dụng nhỏ nên ký các tài liệu bằng chữ ký số và thoát. Chữ ký có thể nằm trong kho lưu trữ PKCS # 12 (tệp .pfx) hoặc trên thiết bị thẻ thông minh.JVM treo trên lối ra

Làm việc với tệp pfx dễ dàng và hoạt động tốt.

Tuy nhiên, đôi khi sử dụng thiết bị thẻ thông minh, quy trình bị treo trên máy tính Windows 8.

Tài liệu được ký chính xác nhưng quá trình này không chấm dứt. Nó chỉ bị treo.

Tôi đang sử dụng PKCS # 11 nhà cung cấp của Mặt Trời - sun.security.pkcs11.SunPKCS11

Về cơ bản tôi đang làm điều này:

SunPKCS11 provider = new SunPKCS11(configuration); 
Security.addProvider(provider); 

..... some work ..... 

provider.logout() 
Security.removeProvider(provider); 

Bây giờ ... thậm chí nếu tôi gọi System.exit(0) hoặc ném một ngoại lệ ở cuối của phương thức main, tôi có thể thấy stacktrace trong đầu ra nhưng quá trình này không chấm dứt.

Tôi đã thêm móc tắt để xem nó có được thực hiện hay không, tức là JVM đang cố gắng dừng.

Rất hiếm khi xảy ra sự cố treo trên máy tính chạy Windows 8. Đã thử với các thẻ thông minh khác nhau và nó chỉ xảy ra với các thẻ sử dụng cmp11.dll (các dll được cung cấp từ các nhà cung cấp thẻ thông minh).

Sử dụng cùng một dll để giao tiếp với các thẻ thông minh, tuy nhiên, hoạt động tốt trên Windows 7, XP hoặc một số Windows 8 máy tính

Chạy nó với Java 8, Cập nhật 45 tuổi, ở hai x86 hoặc x64 Windows 8

Cố gắng để có được một bãi chứa thread để xem những gì đang treo:

public static void main(String[] args) { 
    // do my job, register provider, sign documents, remove provider ... 

    for(int i = 0; i < 20; ++i) { 
    System.err.println("Sleep... " + i); 
    Thread.sleep(2 * 1000); 
    } 
    System.err.println("Exiting..."); 
} 

Nếu tôi thực hiện jstack -l 3232 > dump.log 2>&1 khi Sleep... x là in ấn, tất cả mọi thứ có vẻ OK.

Tuy nhiên, nếu tôi thực hiện jstack -F -l 3232 > dump2.log 2>&1 khi Exiting... được in và treo ứng dụng (sử dụng -F bởi vì quá trình bị treo), tôi đã nhận như sau:

Attaching to process ID 3232, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 25.45-b02 
Deadlock Detection: 

No deadlocks found. 

Thread Exception in thread "main"   
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at sun.tools.jstack.JStack.runJStackTool(JStack.java:140) 
     at sun.tools.jstack.JStack.main(JStack.java:106) 
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: GetThreadIdBySystemId failed! 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.getThreadIdFromSysId0(Native Method) 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.getThreadIdFromSysId(WindbgDebuggerLocal.java:284) 
     at sun.jvm.hotspot.debugger.windbg.amd64.WindbgAMD64Thread.getThreadID(WindbgAMD64Thread.java:88) 
     at sun.jvm.hotspot.debugger.windbg.amd64.WindbgAMD64Thread.toString(WindbgAMD64Thread.java:81) 
     at java.lang.String.valueOf(String.java:2982) 
     at java.io.PrintStream.print(PrintStream.java:683) 
     at sun.jvm.hotspot.runtime.win32_amd64.Win32AMD64JavaThreadPDAccess.printThreadIDOn(Win32AMD64JavaThreadPDAccess.java:114) 
     at sun.jvm.hotspot.runtime.JavaThread.printThreadIDOn(JavaThread.java:265) 
     at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:79) 
     at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45) 
     at sun.jvm.hotspot.tools.JStack.run(JStack.java:66) 
     at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260) 
     at sun.jvm.hotspot.tools.Tool.start(Tool.java:223) 
     at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118) 
     at sun.jvm.hotspot.tools.JStack.main(JStack.java:92) 
     ... 6 more 

tôi có thể thấy quá trình với PID 3232 trong nhiệm vụ giám đốc!

Bất kỳ ý tưởng nào tại sao nó không chấm dứt hoặc tại sao jstack không thành công?

EDIT


Ok, đã cố gắng để trích xuất các ký trong một quá trình riêng biệt, thực hiện nó với Runtime.exec và sau đó giết nó với Process.destroy nhưng ... dường như không giúp đỡ. Quá trình con vẫn còn trong trình quản lý tác vụ.

Aaaaand ...bây giờ tôi không có lựa chọn nào khác ngoài việc làm cho nó giết chính nó;. (

try { 
    String name = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); 
    Runtime.getRuntime().exec("taskkill.exe /F /PID " + name.split("@")[0]); 
} 
catch(Throwable t) { 
    Runtime.getRuntime().exec("taskkill.exe /F /IM java.exe"); 
} 

EDIT 2


Cố gắng với Runtime.halt cũng Vẫn không chấm dứt quá trình ...

Tôi sẽ đánh giá cao bất kỳ ý tưởng nào!

+0

Bạn đã thử kiểm tra các chuỗi gốc bằng cách sử dụng [Process Explorer] (https://technet.microsoft.com/cs-cz/sysinternals/processexplorer)? Hoặc bạn có thể tạo ra một bãi chứa và cố gắng phân tích nó ... Chúc may mắn! – vlp

+0

Đã qua [this] (http://stackoverflow.com/a/34012012/5128464) .... – vlp

Trả lời

1

Điều này sẽ không giải quyết nguyên nhân gốc rễ của bạn, nhưng phương pháp này có thể được sử dụng để buộc JVM chấm dứt:

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#halt(int)

Như Javadoc nói, sử dụng hết sức thận trọng ;-)

+1

Đã bỏ lỡ đề cập đến nó, nhưng tôi đã thử nó. Hiệu ứng tương tự .... –

0

Tôi có một số vấn đề với sun.security.pkcs11.SunPKCS11 trên Windows 8 PCs.This đang làm việc cho tôi:

Runtime.getRuntime().exec("taskkill.exe /F /PID " + name.split("@")[0]); 
Thread.sleep(500); 
Các vấn đề liên quan