В настоящее время я работаю над приложением 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
C ++ Catch Exception без отладчика ⇐ C++
Программы на C++. Форум разработчиков
1750841963
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[i]), 0, symbol))
{
_stprintf_s(msg + _tcslen(msg), _countof(msg) - _tcslen(msg),
_T("#%02d: 0x%p %S\n"), i, stack[i], 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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79678727/c-catch-exception-without-debugger[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия