Я попробовал следующие ссылки со StackOverflow и других сайтов, [я пытался, но это не помогло мне, поэтому я не могу избежать дублирования]
StackWalk64 в Windows — получить имя символа
Как заставить StackWalk64 () успешно работать на x64?
http://www.codeproject.com/KB/threads/StackWalker.aspx
http://jpassing.com/2008/03/12/walking-the-stack-of-the-current-thread/
Как регистрировать кадры стека в Windows x64
…
Но ни один из Кодекса не сработал для меня. Я новичок в среде Windows C ++ и не могу заставить работать любой из вышеприведенного кода.
Я ищу формат стека вызовов, как,
FUNCTION_NAME_DEPTH_1: _LINE_NUM__
FUNCTION_NAME_DEPTH_1: _LINE_NUM__
FUNCTION_NAME_DEPTH_1: _LINE_NUM__ …
Просто имя функции и номера строк.
Моя среда:
Visual Studio 2010
SDK: v7.1
Windows 7 Pro SP1
Было бы очень просто, если бы кто-нибудь опубликовал файл заголовка [кажется, что их мало, но он не работает], который мы можем включить в наш файл cpp и напечатать стек вызовов с помощью вызова «PrintFunctionCallStack ();» , Кстати, в Linux / Mac это было намного проще, я смог получить стек вызовов из backtrace, и это было так просто, что я сделал это сам за несколько минут. В Windows я пробовал последние два дня, но это не удивительно.
Код трассировки стека Linux / Mac, я еще не расшифровал названия символов.
#ifndef _STACKTRACE_H_
#define _STACKTRACE_H_
#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>
#include <cxxabi.h>
#include <iostream>
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
Если ваша среда Visual Studio, вы можете вставить Tracepoint и ввести
$CALLSTACK
в поле редактирования после проверки Распечатать сообщение.
Для этого щелкните правой кнопкой мыши нужную строку и выберите «Точка останова»> «Вставить точку останова» (или, альтернативно, вставьте точку останова, щелкнув слева от нужной строки редактора, затем выберите «При нажатии»).
Затем вы увидите подробный отчет в окне «Вывод», содержащий имя файла, номер строки и имя функции. Это помогло мне успешно обнаружить некоторые утечки памяти.
Других решений пока нет …