我正在调用一个 c++库,它在许多地方使用断言。这对我来说是个问题,因为我不希望我的应用程序在断言失败时终止。
将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函数与这个问题相关,但如果需要,我可以添加它。
发布于 2021-07-15 17:50:05
可以使用本机Go代码中的SIGTERM和SIGABRT或C中的sigaction (可能通过cgo调用设置)来处理signal.Notify和sigaction。
但是,SIGTERM或SIGABRT处理程序不应该阻止进程终止--它可以执行一些尽力而为的日志记录(可能是帮助调试),或者刷新中间输出(以减少丢失的工作量),但是一般来说,assert失败可能表明程序在某种程度上严重中断--如果它继续运行,它可能会产生任意错误的输出(例如,由于内存损坏),或者分段错误(因为程序不期望assert调用返回),或者死锁(因为assert表示锁不变量中断)。
如果程序遇到assert故障时遇到问题,而不是试图捕获和抑制这些故障,那么寻找再现这些故障的方法(例如通过毛茸茸程序的输入,或者记录程序在失败之前正在做的事情)可能会更有效率。然后,您可以修复assert故障的根本原因,并且不需要尝试从它们中恢复。
https://stackoverflow.com/questions/68383705
复制相似问题