отладка — как вызвать C ++ throw для дампа ядра, если исключение будет обработано определенным блоком catch

Есть ли способ вызвать throw в C ++ для дампа ядра на сайте throw, если выброшенное исключение будет обработано определенным блоком catch? Я хотел бы что-то похожее на то, что происходит с g ++, когда исключение достигает верхнего уровня.

Например, я хотел бы что-то вроде этого:

try {
bar();
try {
foo();
} catch(...) {
#  pragma dump_at_throw_site
}
} catch(...) {
std::cerr << "There was a problem" << std::endl;
}

Таким образом, если какое-либо исключение, выданное из foo () или вызываемого абонента, которое достигает call-сайта foo (), вызовет дамп ядра на месте броска так что можно увидеть, кто бросил исключение, которое добралось до этого уровня.

С другой стороны, исключения, выдаваемые bar (), будут обрабатываться нормально.

7

Решение

Да, это может в Windows. Я не знаю Linux, предположим, что он тоже может.

Мы можем зарегистрировать функцию обработчика исключений для ответа на throw перед catch
Вот пример кода:

#include <iostream>
#include "windows.h"#define CALL_FIRST 1
LONG WINAPI
VectoredHandler(
struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
UNREFERENCED_PARAMETER(ExceptionInfo);
std::cout <<"VectoredHandler"<<std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
PVOID handler;
handler = AddVectoredExceptionHandler(CALL_FIRST,VectoredHandler);

try {
throw 1;
}catch(...)
{
std::cout <<"catch (...)"<< std::endl;
}

RemoveVectoredExceptionHandler(handler);
std::cout << "end of main"<<std::endl;
return 0;
}

Выводы кода:

VectoredHandler
catch (...)
end of main

Таким образом, вы можете сбросить ядро ​​внутри функции VectoredHandler,
VectoredHandler вызывается после того, как отладчик получает уведомление о первом шансе, но до того, как система начинает разматывать стек.
И если ваша цель — просто отладить проблему, то вы можете положиться на функцию отладчика для обработки первого случайного исключения, без необходимости выгрузки приложения.

Для вашей информации вам может понадобиться знать Что такое исключение для первого шанса? в окнах, чтобы понять, как окна отправляют исключения.

2

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

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

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×