C ++ Catch Exception без отладчикаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++ Catch Exception без отладчика

Сообщение Anonymous »

В настоящее время я работаю над приложением C ++, скомпилированным с использованием Microsoft Visual Studio 2022. Я сталкивался с проблемой, когда приложение сбоятся во время выключения. Эти сбои не заметно влияют на конечного пользователя (то есть нет нарушения пользовательского интерфейса), но они приводят к потере данных. Однако в производственных прогонах (без прикрепленного отладчика) эта функция не всегда называется во время сбоев времени отключения.#include
#include
#include
#include
#include

// Link with DbgHelp.lib
#pragma comment(lib, "Dbghelp.lib")
#pragma comment(lib, "Psapi.lib")

// Helper: Print stack trace to a message box
void ShowStackTrace()
{
HANDLE hProcess = GetCurrentProcess();
SymInitialize(hProcess, NULL, TRUE);

void* stack[100];
unsigned short frames = CaptureStackBackTrace(0, 100, stack, NULL);

SYMBOL_INFO* symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256, 1);
if (!symbol) return;

symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
symbol->MaxNameLen = 255;

TCHAR msg[4096] = _T("");
for (int i = 0; i < frames; ++i)
{
if (SymFromAddr(hProcess, (DWORD64)(stack), 0, symbol))
{
_stprintf_s(msg + _tcslen(msg), _countof(msg) - _tcslen(msg),
_T("#%02d: 0x%p %S\n"), i, stack, symbol->Name);
}
}

MessageBox(NULL, msg, _T("Stack Trace"), MB_OK | MB_ICONINFORMATION);

free(symbol);
SymCleanup(hProcess);
}

// Unhandled exception filter
LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* p)
{
ShowStackTrace();
return EXCEPTION_EXECUTE_HANDLER;
}

// Vectored exception handler
LONG WINAPI VectoredHandler(PEXCEPTION_POINTERS p)
{
if (p->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
{
ShowStackTrace();
return EXCEPTION_EXECUTE_HANDLER;
}
return EXCEPTION_CONTINUE_SEARCH;
}

// Simulate a crash during shutdown
class CrashOnExit {
public:
~CrashOnExit() {
int* p = nullptr;
*p = 42; // Access violation
}
};

CrashOnExit g_crasher;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
// Install Vectored Handler
PVOID handler = AddVectoredExceptionHandler(1, VectoredHandler);
if (!handler) {
MessageBox(NULL, _T("Failed to install vectored handler"), _T("Error"), MB_OK | MB_ICONERROR);
return 1;
}

// Install Unhandled Exception Filter
SetUnhandledExceptionFilter(ExceptionFilter);

MessageBox(NULL, _T("App is running. It will crash on exit to test handlers."),
_T("Info"), MB_OK | MB_ICONINFORMATION);

// Returning from WinMain will call ~CrashOnExit and crash
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... t-debugger
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»