#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);
À 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.
En cas de succès, backtrace_symbols() renvoie un pointeur vers le tableau alloué avec malloc(3). En cas d'erreur NULL est renvoyé.
Interface | Attribut | Valeur |
backtrace(), backtrace_symbols(), backtrace_symbols_fd() | Sécurité des threads | MT-Safe |
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.
$ 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]
#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);
}
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 à