2015-06-18 26 views
7

Sto lavorando a una piccola app che dovrebbe firmare i documenti utilizzando la firma digitale e uscire. La firma può essere in un archivio PKCS # 12 (file .pfx) o su un dispositivo smartcard.JVM si blocca all'uscita

Lavorare con il file pfx è semplice e funziona bene.

Tuttavia, a volte utilizzando il dispositivo smartcard, il processo si blocca su Windows 8 PC.

Il documento è firmato correttamente, ma il processo non termina. Si blocca.

sto utilizzando PKCS # 11 fornitore del Sole - sun.security.pkcs11.SunPKCS11

Fondamentalmente sto facendo questo:

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

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

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

Ora ... anche se io chiamo System.exit(0) o un'eccezione alla fine del metodo main, posso vedere lo stacktrace nell'output ma il processo non termina.

Ho aggiunto un hook di arresto per vedere se è stato eseguito ed è, cioè la JVM sta cercando di fermarsi.

Il blocco si verifica raramente, solo su PC Windows 8. Provato con diverse smartcard e succede solo con le carte che usano cmp11.dll (le dll sono fornite dai fornitori delle smartcard).

Utilizzando la stessa DLL per la comunicazione con la smart card, tuttavia, funziona bene su Windows 7, XP o alcune di Windows 8 PC

Esecuzione con Java 8, Aggiornamento 45, su x86 o x64 di Windows 8

cercato di ottenere una discarica filo per vedere cosa sta appeso:

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..."); 
} 

Se eseguo jstack -l 3232 > dump.log 2>&1 quando Sleep... x è la stampa, tutto sembra OK.

Tuttavia, se eseguo jstack -F -l 3232 > dump2.log 2>&1 quando Exiting... viene stampato e la si blocca app (utilizzando -F perché il processo si blocca), ho ottenuto la seguente:

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 

posso vedere il processo con PID 3232 nel compito manager!

Qualche idea del motivo per cui non si sta interrompendo o perché jstack non riesce?

EDIT


Ok, hanno cercato di estrarre la firma in un processo separato, eseguirlo con Runtime.exec e poi uccidere con Process.destroy ma ... non sembra aiutare. Il processo figlio rimane ancora nel task manager.

Aaaaand ...ora non ho altra scelta, ma per farlo uccidere se stesso;. (

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


provato con Runtime.halt così Ancora non pone fine al processo ...

Apprezzerei qualsiasi idea!

+0

Hai provato a esaminare i thread nativi utilizzando [Process Explorer] (https://technet.microsoft.com/cs-cz/sysinternals/processexplorer)? Oppure puoi generare una discarica e provare ad analizzarla ... Buona fortuna! – vlp

+0

Came across [this] (http://stackoverflow.com/a/34012012/5128464) .... – vlp

risposta

0

ho qualche problema con sun.security.pkcs11.SunPKCS11 su Windows 8 PCs.This sta lavorando per me:

Runtime.getRuntime().exec("taskkill.exe /F /PID " + name.split("@")[0]); 
Thread.sleep(500);