JVM-Absturz aufgrund von SIGSEGV

8

Unser Server hängt wegen eines SIGSEGV-Fehlers.

Ein schwerwiegender Fehler wurde von der Java Runtime Environment erkannt:

%Vor%

Ich bin neugierig zu wissen, was die Ursache dafür sein könnte?

Jede Hilfe wird sehr geschätzt .. Danke ..

    
Manisankar 09.02.2015, 06:16
quelle

3 Antworten

7
  

Signalbeschreibung

     

SIGSEGV, SIGBUS, SIGFPE, SIGPIPE, SIGILL -   Wird in der Implementierung für die implizite Nullprüfung usw. verwendet.

     

SIGQUIT Thread-Dump-Unterstützung - Zum Ablegen von Java-Stack-Traces im Standardfehler-Stream. (Optional.)

     

SIGTERM, SIGINT, SIGHUP - Wird verwendet, um den Shutdown-Hook-Mechanismus (java.lang.Runtime.addShutdownHook) zu unterstützen, wenn die VM abnormal beendet wird. (Optional.)

     

SIGUSR1 - Wird in der Implementierung der Methode java.lang.Thread.interrupt verwendet. (Konfigurierbar.) Wird nicht mit Solaris 10 OS verwendet. Reserviert unter Linux.   SIGUSR2 Wird intern verwendet. (Konfigurierbar.) Wird nicht mit Solaris 10 OS verwendet.   SIGABRT Die HotSpot VM behandelt dieses Signal nicht. Stattdessen ruft es die Abbruchfunktion nach der fatalen Fehlerbehandlung auf. Wenn eine Anwendung dieses Signal verwendet, sollte sie den Prozess beenden, um die erwartete Semantik beizubehalten.

Das fatale Fehlerprotokoll zeigt an, dass der Absturz in einer systemeigenen Bibliothek aufgetreten ist. Möglicherweise liegt ein Fehler im systemeigenen Code oder im JNI-Bibliothekscode vor. Der Absturz könnte natürlich durch etwas anderes verursacht werden, aber die Analyse der Bibliothek und aller Kerndateien oder Absturzspeicherauszüge ist ein guter Ausgangspunkt.

In diesem Fall ist ein SIGSEGV mit einem Thread aufgetreten, der in der Bibliothek libdtagentcore.so ausgeführt wird. In einigen Fällen manifestiert sich ein Fehler in einer nativen Bibliothek als Absturz im Java-VM-Code. Stellen Sie sich den folgenden Absturz vor, bei dem ein JavaThread im Zustand _thread_in_vm fehlschlägt (was bedeutet, dass Java VM im Code ausgeführt wird)

  • Wenn Sie in einer nativen Anwendungsbibliothek einen Absturz haben (wie in Ihrem Fall), können Sie möglicherweise den nativen Debugger an die Kerndatei oder den Absturzabzug anhängen, falls dieser verfügbar ist. Abhängig vom Betriebssystem ist der native Debugger dbx, gdb oder windbg.
  • Ein anderer Ansatz besteht darin, mit der Option '-Xcheck: jni' in der Befehlszeile zu starten. Mit dieser Option können nicht alle Probleme mit dem JNI-Code gefunden werden, es kann jedoch helfen, eine erhebliche Anzahl von Problemen zu identifizieren.
  • Wenn die native Bibliothek, in der der Absturz aufgetreten ist, Teil der Java-Laufzeitumgebung ist (z. B. awt.dll, net.dll usw.), ist es möglich, dass Sie auf einen Bibliotheks- oder API-Fehler gestoßen sind. Wenn Sie nach weiterer Analyse zu dem Schluss kommen, dass es sich um einen Bibliotheks- oder API-Fehler handelt, sammeln Sie möglichst viele Daten und reichen Sie einen Fehler oder einen Supportanruf ein.
CodeWalker 09.02.2015 06:46
quelle
3

Es gibt eine eingängige Situation im JNI-Code: wenn ein solcher Code das SIGSEGV-Signal z.B. weil es alle Signale blockiert (ziemlich gewöhnlicher Ansatz in C-Code mit Threads, wie sichergestellt werden kann, dass nur Hauptthread Signale verarbeitet) AND ruft 'zurück' Java VM (alias Callback) auf, dann kann es ziemlich zufällig sein SIGSEGV-ausgelöstes Abbrechen des Prozesses.
Und es ist praktisch nichts falsch - SIGSEGV wird tatsächlich von Java VM ausgelöst, um bestimmte Bedingungen im Speicher zu erkennen (es fungiert als Speicherbarriere ... usw.) und erwartet, dass ein solches Signal von Java VM gehandhabt wird. Leider, wenn SIGSEGV blockiert ist, wird 'Standard' SIGSEGV Reaktion ausgelöst = & gt; VM-Prozess stürzt ab.

    
Ales Teska 11.02.2015 01:28
quelle
3

Es sagt Ihnen, dass ein Fehler in Code aufgetreten ist, der von libdtagentcore.so geladen wurde. Genauer gesagt geschah dies in der Funktion restrict und im Offset 0x506f6 . Der erste erwähnte Offset ( 0xb7aaa ) wird innerhalb der Bibliothek selbst ausgeglichen. Wenn es mit Debugging-Symbolen (-g) erstellt wurde, können Sie den Code betrachten, der die Ausnahme verursacht hat, unter Linux etwas wie folgt:

%Vor%

Falls dies von jemandem unter Windows gelesen wird, lesen Sie Ссылка

Weitere Einzelheiten finden Sie in Zypern

    
Steves 16.02.2017 12:01
quelle

Tags und Links