相关疑难解决方法(0)

为什么SetUnhandledExceptionFilter无法捕获一些异常,但AddVectoredExceptionHandler可以做到

我遇到了一个问题,即当异常代码c0000374引发时,我传递给SetUnhandledExceptionFilter的函数没有被调用.但它可以正常使用异常代码c0000005.然后我尝试使用AddVectoredExceptionHandler,它没有问题,处理函数被正确调用.

这是API错误吗?我可以在任何地方使用AddVectoredExceptionHandler而不是SetUnhandledExceptionFilter吗?

这两个功能都能正常工作

// Exception code c0000005
int* p1 = NULL;
*p1 = 99;
Run Code Online (Sandbox Code Playgroud)

只有AddVectoredExceptionHandler才能捕获此异常.(为了证明它不依赖于运行时库,我手动引发异常并且结果相同.)

// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);
Run Code Online (Sandbox Code Playgroud)

测试程序.

#include <tchar.h>
#include <fstream>
#include <Windows.h>

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("TopLevelExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}


int _tmain(int …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi exception-handling

23
推荐指数
2
解决办法
2万
查看次数

在Windows上与glibc的backtrace()和backtrace_symbols()相对应?

glibc的提供了非常方便backtrace()backtrace_symbols()功能,它可以帮助获取当前函数的堆栈跟踪程序(见这里)。

Windows API是否提供任何类似的功能?

c c++ winapi backtrace

5
推荐指数
1
解决办法
2804
查看次数

VC ++堆栈跟踪无法在生产时解析函数名称

我最近使用boost的新stacktrace库实现了堆栈跟踪日志记录:

int debugErrorCallback(int status, const char* func_name, const char* err_msg, const char* file_name, int line, void* userdata)
{
    boost::stacktrace::stacktrace stacktrace(4, 10); //skipped 4 frames include cv::error, this function and 2 in boost::stacktrace ctor
    std::cout << boost::stacktrace::detail::to_string(stacktrace.as_vector().data(), 
                                                      stacktrace.size()) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在我的开发机器上对其进行了测试,结果完美:

0# cv::arithm_op at d:\src\opencv_24\modules\core\src\arithm.cpp:1293
1# cv::addWeighted at d:\src\opencv_24\modules\core\src\arithm.cpp:2127
2# MyApplication::myFunction at d:\src\path\to\my\file.cpp:226
3# MyApplication::myOtherFunction at d:\src\path\to\my\other_file.cpp:146
...
Run Code Online (Sandbox Code Playgroud)

我将新的应用程序版本部署到生产中。不幸的是,在生产机器上,模块中的框架仅解析为模块名称:

0# cv::addWeighted in opencv_core2413
1# cv::addWeighted in opencv_core2413
2# 0x00007FF7D0A0B56B in MyApplication
3# 0x00007FF7D0A0B2ED in MyApplication
...
Run Code Online (Sandbox Code Playgroud)

我调试了boost的实现,stacktrace …

c++ boost stack-trace visual-c++

4
推荐指数
1
解决办法
454
查看次数