我稱之為在許多地方使用斷言的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 關注
- 82 瀏覽
添加回答
舉報
0/150
提交
取消