2009-03-26 12 views
0

Pour une application de débogage C++, je souhaite pouvoir compter facilement le nombre de trames callstack. Existe-t-il une fonction OS pour cela?Comment puis-je compter le nombre de trames callstack?

J'ai besoin de cela pour Windows et Posix, c'est-à-dire multi-plateforme. Des solutions à l'une ou l'autre ou aux deux plateformes seraient excellentes.

Je peux marcher sur la pile pour trouver toutes les images mais je me demandais s'il y avait un appel facile à faire.

Répondre

2

Non, parce que c'est une chose de compilateur.

Le compilateur est libre de définir son propre ABI. Ceci définit comment la callstack (le cas échéant) est définie. A moins que vous n'utilisiez le "C" pur, ceci n'est pas trivial et sera différent pour chaque compilateur. J'ai également entendu (mais je n'ai pas vérifié) que MS utilise un nouveau schéma où les cadres de pile sont placés au hasard autour de la mémoire afin d'empêcher (rendre plus difficile) les attaques de débordement de tampon qui affectent le saut de retour. Pas vraiment pertinent mais un fait amusant.

+0

Dernièrement, ils ont simplement placé des "cookies" aléatoires sur le cadre de la pile que vous auriez à remplacer avant d'écraser l'adresse de retour. Ensuite, lors du retour de la fonction, le cookie est vérifié, et s'il a changé, l'application se termine. – Eclipse

+0

Juste pour souligner, les cookies de pile de Microsoft, bien qu'intéressants ont déjà été vaincus, et ne devraient donc pas être invoqués pour la sécurité. Les cadres de pile ne sont en effet pas placés au hasard, car cela détruirait toute la pile. –

+0

Je ne parlais pas des cookies. Je parlais du placement réel du cadre. Ce qui pourrait potentiellement être n'importe où dans la mémoire (avec un peu de câblage supplémentaire du compilateur). Une pile est simplement la méthode la plus simple pour enregistrer les informations dont elle n'a techniquement pas besoin pour être une pile. –

0

Si vous utilisez glibc (Linux), vous pouvez utiliser les fonctions suivantes pour obtenir la trace de la pile:

#include <execinfo.h> 
int backtrace(void **buffer, int size); 
char **backtrace_symbols(void *const *buffer, int size); 
void backtrace_symbols_fd(void *const *buffer, int size, int fd); 

Pour plus d'informations, consultez la page de manuel pour backtrace.

Questions connexes