Existe-t-il un moyen de vider la pile d'appels d'un processus en cours d'exécution en C ou C++ chaque fois qu'une certaine fonction est appelée ? Ce que j'ai en tête est quelque chose comme ceci :
void foo()
{
print_stack_trace();
// foo's body
return
}
Où print_stack_trace
fonctionne de la même manière que caller
en Perl.
Ou quelque chose comme ça :
int main (void)
{
// will print out debug info every time foo() is called
register_stack_trace_function(foo);
// etc...
}
où register_stack_trace_function
met une sorte de point d'arrêt interne qui provoquera l'impression d'une trace de la pile à chaque fois que foo
s'appelle.
Est-ce que quelque chose de ce genre existe dans une bibliothèque C standard ?
Je travaille sur Linux, en utilisant GCC.
Contexte
J'ai une exécution de test qui se comporte différemment en fonction de certains commutateurs de ligne de commande qui ne devraient pas affecter ce comportement. Mon code comporte un générateur de nombres pseudo-aléatoires qui, je suppose, est appelé différemment en fonction de ces commutateurs. Je veux pouvoir exécuter le test avec chaque jeu de commutateurs et voir si le générateur de nombres aléatoires est appelé différemment pour chacun d'eux.
0 votes
@Nathan : Pour autant que je sache, il n'y a pas de moyen STANDARD de le faire, mais il existe peut-être des bibliothèques qui peuvent vous aider.
1 votes
Armen, connaissez-vous l'un de ces produits ?
0 votes
Cela ne serait-il pas non plus à réaliser dans un débogueur ?
0 votes
@dmckee, ce serait en effet le cas, sauf que la non-concordance se produit après que la fonction a été appelée quelques milliers de fois, donc le faire manuellement dans un débogueur est hors de question. Si seulement j'avais un stagiaire... :-)
1 votes
@Nathan : Si votre débogueur est gdb il peut gérer ce cas . Je ne peux pas vous parler des autres, mais je suppose que gdb n'est pas le seul à avoir cette fonctionnalité. A part : J'ai juste a regardé à mon commentaire précédent. ::gag: :
s/easier/either/
Comment cela a-t-il pu arriver ?2 votes
@dmckee : En fait, ça devrait être
s/either/easier
. Ce que je devrais faire avec gdb est d'écrire un script qui s'arrête sur cette fonction et imprime la trace de la pile, puis continue. Maintenant que j'y pense, il est peut-être temps pour moi d'apprendre à écrire des scripts gdb.1 votes
Gah ! Je vais aller dormir un peu. Très bientôt maintenant...
1 votes
Version C uniquement : stackoverflow.com/questions/105659/
1 votes
@S.S.Anne I still care