Man page - backtrace(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

backtrace

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

backtrace, backtrace_symbols, backtrace_symbols_fd - Outils d’auto-dĂ©bogage d’applications

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <execinfo.h>

int backtrace(void * buffer [. size ], int size );

char **backtrace_symbols(void *const buffer [. size ], int size );
void backtrace_symbols_fd(void *const
buffer [. size ], int size , int fd );

DESCRIPTION

backtrace () renvoie une trace des appels du programme dans un tableau pointĂ© par buffer . Une trace est une sĂ©rie d’appels de fonction actuellement actifs d’un programme. Chaque Ă©lĂ©ment du tableau pointĂ© par buffer est de type void * , et correspond Ă  l’adresse de retour du bloc de pile (stack frame) correspondant. Le paramĂštre size spĂ©cifie le nombre maximal d’adresses qui peut ĂȘtre enregistrĂ© dans buffer . Si la trace est plus grande que size , alors les adresses correspondant aux size plus rĂ©cents appels de fonction sont renvoyĂ©es. Pour obtenir une trace complĂšte, assurez-vous que buffer et size soient assez grands.

À partir des adresses renvoyĂ©es par backtrace () dans le buffer , backtrace_symbols () traduit les adresses en un tableau de chaĂźnes qui associe des symboles Ă  ces adresses. Le paramĂštre size indique le nombre d’adresses dans le buffer . La reprĂ©sentation symbolique de chaque adresse consiste en un nom de fonction (s’il peut ĂȘtre dĂ©terminĂ©), un dĂ©calage hexadĂ©cimal Ă  l’intĂ©rieur de la fonction et l’adresse (hexadĂ©cimale) de renvoi. L’adresse du tableau de pointeurs de chaĂźnes est renvoyĂ© comme rĂ©sultat de la fonction backtrace_symbols (). Ce tableau est allouĂ© avec malloc (3) par backtrace_symbols () et doit ĂȘtre libĂ©rĂ© par l’appelant. Les chaĂźnes pointĂ©es par le tableau de pointeurs n’ont pas et ne devraient pas ĂȘtre libĂ©rĂ©es.

backtrace_symbols_fd () prend les mĂȘmes paramĂštres buffer et size que backtrace_symbols (), mais au lieu de renvoyer un tableau de chaĂźnes Ă  l’appelant, elle Ă©crit les chaĂźnes, une par ligne, dans le descripteur de fichier fd . backtrace_symbols_fd () n’appelle pas malloc (3) et peut donc ĂȘtre utilisĂ©e dans des conditions oĂč cette derniĂšre fonction risque d’échouer, mais consultez NOTES.

VALEUR RENVOYÉE

backtrace () fournit le nombre d’adresses renvoyĂ©es dans le buffer , qui ne sera pas supĂ©rieur Ă  size . Si la valeur de retour est infĂ©rieure Ă  size , alors toute la trace a pu ĂȘtre sauvĂ©e ; si elle est Ă©gale Ă  size , alors il se peut qu’elle ait Ă©tĂ© tronquĂ©e et les adresses des blocs de pile les plus anciens ne sont pas renvoyĂ©es.

En cas de succĂšs, backtrace_symbols () renvoie un pointeur vers le tableau allouĂ© avec malloc (3). En cas d’erreur NULL est renvoyĂ©.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3866862-1.png

STANDARDS

GNU.

HISTORIQUE

glibc 2.1.

NOTES

Ces fonctions font des suppositions sur la façon dont l’adresse renvoyĂ©e d’une fonction est sauvegardĂ©e dans la pile. Prenez note des points suivants :

-

L’omission du pointeur de bloc (comme le fait gcc (1) avec les niveaux d’optimisation diffĂ©rents de zĂ©ro) peut ĂȘtre incompatible avec ces suppositions.

-

Les fonctions incorporĂ©es (« inline ») n’ont pas de blocs de pile.

-

Avec les optimisations de type sous-routine finale (tail-call) font qu’un bloc de pile en remplace un autre.

-

backtrace () et backtrace_symbols_fd () n’appellent pas malloc () explicitement, mais elles font partie de la libgcc qui est chargĂ©e dynamiquement Ă  sa premiĂšre utilisation. Le chargement dynamique dĂ©clenche habituellement un appel Ă  malloc (3). Si vous avez besoin que certains appels Ă  ces deux fonctions n’allouent pas de mĂ©moire (dans les gestionnaires de signal, par exemple) vous devez vous assurer que la libgcc est chargĂ©e au prĂ©alable.

Le nom des symboles peut ne pas ĂȘtre disponible si certaines options de l’éditeur de liens n’ont pas Ă©tĂ© utilisĂ©es. Pour les systĂšmes qui utilisent l’éditeur de liens GNU, il faut utiliser l’option -rdynamic . Notez que les noms des fonctions statiques (avec le mot clef « static ») ne sont pas exposĂ©s, et ne seront pas disponibles pour la trace.

EXEMPLES

Le programme ci-dessous explique l’utilisation de backtrace () et backtrace_symbols (). Les sessions d’interprĂ©teur de commandes montrent ce que produira l’exĂ©cution du programme :

$ cc -rdynamic prog.c -o prog
$ ./prog 3
backtrace() returned 8 addresses
./prog(myfunc3+0x5c) [0x80487f0]
./prog [0x8048871]
./prog(myfunc+0x21) [0x8048894]
./prog(myfunc+0x1a) [0x804888d]
./prog(myfunc+0x1a) [0x804888d]
./prog(main+0x65) [0x80488fb]
/lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c]
./prog [0x8048711]

Source du programme

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BT_BUF_SIZE 100
void
myfunc3(void)
{
int nptrs;
void *buffer[BT_BUF_SIZE];
char **strings;
nptrs = backtrace(buffer, BT_BUF_SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* L’appel backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
produirait une sortie semblable Ă  ce qui suit : */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (size_t j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
static void /* « static » signifie ne pas exporter le symbole... */
myfunc2(void)
{
myfunc3();
}
void
myfunc(int ncalls)
{
if (ncalls > 1)
myfunc(ncalls - 1);
else
myfunc2();
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "%s num-calls\n", argv[0]);
exit(EXIT_FAILURE);
}
myfunc(atoi(argv[1]));
exit(EXIT_SUCCESS);
}

VOIR AUSSI

addr2line (1), gcc (1), gdb (1), ld (1), dlopen (3), malloc (3)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .