簡體   English   中英

是否可以在C ++ catch(…)塊中訪問拋出的異常

[英]Can a thrown exception be accessed in a C++ catch(…) block

我將GDB附加到當前在catch(...)塊內的進程。

是否有已知的方法可以訪問引發的異常?

有問題的程序是gcc / x86-64二進制文件,但我也對其他版本感到好奇。

正如你所說,你可以重新把它,這樣你就可以重新把它扔在另一個內部try/catch更具體的條款來提取異常(和另一塊...如果你想為好)。 您甚至可以在另一個函數中執行此操作,以便可以集中處理異常。

編輯:我誤解了gdb在您的問題中的重要性,但是您可以應用我描述的想法。 創建一個可以引發異常的函數,您可以在以下位置設置斷點:

void
helper()
{
    try {
        throw;
    } catch (int i) {
        // anything that won't get optimized away
        volatile int j = i;  // breakpoint here
    }
}

然后在gdb只需call helper() 我只是測試了一下,以確保它能正常工作。

進一步編輯:如果你從字面上的意思是我跑在gdb下一個程序 ,現在 ,你是不是退出gdb ,直到你確信你不能例外,那么它的時間來看看eh_throw.cc和朋友在gcc源。 __cxa_rethrow開頭為:

  __cxa_eh_globals *globals = __cxa_get_globals ();
  __cxa_exception *header = globals->caughtExceptions;

您將必須檢查所有這些結構,以找出埋在里面的東西。

我沒有對此進行測試-但異常(或至少指向它的指針)可能應該在堆棧中靠近頭部的位置。 我猜確切的位置和格式取決於實現,但是您應該能夠在堆棧的該區域中將不同的地址強制轉換為異常類型(或至少轉換為std :: exception),並查看是否獲得有意義的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM