猿问

首席质量:处理西格特姆/西格布特

我称之为在许多地方使用断言的c库。这对我来说是一个问题,因为我不希望我的应用程序在断言失败时终止。


设置标志以禁用断言无济于事,因为它只会导致一个 segfault。NDEBUG


这是我到目前为止所得到的,但SIGTERM没有被抓住。


// Redefine the MPE_Assert macro to use SIGTERM since SIGABRT cannot be stopped.

// #include <signal.h>

// #define MPE_Assert(_Expression) (void) ((!!(_Expression)) || (raise(SIGTERM)))

import "C"

func Poly2Tri(verts [][2]float32, holes [][][2]float32) [][2]float32 {

    sig := make(chan os.Signal, 10)

    result := make(chan [][2]float32)

    defer signal.Stop(sig)


    go func() {

        // Notify for all signals

        signal.Notify(sig)

        result <- poly2Tri(verts, holes)

    }()


    select {

    case res := <-result:

        return res

    case <-sig:

        return [][2]float32{}

    }

}

那么,如何允许库在断言失败时退出,但允许我的应用程序继续?


我不认为该函数与此问题相关,但如果需要,我可以添加它。poly2Tri


临摹微笑
浏览 61回答 1
1回答

一只名叫tom的猫

可以处理和使用信号。在本机 Go 代码中通知或在 C 中调用(可能通过 cgo 调用设置)。SIGTERMSIGABRT但是,a 或处理程序不应阻止进程终止 — 它可以尽一切努力进行日志记录(也许是为了帮助调试),或者刷新中间输出(以减少丢失的工作量),但一般来说,失败可能表明程序以某种方式严重损坏 — 如果它继续运行,它可能会产生任意错误的输出(例如,由于内存损坏), 或 segfault(因为程序不希望调用返回),或死锁(因为 指示锁定不变量已损坏)。SIGTERMSIGABRTassertassertassert如果程序遇到故障时遇到问题,而不是尝试捕获和抑制这些故障,则寻找重现这些故障的方法(例如,通过模糊测试程序的输入,或记录程序在发生故障之前正在执行的操作的跟踪)可能会更有效率。然后,您可以修复失败的根本原因,并且无需尝试从中恢复。assertassert
随时随地看视频慕课网APP

相关分类

Go
我要回答