编程与调试 C++ -- VC++ 程序捕获所有异常

Breakpad

  • 在 windows 平台上,使用微软提供的 SetUnhandledExceptionFilter() 方法来实现。
  • 在 OS X 平台上,通过创建一个线程来监听 Mach Exception port 来实现。
  • 在 Linux 平台上,通过设置一个信号处理器来监听 SIGILL SIGSEGV 等异常信号。
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)

一些不错的文章:

C++11 之后,保证了静态变量的初始化是线程安全的。这样创建一个单例非常简单,代码如下:

class Singleton {
public:
    static Singleton *GetInstance() {
        static Singleton intance;
        return &intance;
    }

private:
    // 禁止在类外创建实例
    Singleton() = default;

    // 禁止在类外销毁
    ~Singleton() = default;

    // 禁止拷贝和赋值
    Singleton(const Singleton &) = delete;
    Singleton &operator=(const Singleton &) = delete;
};

使用 Windows 错误报告 (WER)

打开注册表编辑器:

  • 按 Win + R 打开运行对话框,输入 regedit 并按回车键。

导航到注册表项:

  • 导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps。

创建子项:

  • 如果 LocalDumps 子项不存在,右键点击 Windows Error Reporting,选择 新建 -> 项,命名为 LocalDumps。

配置应用程序的转储设置:

  • 在 LocalDumps 下,右键点击右侧窗格,选择 新建 -> 项,命名为您的应用程序的可执行文件名(例如 onnxruntime.exe)。
  • 在新创建的项下,右键点击右侧窗格,选择 新建 -> 字符串值,命名为 DumpFolder。
  • 双击 DumpFolder,输入您希望保存转储文件的路径(例如 C:\Dumps)。
  • 再次右键点击右侧窗格,选择 新建 -> DWORD (32-bit) 值,命名为 DumpType。
  • 双击 DumpType,设置其值为 2(表示完整内存转储)或 1(表示小型内存转储)。

参考资料快照
参考资料快照

本文短链接:
If you have any questions or feedback, please reach out .