首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGO:处理SIGTERM / SIGABRT

CGO:处理SIGTERM / SIGABRT
EN

Stack Overflow用户
提问于 2021-07-14 18:54:33
回答 1查看 375关注 0票数 0

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

NDEBUG标志设置为禁用断言无助于此,因为它只会导致分段错误。

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

代码语言:javascript
复制
// 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函数与这个问题相关,但如果需要,我可以添加它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-15 17:50:05

可以使用本机Go代码中的SIGTERMSIGABRT或C中的sigaction (可能通过cgo调用设置)来处理signal.Notifysigaction

但是,SIGTERMSIGABRT处理程序不应该阻止进程终止--它可以执行一些尽力而为的日志记录(可能是帮助调试),或者刷新中间输出(以减少丢失的工作量),但是一般来说,assert失败可能表明程序在某种程度上严重中断--如果它继续运行,它可能会产生任意错误的输出(例如,由于内存损坏),或者分段错误(因为程序不期望assert调用返回),或者死锁(因为assert表示锁不变量中断)。

如果程序遇到assert故障时遇到问题,而不是试图捕获和抑制这些故障,那么寻找再现这些故障的方法(例如通过毛茸茸程序的输入,或者记录程序在失败之前正在做的事情)可能会更有效率。然后,您可以修复assert故障的根本原因,并且不需要尝试从它们中恢复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68383705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档