noyau java: fichier de base haché

introduction

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.

Expérience

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)

Carte avec add-symbol-file

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)

J'ai vu les informations de la pile!

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

noyau java: fichier de base haché
création de fichier java
[Java] Fonctionnement du système de fichiers
Lire le fichier de propriétés Java
[Design pattern] Bibliothèque de base Java
[Java] Créer un fichier temporaire
[Java] [Android] Lire le fichier ini
Lire le fichier de propriétés Java en C #
Télécharger des fichiers à l'aide de Java HttpURLConnection
Exécuter le fichier de commandes à partir de Java
Décompressez le fichier zip en Java
Enregistrer la sortie dans un fichier en Java
Java
Exemple de mise à jour de fichier EXCEL avec JAVA
A propos du traitement de la copie de fichiers en Java
Java
[Java] Comment utiliser la classe File
noyau java: compilateur HotSpot et tas C
Quelle est la meilleure lecture de fichier (Java)
Pourquoi Java appelle-t-il un fichier une classe?
java core: Vous ne pouvez pas atteindre safepoint et vous bloquer? !!
noyau Java: le compilateur HotSpot plante sur SIGSEGV
Lire le fichier xlsx en Java avec Selenium
Java (gestion des exceptions, threading, collection, fichier IO)
Java: placez le fichier de propriétés ResourceBundle n'importe où
Exemple pour décompresser le fichier gz en Java
[Java8] Recherchez le répertoire et récupérez le fichier