假設我們有以下代碼:
#include <exception>
void funcA() {
funcB();
}
void funcB() {
funcC();
}
void funcC() {
funcD();
}
void funcD() {
throw std::runtime_error("Exception!!"); //3
}
void funcE() {
int * p;
delete p; //4
}
int main (int argc, char **argv) {
try {
funcA(); //1
} catch (std::exception exc) {
std::cerr << exc.what() << endl; //2
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
我想以多執行緒有效的方式使用拋出例外的行號列印堆疊跟蹤。
過去幾天我一直在檢查人們正在做的解決方案和方法,但不幸的是,在我的情況下沒有任何用處。我可以使用例如升壓庫boost::stacktrace::stacktrace()中//2或任何其他庫,但這里的問題是我必須抓住例外做到這一點,如果你的代碼有數百個嵌套函式這種方法效率不高。你不能只是把它們都檢查一遍,然后把每一個都包try-catch起來,單獨處理。
所以基本上我需要做的是如果拋出例外//3我應該能夠在`//2中列印例外的堆疊跟蹤
我知道堆疊展開及其作業原理,但據我所知,每當您的代碼到達 catch 塊時,這意味著例外堆疊已展開并且您無法獲得它。如果我錯了,請糾正我!
有沒有辦法至少在展開例外堆疊之前添加類似于中間件的東西?還是我必須手動完成?
編輯:
此外,當我可以時會發生什么funcE()是記憶體訪問例外,但這個例外永遠不會被捕獲。有沒有辦法捕獲此類例外或至少在崩潰之前列印其堆疊跟蹤?
筆記:
我在 Linux 和 macOS、C 11 和 Silicon web 框架上運行我的代碼。這是一個很大的系統,所以我試圖實作一些可以在整個系統中使用的日志記錄機制。
uj5u.com熱心網友回復:
我發布這個以防萬一有人遇到同樣的問題并想要一個快速有用的答案。
我最終使用這個要點覆寫了主要的 C 拋出例外行為
我更改了__cxa_throw函式中的一些內容來解決我自己的問題,并用于boost::stacktrace獲得更易讀的堆疊跟蹤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362415.html
