GNU/Linux >> Tutoriels Linux >  >> Linux

gdb - liste la source de la fonction actuelle sans taper son nom

gdbtui peut être utile pour afficher la source pendant le débogage.


Lorsque vous êtes arrêté dans une fonction tapez bt pour backtrace.Backtrace listera la pile actuelle. L'élément en haut, #0, est généralement la fonction qui vous intéresse et le fichier source et le numéro de ligne sont également répertoriés.

Par exemple :

(gdb) bt
#0  myClass::EntityTypeStruct::readAttributes (this=0x7fffd00066e0, buf=0x7fffd0006020 "", len=48)
    at /team/project/src/EntityTypeStruct.cc:55
#1  0x000000000044ca86 in workerThread (ts=0x7fffea71dcc0)
    at /team/project/src/threads/workerThread.cc:219
#2  0x00007ffff775e9d1 in start_thread () from /lib64/libpthread.so.0
#3  0x00007ffff6c07b5d in clone () from /lib64/libc.so.6

Voir http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42 pour plus d'informations.

De plus, lorsque vous définissez un point d'arrêt, vous pouvez spécifier des commandes qui s'exécutera à chaque fois que vous atteindrez ce point d'arrêt. Voir http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35

Ainsi, si vous savez combien de lignes il y a dans votre fonction, vous pouvez définir une commande pour répertorier toutes les lignes source de la fonction :

(gdb) break myClass::EntityTypeStruct::readAttributes
Breakpoint 1 at 0x61ec3b: file /team/project/src/EntityTypeStruct.cc, line 38.
(gdb) commands 1
list 38,104
end

(gdb) help list
List specified function or line.
With no argument, lists ten more lines after or around previous listing.
"list -" lists the ten lines before a previous ten-line listing.
One argument specifies a line, and ten lines are listed around that line.
Two arguments with comma between specify starting and ending lines to list.
Lines can be specified in these ways:
  LINENUM, to list around that line in current file,
  FILE:LINENUM, to list around that line in that file,
  FUNCTION, to list around beginning of that function,
  FILE:FUNCTION, to distinguish among like-named static functions.
  *ADDRESS, to list around the line containing that address.
With two args if one is empty it stands for ten lines away from the other arg.

Le *ADDRESS c'est ce qui est intéressant.

Sur x86/x64, le pointeur actuel est en rip inscrivez-vous donc :

(gdb) list *$pc
0x7ffff7b018a0 is at ../sysdeps/unix/syscall-template.S:82.
77  in ../sysdeps/unix/syscall-template.S

L'exemple provient de cat commande car je n'ai rien avec les informations de débogage à portée de main.


La commande 'frame' affiche le nom de la fonction et l'emplacement de la ligne actuelle et définit la ligne actuelle de la liste sur la ligne exécutable actuelle.

set listsize 17
frame
list

liste les 8 lignes entourant la ligne courante.


Linux
  1. 11 guides de ligne de commande Linux dont vous ne devriez pas vous passer

  2. L'invite du terminal écrase la ligne actuelle ?

  3. Mettre la commande d'historique sur la ligne de commande sans l'exécuter ?

  4. Pourquoi la saisie semi-automatique ne fonctionne-t-elle pas lors de la saisie d'un nom de commande après `source` ?

  5. Effacer la ligne de console imprimée actuelle

[Bash Tips] Renommer les fichiers sans taper deux fois le nom complet sous Linux

Supprimer tous les fichiers d'un répertoire dont le nom ne correspond pas à une ligne dans une liste de fichiers ?

Comment trouver le nom du processus à partir de son PID

Tester nginx sans nom de domaine

Comment répertorier les processus dans htop uniquement par leur nom, sans le chemin complet ?

umask actuel d'un processus avec <pid>