1. 程式人生 > >C++拋異常時如何獲取異常時的堆疊呼叫資訊

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類是所有異常或錯誤的超類,它有