# Shutdownhooks unter Eclipse-Debug



## Spacerat (28. Jan 2009)

Hallo

Ich experimentiere grad' ein wenig mit ShutdownHooks. Beim debuggen mit Eclipse ist mir allerdings aufgefallen, das diese Hooks beim beenden des Debugvorgangs gar nicht ausgeführt werden. Kann man das irgendwie ändern? Ich wüsste sonst nicht, wie man die Shutdownhooks anders debuggen könnte.

mfg Spacerat


----------



## Ebenius (29. Jan 2009)

```
public static void main(String[] args) {
  Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

    @Override
    public void run() {
      System.out.println("Shutdown hook called");
    }
  }));
}
```
Die Ausgabe erfolgt sowohl bei "Run" als auch bei "Debug". Breakpoint hab ich gesetzt, funktioniert auch.

Also nehme ich an, Du beendest den Prozess mit dem roten Stop-Button. Dann kann kein ShutdownHook aufgerufen werden, weil der Prozess (wie im Windows Task Manager: Prozess beenden oder in UNIX/Linux mit kill -9) unwiderruflich getötet wird. Da läuft dann kein ShutdownHook mehr, kein Finalizer, nichts. Der Prozess stirbt und das Betriebssystem macht den Dreck weg. :-D Ändern kann man das nicht. Das Signal lässt sich nichtmal in C abfangen.

Ebenius


----------



## Spacerat (29. Jan 2009)

Das ist sch...

Was solls. Der ShutdownHook wird soweit ich das mitbekommen habe auch ausgeführt, wenn man eine Konsolen-Anwendung mit "CTRL-C" bzw. "STRG-C" abbricht. Kann man dahingehend möglicherweise etwas machen? In Eclipse ist zwar eine Konsole eingebunden, aber diese lässt "STRG-C" ja nicht zu.

Wenn ich die Anwendung bis zum Ende Laufen lasse wird der ShutdownHook ja auch abgearbeitet. Aber die Anwendung muss immer recht lange laufen, bis sich ein für den Hook relevantes Ereignis (das Verändern einer Liste) einstellt. Das Ereignis selber ist normalerweise kein Grund für das beenden der Anwendung. Der ShutdownHook soll beim Beenden der Anwendung die Liste speichern, sofern sie verändert wurde. Nun habe ich einen bedingten Breakpoint dorthin gesetzt, wo so ein eintreten könnte. Dort bräuchte ich nun die Möglichkeit das Programm zu beenden.

mfg Spacerat


----------



## Ebenius (29. Jan 2009)

Spacerat hat gesagt.:
			
		

> Was solls. Der ShutdownHook wird soweit ich das mitbekommen habe auch ausgeführt, wenn man eine Konsolen-Anwendung mit "CTRL-C" bzw. "STRG-C" abbricht. Kann man dahingehend möglicherweise etwas machen? In Eclipse ist zwar eine Konsole eingebunden, aber diese lässt "STRG-C" ja nicht zu.


Unter UNIX/Linux: CTRL+C sendet SIGTERM(9), ein Debugger muss die Anwendung aber per SIGKILL(15) schließen. Näheres zu Signalen bspw. in der Wikipedia. In Windows ─ da lehne ich mich jetzt weit aus dem Fenster ─ entspricht ein SIGTERM in etwa dem Beenden eines Tasks und ein SIGKILL dem Beenden eines Prozesses.

Versuch doch mal, Deine Anwendung per TaskManager "Task beenden" zu beenden. Kommst Du dann zum Breakpoint im ShutDownHook?

Ebenius


----------

