Fonction Pile d’appel en C ++

J’ai essayé les liens suivants, à partir de StackOverflow et d’autres sites, [j’ai essayé, mais cela ne m’a pas aidé, alors je ne peux pas éviter la duplication]

StackWalk64 sous Windows – Récupère le nom du symbole

Comment faire pour que StackWalk64 () fonctionne correctement sur x64?

http://www.codeproject.com/KB/threads/StackWalker.aspx

Walking the stack of the current thread

Comment connecter les frameworks de stack avec Windows x64 …

Mais aucun des codes n’a fonctionné pour moi. Je suis nouveau dans l’environnement Windows C ++ et je ne peux utiliser aucun des codes ci-dessus.

Je cherche un format de stack d’appels comme,
FUNCTION_NAME_DEPTH_1: _LINE_NUM__
FUNCTION_NAME_DEPTH_1: _LINE_NUM__
FUNCTION_NAME_DEPTH_1: _LINE_NUM__ …

Fonctionne simplement le nom et les numéros de ligne.

Mon environnement:
Visual Studio 2010
SDK: v7.1
Windows 7 Pro SP1

Ce serait très simple si quelqu’un publie un fichier d’en-tête, [il semble y avoir peu de données disponibles, mais ne fonctionne pas] que nous pouvons inclure dans notre fichier cpp et imprimer la stack d’appels avec un appel comme ‘PrintFunctionCallStack ();’ . BTW sous Linux / Mac, c’était beaucoup plus facile, j’ai pu récupérer la stack d’appels de backtrace et c’était si simple que je l’ai fait moi-même en quelques minutes. Dans Windows, j’ai essayé deux jours passés, mais pas de surprise du tout.

Linux / Mac Stack Trace Code, je n’ai pas encore démantelé les noms de symboles.

#ifndef _STACKTRACE_H_ #define _STACKTRACE_H_ #include  #include  #include  #include  #include  static inline void PrintStackTrace() { cout<<"##############################################\n"; unsigned int maxStackCount = 63; void* addressList[maxStackCount+1]; int addrLen = backtrace(addressList, sizeof(addressList) / sizeof(void*)); if (addrLen == 0) { cout<<"Empty Stack, Probably Corrupted it seems ###\n"; return; } char** symbolList = backtrace_symbols(addressList, addrLen); for (int i = 1; i < addrLen; i++) // Skipped First, 'i' begins with '1' { cout<<"###: "<<symbolList[i]<<":###\n"; } free(symbolList); cout<<"##############################################\n"; } #endif 

Si votre environnement est Visual Studio, vous pouvez insérer un sharepoint trace et une entrée

 $CALLSTACK 

dans sa zone d’édition, après avoir coché Imprimer un message.

Pour ce faire, cliquez avec le bouton droit de la souris sur la ligne souhaitée et sélectionnez Point d’arrêt> Insérer un point d’arrêt (ou insérez un point d’arrêt en cliquant sur le côté gauche de la ligne de l’éditeur souhaitée, puis sélectionnez Quand frappé).

Ensuite, vous verrez un rapport détaillé dans la fenêtre Sortie, avec le nom du fichier, le numéro de ligne et le nom de la fonction. Cela m’a permis de découvrir des memory leaks.