Michael HönnigMichael Hönnig
Gerade traf mich beim Debuggen ein seltsames Verhalten meines Java-Programms unter Eclipse. Die Anwendung ist multithreaded und der wichtigste Thread wurde trotz Breakpoint auf erster Zeile in der run()-Methode oft gar nicht erst betreten, bzw. die Anwendung terminierte während Eclipse auf dieser Zeile angehalten hatte. Kein System.exit() meiner Anwendung wurde dabei durchlaufen. Um den "Schuldigen" zu finden, installierte ich temporär einen eigenen Security-Manager:
...
final SecurityManager securityManager = new SecurityManager() {
    public void checkPermission(Permission permission) {
        if ("exitVM".equals(permission.getName())) {
            throw new SecurityException(
                    "somebody is calling System.exit()");
        }
    }
};

@Before
public void init() {
    System.setSecurityManager(securityManager);
}
Dazu gleich noch einen Breakpoint auf die o.g. Exception gesetzt und ... erstaunlicherweise funktionierte die Anwendung auf Anhieb wieder, ohne dass aber die obige exit()-Falle überhaupt durchlaufen wird. Dann fiel es mir wie Schuppen von den Augen: Die eigentliche Test-Routine terminierte! Denn diese wartete mit sleep() einen bestimmten Zeitraum, um dann den Thread zu terminieren. Im Debug-Prozess wurde dieser Zeitpunkt erreicht, bevor der Thread überhaupt jemals gestartet war. Nun, bewahrt hilft dieser Beitrag, anderen Entwicklern vor dieser Falle.