我称之为在许多地方使用断言的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
1 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
可以处理和使用信号。
在本机 Go 代码中通知或在 C 中调用
(可能通过 cgo 调用设置)。SIGTERM
SIGABRT
但是,a 或处理程序不应阻止进程终止 — 它可以尽一切努力进行日志记录(也许是为了帮助调试),或者刷新中间输出(以减少丢失的工作量),但一般来说,失败可能表明程序以某种方式严重损坏 — 如果它继续运行,它可能会产生任意错误的输出(例如,由于内存损坏), 或 segfault(因为程序不希望调用返回),或死锁(因为 指示锁定不变量已损坏)。SIGTERM
SIGABRT
assert
assert
assert
如果程序遇到故障时遇到问题,而不是尝试捕获和抑制这些故障,则寻找重现这些故障的方法(例如,通过模糊测试程序的输入,或记录程序在发生故障之前正在执行的操作的跟踪)可能会更有效率。然后,您可以修复失败的根本原因,并且无需尝试从中恢复。assert
assert
- 1 回答
- 0 关注
- 60 浏览
添加回答
举报
0/150
提交
取消