L'explication ici est juste une question de l'essayer comme prémisse. Vous ne devez pas vous attendre à ce que des informations valides proviennent d'un fichier core incomplet et haché. Si vous essayez un peu et que cela ne fonctionne pas, vous pouvez gagner du temps en abandonnant et en pensant à obtenir le fichier core correctement la prochaine fois.
J'ai utilisé le fichier core utilisé dans java core: le compilateur HotSpot s'est écrasé avec SIGSEGV comme matériau d'origine.
Le fichier de base d'origine a une taille d'environ 240 Mo, mais essayez de le couper à environ 200 Mo comme suit.
$ dd if=./core.15045 of=./core.x bs=1024k count=200
200+0 Entrée d'enregistrement
200+0 sortie d'enregistrement
209715200 octets(210 MB)Copié, 4.11797 secondes, 50.9 MB/Secondes
$ ls -l core.15045 core.x
-rw-r--r--1 racine racine 240611328 23 avril 11:51 core.15045
-rw-r--r--1 imai imai 209715200 25 avril 18:37 core.x
$
$ objdump -a ./core.x
objdump:avertissement: ./core.x est tronqué:Taille attendue du fichier core>=240611328. Taille trouvée: 209715200。
./core.x:Format de fichier elf64-x86-64
./core.x
Si vous regardez ce fichier core haché avec gdb, les informations de pile, etc. ne seront pas affichées correctement.
$ 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
...Omission...
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)
Définissez manuellement les informations sur quelle bibliothèque est mappée à quelle adresse afin que vous puissiez les vérifier avec gdb. Tout d'abord, utilisez la commande readelf pour trouver une adresse de carte approximative dans la section note du fichier principal. Vous pouvez ensuite déterminer quelle adresse mapper en ajoutant l'adresse de début de la section .text de la bibliothèque partagée à cette adresse.
$ readelf -n ./core.x
...Omission...
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
$
Parmi les éléments ci-dessus, il a été affiché en premier/usr/lib/64/libc-2.18.Confirmé avec l'adresse de départ de so et readelf.Ajoutez la position de départ du texte pour trouver l'adresse.
(gdb) p/x 0x00007f507477b000 + 0x000000000001f480
$1 = 0x7f507479a480
(gdb)
À cette adresse, libc-2.17.Carte donc.
(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)
Comme ci-dessus, calculez l'adresse et mappez chaque bibliothèque partagée. S'il s'agit du noyau Java, les bibliothèques principales sont libc, libpthread, libjvm, donc après avoir mappé ces trois éléments, vérifiez à nouveau les informations de la pile avec 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,Après avoir mappé libjvm, vérifions la pile avec 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)
De cette manière, même un fichier core tronqué peut fournir des informations.
Recommended Posts