text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
GDB nous pointe vers la ligne exacte où le segfault s'est produit, ce que la plupart des utilisateurs veulent lors du débogage:
gdb -q -nh main.out core
puis:
Reading symbols from main.out...done.
[New LWP 27479]
Core was generated by `./main.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
7 *(int*)(NULL) = i;
(gdb) bt
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
#1 0x000000000040072b in main (argc=1, argv=0x7ffec6739328) at main.c:28
qui nous dirige directement vers la ligne de buggy 7.
Analyse des binutils
Première:
file core
nous indique que le corefichier est en fait un fichier ELF:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
c'est pourquoi nous pouvons l'inspecter plus directement avec les outils binutils habituels.
Un rapide coup d'œil à la norme ELF montre qu'il existe en fait un type ELF qui lui est dédié:
Elf32_Ehd.e_type == ET_CORE
De plus amples informations sur le format sont disponibles à l'adresse suivante:
man 5 core
Ensuite:
readelf -Wa core
donne quelques conseils sur la structure du fichier. La mémoire semble être contenue dans les en-têtes de programme réguliers:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
NOTE 0x000468 0x0000000000000000 0x0000000000000000 0x000b9c 0x000000 0
LOAD 0x002000 0x0000000000400000 0x0000000000000000 0x001000 0x001000 R E 0x1000
LOAD 0x003000 0x0000000000600000 0x0000000000000000 0x001000 0x001000 R 0x1000
LOAD 0x004000 0x0000000000601000 0x0000000000000000 0x001000 0x001000 RW 0x1000
et il y a d'autres métadonnées présentes dans une zone de notes. Notamment, je suppose que le PC doit être là (TODO confirme):
gdb est le débogueur GNU qui peut être utilisé pour examiner le fichier core. BTW bt(backtrace) est une commande gdb utile pour examiner la pile d'appels de programme.
Réponses:
objdump
+gdb
exemple exécutable minimalTLDR:
objdump -s core
pour vider la mémoireGDB pour trouver la ligne défaillante, mentionnée précédemment à: Comment afficher les fichiers de base à des fins de débogage sous Linux?
Maintenant, pour une configuration de test pédagogique complète:
principal c
Compilez et exécutez pour générer le noyau:
Sortie:
GDB nous pointe vers la ligne exacte où le segfault s'est produit, ce que la plupart des utilisateurs veulent lors du débogage:
puis:
qui nous dirige directement vers la ligne de buggy 7.
Analyse des binutils
Première:
nous indique que le
core
fichier est en fait un fichier ELF:c'est pourquoi nous pouvons l'inspecter plus directement avec les outils binutils habituels.
Un rapide coup d'œil à la norme ELF montre qu'il existe en fait un type ELF qui lui est dédié:
De plus amples informations sur le format sont disponibles à l'adresse suivante:
Ensuite:
donne quelques conseils sur la structure du fichier. La mémoire semble être contenue dans les en-têtes de programme réguliers:
et il y a d'autres métadonnées présentes dans une zone de notes. Notamment, je suppose que le PC doit être là (TODO confirme):
objdump
peut facilement vider toute la mémoire avec:qui contient:
qui correspond exactement à la valeur stdout dans notre course.
Testé dans Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
la source
gdb est le débogueur GNU qui peut être utilisé pour examiner le fichier core. BTW
bt
(backtrace) est une commande gdb utile pour examiner la pile d'appels de programme.la source
Lorsque vous compilez le programme, utilisez l'option -g
gcc -g program.c
Si le fichier principal est créé, vous pouvez déboguer à l'aide de gdb sans utiliser l'option -g, les drapeaux de débogage ne seront pas activés.
la source
Si vous préférez utiliser l'outil de ligne de commande, vous pouvez utiliser gdb :
ou
Si vous aimez gui, installez ddd , puis ouvrez le programme pour déboguer et le fichier core.
la source
la source