Die Erklärung hier ist nur eine Frage des Ausprobierens als Voraussetzung. Sie sollten nicht erwarten, dass gültige Informationen aus einer gehackten, unvollständigen Kerndatei stammen. Wenn Sie es ein wenig versuchen und es nicht funktioniert, können Sie Zeit sparen, indem Sie aufgeben und darüber nachdenken, die Kerndatei beim nächsten Mal korrekt abzurufen.
Ich habe die in Java Core: HotSpot-Compiler mit SIGSEGV abgestürzt verwendete Kerndatei als Originalmaterial verwendet.
Die ursprüngliche Kerndatei hat eine Größe von ca. 240 MB, aber versuchen Sie, sie wie folgt auf ca. 200 MB zu schneiden.
$ dd if=./core.15045 of=./core.x bs=1024k count=200
200+0 Aufzeichnungseingabe
200+0 Datensatzausgabe
209715200 Bytes(210 MB)Kopiert, 4.11797 Sekunden, 50.9 MB/Sekunden
$ ls -l core.15045 core.x
-rw-r--r--1 root root 240611328 23. April 11:51 core.15045
-rw-r--r--1 imai imai 209715200 25. April 18:37 core.x
$
$ objdump -a ./core.x
objdump:Warnung: ./core.x ist abgeschnitten:Erwartete Größe der Kerndatei>=240611328. Gefundene Größe: 209715200。
./core.x:Dateiformat elf64-x86-64
./core.x
Wenn Sie sich diese gehackte Kerndatei mit gdb ansehen, werden die Stapelinformationen usw. nicht korrekt angezeigt.
$ gdb /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/jre-abrt/bin/java ./core.x
...Unterlassung...
Core was generated by `java -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomca'.
Program terminated with signal 6, Aborted.
#0 0x00007f50747b01f7 in ?? ()
(gdb) bt
#0 0x00007f50747b01f7 in ?? ()
#1 0x00007f50747b18e8 in ?? ()
#2 0x0000000000000020 in ?? ()
#3 0x0000000000000000 in ?? ()
(gdb)
(gdb) info shared
Cannot access memory at address 0x7f507538f128
Cannot access memory at address 0x7f507538f120
No shared libraries loaded at this time.
(gdb)
Stellen Sie die Informationen darüber, welche Bibliothek welcher Adresse zugeordnet ist, manuell ein, damit Sie sie mit gdb überprüfen können. Verwenden Sie zunächst den Befehl readelf, um eine grobe Kartenadresse aus dem Notizabschnitt der Kerndatei zu finden. Sie können dann bestimmen, welche Adresse zugeordnet werden soll, indem Sie der Adresse die Startadresse des Textabschnitts der gemeinsam genutzten Bibliothek hinzufügen.
$ readelf -n ./core.x
...Unterlassung...
0x00007f507477a000 0x00007f507477b000 0x0000000000000015
/usr/lib64/libz.so.1.2.7
0x00007f507477b000 0x00007f5074933000 0x0000000000000000
/usr/lib64/libc-2.17.so
0x00007f5074933000 0x00007f5074b33000 0x00000000000001b8
/usr/lib64/libc-2.17.so
0x00007f5074b33000 0x00007f5074b37000 0x00000000000001b8
/usr/lib64/libc-2.17.so
...
$ readelf -S /usr/lib64/libc-2.17.so | grep text
[12] .text PROGBITS 000000000001f480 0001f480
$
Von den oben genannten wurde es zuerst angezeigt/usr/lib/64/libc-2.18.Bestätigt mit der Startadresse von so und readelf.Fügen Sie die Startposition des Textes hinzu, um die Adresse zu finden.
(gdb) p/x 0x00007f507477b000 + 0x000000000001f480
$1 = 0x7f507479a480
(gdb)
An dieser Adresse libc-2.17.Karte so.
(gdb) add-symbol-file /usr/lib64/libc-2.17.so 0x7f507479a480
add symbol table from file "/usr/lib64/libc-2.17.so" at
.text_addr = 0x7f507479a480
(y or n) y
Reading symbols from /usr/lib64/libc-2.17.so...(no debugging symbols found)...done.
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7.x86_64
(gdb)
Berechnen Sie wie oben die Adresse und ordnen Sie jede gemeinsam genutzte Bibliothek zu. Wenn es sich um Java Core handelt, sind die Hauptbibliotheken libc, libpthread, libjvm. Überprüfen Sie die Stapelinformationen nach dem Zuordnen dieser drei erneut mit gdb.
(gdb) add-symbol-file /usr/lib64/libc-2.17.so 0x7f507479a480
(gdb) add-symbol-file /usr/lib64/libpthread-2.17.so 0x7f5074f55900
(gdb) add-symbol-file /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/jre/lib/amd64/server/libjvm.so 0x7f507390b110
(gdb)
libc, libpthread,Nachdem Sie libjvm zugeordnet haben, überprüfen wir den Stapel mit bt.
(gdb) bt
#0 0x00007f50747b01f7 in raise ()
#1 0x00007f50747b18e8 in abort ()
#2 0x00007f5073f18de9 in os::abort (dump_core=<optimized out>) at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/os/linux/vm/os_linux.cpp:1635
#3 0x00007f50740a7bcf in VMError::report_and_die (this=this@entry=0x7f5070c49bd0)
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/utilities/vmError.cpp:1074
#4 0x00007f5073f21ff7 in JVM_handle_linux_signal (sig=11, info=0x7f5070c49e30, ucVoid=0x7f5070c49d00, abort_if_unrecognized=<optimized out>)
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp:531
#5 <signal handler called>
#6 0x00007f5073f646c0 in Phase::Phase (this=0x0, pnum=Phase::Compiler)
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/opto/phase.cpp:83
#7 0x00007f5073b78711 in Compile::Compile (this=0x0, ci_env=0x7f5070c4ba40, compiler=0x7f506c072730, target=0x7f503c0ba4f0, osr_bci=-1, subsume_loads=<optimized out>,
do_escape_analysis=true, eliminate_boxing=true) at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/opto/compile.cpp:683
#8 0x00007f5073ae3d30 in C2Compiler::compile_method (this=0x7f506c072730, env=0x7f5070c4ba40, target=0x7f503c0ba4f0, entry_bci=-1)
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/opto/c2compiler.cpp:137
#9 0x00007f5073b7f788 in CompileBroker::invoke_compiler_on_method (task=task@entry=0x7f506c1595c0)
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/compiler/compileBroker.cpp:1761
#10 0x00007f5073b80b00 in CompileBroker::compiler_thread_loop ()
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/compiler/compileBroker.cpp:1597
#11 0x00007f5074059cfa in JavaThread::thread_main_inner (this=this@entry=0x7f506c0a8800)
at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/runtime/thread.cpp:1687
#12 0x00007f507405a07f in JavaThread::run (this=0x7f506c0a8800) at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/share/vm/runtime/thread.cpp:1667
#13 0x00007f5073f17de2 in java_start (thread=0x7f506c0a8800) at /usr/src/debug/java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64/openjdk/hotspot/src/os/linux/vm/os_linux.cpp:910
#14 0x00007f5074f57e25 in start_thread ()
#15 0x00007f507487334d in clone ()
(gdb)
Auf diese Weise kann sogar eine abgeschnittene Kerndatei Informationen bereitstellen.
Recommended Posts