C++拋異常時如何獲取異常時的堆疊呼叫資訊
問題背景
一般來說,我們使用第三方程式碼的時候,不可避免的會遇到異常資訊。例如呼叫錯誤,庫中會丟擲異常。經常是由於上下文日誌不足,我們只能看到catch處的日誌,而不清楚異常是哪些函式呼叫導致。這導致定位問題比較麻煩,經常要花比較長時間去跟進。去網上找了些資料,
解決方案
我把原文coyp過來,如下:
Here's an example throw_exception.cpp. #include <iostream> #include <stdexcept> using namespace std; void function() { throw runtime_error("i am an exception"); } int main() { try { function(); } catch(const std::exception& e) { cout << e.what() << endl; } return 0; }
The makefile for it.
all: throw_exception throw_exception : throw_exception.cpp $(CXX) -g $< -o [email protected]
Here's how to use catch throw in gdb.
~/exception$ make g++ -g throw_exception.cpp -o throw_exception ~/exception$ gdb throw_exception ... Reading symbols from throw_exception...done. (gdb) catch throw Catchpoint 1 (throw) (gdb) run Starting program: throw_exception Catchpoint 1 (exception thrown), 0x00007ffff7b8f910 in __cxa_throw () from /usr/lib/libstdc++.so.6 (gdb) where #0 0x00007ffff7b8f910 in __cxa_throw () from /usr/lib/libstdc++.so.6 #1 0x0000000000400d89 in function () at throw_exception.cpp:8 #2 0x0000000000400dca in main () at throw_exception.cpp:15(gdb)
方案二:如果是自己寫的程式碼,在丟擲異常的時候,可以藉助backtrace函式,獲取當前程序呼叫堆疊的相關資訊,進而輸出到日誌中幫助定位問題。具體的實施方案可以參考這個連結:
如果第三方庫,那目前能想到的還是使用方案一。方案二的問題在於,無法對第三方庫的拋異常時,把自己的程式碼掛進去執行。
相關推薦
C++拋異常時如何獲取異常時的堆疊呼叫資訊
問題背景一般來說,我們使用第三方程式碼的時候,不可避免的會遇到異常資訊。例如呼叫錯誤,庫中會丟擲異常。經常是由於上下文日誌不足,我們只能看到catch處的日誌,而不清楚異常是哪些函式呼叫導致。這導致定位問題比較麻煩,經常要花比較長時間去跟進。去網上找了些資料,解決方案我把原文
獲取方法排程堆疊的資訊
java在允許期間可以通過Throwable類來獲取方法呼叫堆疊資訊; 部分方法如下: Throwable e = new Throwable(); StackTraceElement[] stacks = e.getStackTrace(); if(sta
C#+ArcGIS Engine實現獲取圖層欄位資訊
FieldInformation類用於儲存欄位資訊: public class FieldInformation { public int Index { get; set; } public bool Editable { get; set; } public string Na
SpringBoot測試時拋java.lang.IllegalStateException異常
1.我的測試類 @SpringBootTest @RunWith(SpringRunner.class) public class MaServiceTest { @Autowired private MaService maService; @Test
集合迭代時對集合進行修改拋ConcurrentModificationException(併發修改異常)的深究
大家應該都知道, 在java中, 在對一些集合迭代的過程中對集合進行一些修改的操作, 比如說add,remove之類的操作, 搞不好就會拋ConcurrentModificationException, 這一點在API文件上也有說的! 在迭代時只可以用迭代器進行刪除!
在用c++讀取xml檔案時,執行時出現以下錯誤:出現未處理的“System.Xml.XmlException”型別的異常出現在 system.xml.dll 中
各位高手,我剛剛開始接觸c++,使用的是Microsoft Visual Studio 2003版本,在使用c++讀取xml檔案時,編譯已經通過,但是執行.exe程式時,老是出現這個錯誤:“未處理的“System.Xml.XmlException”型別的異常出現在 syste
C#基礎 Hashtable ContainsKey 新增鍵值對時避免異常
慈心積善融學習,技術願為有情學。善心速造多好事,前人栽樹後乘涼。我今於此寫經驗,願見文者得啟發。 .NET Framework : 4.7.2 IDE : Visual Stud
Jni C/C++執行時遇到異常怎麼辦?捕獲與丟擲
有個頭疼的問題,Jni C/C++遇到問題閃退怎麼辦?有辦法,我們可以在異常發生後通過判斷清除異常解決,保持程式及時反應處理。 比如: package crash; import java.secu
JSP Tomcat8.0運行連接池時發生異常【AbstractMethodError oracle.jdbc.driver.T4CConnection.isValid(I)Z】
jdk1.7 oracle read 2.0 ati conn pan span valid 原創 2015年12月28日 11:38:01 2004 一、Tomcat8.0運行連接池時發生異常: AbstractMethodError or
運行時異常與受檢異常有何異同?
正常的 異同 異常處理 捕獲 虛擬 沒有 操作 異常 面向對象 異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤,只要程序設計得沒有問題通常就不會發生。受檢異常跟程序運行的上下文環境有關,即使程序設計無誤,仍然可
laravel post提交數據時顯示異常
try web IE 請求 被拒絕 del 提交 TE let post提交數據時候顯示如下: The page has expired due to inactivity. Please refresh and try again 這是由於在laravel框架中有
c# throw拋出上一個異常
pre 繼承 exc row CA 用法 true 之前 har catch(exception e) { throw; } 不僅拋出這次的異常,也拋出之前的異常。 用法示例:函數A調用函數B,A用到此throw時,B中發生的異常也會繼承過來。 catch
Ubuntu14.04使用vi編輯器時輸入異常且按方向鍵亂碼
mon apt com lasso 使用 14. ubun sudo pan 在終端中依次執行如下兩條命令 sudo apt-get remove vim-common sudo apt-get install vimUbuntu14.04使用vi編輯器時輸入異常且按方
Exception、Error、運行時異常與一般異常有何異同
用戶信息 要去 private con exc 包含 運行時異常 watermark 指定 轉自博客 https://blog.csdn.net/m0_37531231/article/details/79502778 一、開場白 對於程序運行過程中的可能出現異常情況,j
用eclipse部署tomcat時出現異常:java.lang.IllegalArgumentException
prope valid 路徑 存在 exist ali eclips tom tex 用eclipse部署tomcat時出現異常:java.lang.IllegalArgumentException: Invalid ‘log4jConfigLocation‘ parame
java中exception和error有什麽區別,運行時異常和一般異常有什麽區別
顯示 error cat 捕獲 導致 避免 dex 源代碼 tof 1.exception和error都是繼承了throwable類,在java中只有throwable類型的實例才可以被拋出(throw)或者捕獲(catch),它是異常處理機制的基本組成類型 2.excep
Webservice客戶端工程導成runnable jar包執行時出現異常
一、問題描述 eclipse整合環境,spring 4.1.3.RELEASE + cxf 2.5.0框架,開發的Webservice客戶端程式。在eclipse開發環境下執行正常,匯出runnable jar包時出現如下異常: java.lang.NullPointerExcept
執行時異常與一般異常區別
Java提供了兩類主要的異常:runtime exception和checked exception。 checked exception: checked 異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。 對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行
hexo next主題 站內搜尋出現異常,無法正常跳轉,跳轉時出現異常
主要看看跳轉後的url是什麼,如果url異常,就需要在站點配置檔案(注意不是主題配置檔案)下面看看你的url和永久連結設定的是否正確。如下所示: # URL ## If your site is put in a subdirectory, set url as 'http://yo
執行時異常與檢查異常
Java把異常當做物件來處理,並定義一個基類java.lang.Throwable作為所有異常的超類。Java中的異常分為兩大類:錯誤Error和異常Exception,Java異常體系結構如下圖所示: 1.Throwable Throwable類是所有異常或錯誤的超類,它有