gpt4 book ai didi

c++ - 如果异常将由特定的 catch block 处理,如何导致 C++ 抛出转储核心

转载 作者:可可西里 更新时间:2023-11-01 18:39:14 25 4
gpt4 key购买 nike

如果抛出的异常将由特定的 catch block 处理,是否有办法导致 C++ 中的抛出在抛出点转储核心?当异常到达顶层时,我想要类似于 g++ 所发生的事情。

例如,我想要这样的东西:

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

这样,如果从 foo() 或其被调用者抛出的任何异常到达 foo() 的调用点,就会导致核心转储在抛出点,这样就可以看到是谁抛出的达到此级别的异常。

另一方面,bar() 抛出的异常将被正常处理。

最佳答案

是的,它可以在 Windows 中使用。 Linux我不懂,估计也可以。

我们可以注册一个异常处理函数来响应catch之前的throw这是代码示例:

#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 的 core int。VectoredHandler 在调试器获得第一次机会通知之后,但在系统开始展开堆栈之前调用。如果您的目的只是调试问题,那么您可以依靠调试器功能来处理第一次机会异常,不需要转储应用程序。

供您引用,您可能需要了解What is a First Chance Exception?在 Windows 中了解 Windows 如何调度异常。

关于c++ - 如果异常将由特定的 catch block 处理,如何导致 C++ 抛出转储核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com