亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

首席質量:處理西格特姆/西格布特

首席質量:處理西格特姆/西格布特

Go
臨摹微笑 2022-09-12 20:34:25
我稱之為在許多地方使用斷言的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 調用設置)。SIGTERMSIGABRT

但是,a 或處理程序不應阻止進程終止 — 它可以盡一切努力進行日志記錄(也許是為了幫助調試),或者刷新中間輸出(以減少丟失的工作量),但一般來說,失敗可能表明程序以某種方式嚴重損壞 — 如果它繼續運行,它可能會產生任意錯誤的輸出(例如,由于內存損壞), 或 segfault(因為程序不希望調用返回),或死鎖(因為 指示鎖定不變量已損壞)。SIGTERMSIGABRTassertassertassert

如果程序遇到故障時遇到問題,而不是嘗試捕獲和抑制這些故障,則尋找重現這些故障的方法(例如,通過模糊測試程序的輸入,或記錄程序在發生故障之前正在執行的操作的跟蹤)可能會更有效率。然后,您可以修復失敗的根本原因,并且無需嘗試從中恢復。assertassert


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 82 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號