在(混合).NET代码中捕获C运行时库致命错误?

时间:2010-01-05 17:58:50

标签: .net c++-cli minidump

我有一个由C#应用程序组成的项目,该应用程序调用了几个C ++ / CLI DLL。如果我在本机代码中遇到Visual Studio C运行时库致命错误,则似乎无法捕获它。

举一个简单的例子,如果我把它放在本机代码中:

    wchar_t buf[1];
    ::wcscpy_s(buf, 1, L"ab");

应用程序将崩溃(在发布版本中)。它不会抛出异常而我无法用__try ... _来捕获它。

我想捕获这些类型的错误,因此我可以显示一个很好的错误对话框,理想情况下是一个callstack。我决定创建一个minidump,但我尝试通过在一个C ++ / CLI DLL中调用:: SetUnhandledExceptionFilter()来创建一个minidump,但这似乎不起作用。

有没有办法优雅地处理.NET应用程序中的C运行时库致命错误?

1 个答案:

答案 0 :(得分:0)

如果您可以控制C ++代码,那么您可以安装验证处理程序,使安全字符串函数之类的东西返回错误而不是中止整个应用程序。请参阅this

一个简单的示例显示您甚至可以将错误转换为托管异常并彻底退出:

#include <stdlib.h>
#include <string.h>
using namespace System;

void InvalidParameterHandler(
   const wchar_t * expression,
   const wchar_t * function, 
   const wchar_t * file, 
   unsigned int line,
   uintptr_t pReserved
)
{
    throw gcnew Exception("Argh");
}

int main(array <System::String ^> ^args)
{
    _set_invalid_parameter_handler(InvalidParameterHandler);

    try
    {
        wchar_t buf[1];
        wcscpy_s(buf, 1, L"Hello");
    }
    catch(Exception^ e)
    {
        Console::WriteLine(e->ToString());
    }

    return 0;
}