windows — стек вызовов функций в переполнении стека

Я попробовал следующие ссылки со 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

5

Решение

Если ваша среда Visual Studio, вы можете вставить Tracepoint и ввести

$CALLSTACK

в поле редактирования после проверки Распечатать сообщение.

Для этого щелкните правой кнопкой мыши нужную строку и выберите «Точка останова»> «Вставить точку останова» (или, альтернативно, вставьте точку останова, щелкнув слева от нужной строки редактора, затем выберите «При нажатии»).

Затем вы увидите подробный отчет в окне «Вывод», содержащий имя файла, номер строки и имя функции. Это помогло мне успешно обнаружить некоторые утечки памяти.

1

Другие решения

Других решений пока нет …