2013-04-10 94 views
1

我編寫了一個C++堆棧應用程序,並使用CYGWIN g ++編譯器運行它。應用程序崩潰,因爲異常處理不完美。StackTrace C++應用程序

它給我stacktrace轉儲爲文件Stack.exe.stackdump。我對這個StackTrace不熟悉,可能有人告訴我如何閱讀它,它意味着什麼?

只是基於收到的評論來明確,堆棧數據結構只是一個例子,使應用程序崩潰,並給予stackTrace。我的意思是這個堆棧跟蹤是在程序崩潰並且與我的堆棧數據結構應用程序無關的任何情況下生成的,我剛剛用它作爲程序崩潰的現有代碼。

產生我的代碼段異常:

class RuntimeException{ 
    private: 
    string errorMsg; 
    public: 
    RuntimeException(const string& err){errorMsg = err;} 
    string getMessage() const {return errorMsg;} 
    }; 

class StackEmpty : public RuntimeException{ 
public: 
StackEmpty(const string& err) : RuntimeException(err){} 
}; 

template <typename E > 
const E& ArrayStack<E> ::top() const throw(StackEmpty) 
{ 

     if(empty()) throw StackEmpty("Top of Empty Stack"); 
     return S[t]; 

    } 

int main() 
{ 
    ArrayStack <int> A; 

    cout << "######\n"; 

    cout << A.top() << "\n"; 
    cout << "######\n"; 

    } 

輸出:

$ ./Stack 
###### 
Aborted (core dumped) 

它生成一個文件Stack.exe.stackdump,其內容爲:

Stack trace: 
Frame  Function Args 
0022A774 7608C313 (000000C0, 0000EA60, 00000000, 0022A8A8) 
0022A788 7608C2C2 (000000C0, 0000EA60, 000000A4, 0022A884) 
0022A8A8 610DC559 (00000000, 00000000, 00000000, 00000000) 
0022A998 610D9913 (00000000, 6110073E, 003B0023, 00230000) 
0022A9F8 610D9DEE (0022A9D0, 6110073E, 003B0023, 00000006) 
0022AAA8 610D9F40 (000008F4, 00000006, 00000000, 00000000) 
0022AAC8 610D9F6C (00000006, 00000006, 0022AB38, 00404C6B) 
0022AAF8 610DA233 (0022AB28, 611A1E9B, 0022ABAC, 00000001) 
0022AB48 00404777 (00000000, 00000000, 0022AC18, 004142CB) 
0022AB58 00404166 (20048588, 004460E0, 00410F78, 0040F89F) 
0022AC18 004142CB (0022AC50, 00445218, 20010100, 004011B5) 
0022AC68 004011EC (00000001, 0022AC90, 20010100, 612756CA) 
0022ACF8 6100763A (00000000, 0022CD78, 61006C50, 00000000) 
End of stack trace 

我想知道這個文件是什麼意思和如何閱讀它,搜索了很多,但找不到滿意的答案WER。

感謝

+0

這個問題很奇怪。 NPE說你似乎混淆了兩種不同的堆棧。你究竟在做什麼?你的目標是什麼? – john 2013-04-10 06:14:03

+0

@john我創建了一個堆棧實現,其中生成了一些異常,這些異常沒有正確處理,因此輸出(核心轉儲),現在系統生成堆棧跟蹤以排除發生錯誤的位置。我想弄清楚這個stackTrace是如何讀取它的。希望使我的觀點清楚。我的stackDataStructure只是一個例子,可以讓程序崩潰並生成這個stackTrace。我只是問如何讀取這個stackTrace來找出應用程序崩潰的位置。 – 2013-04-10 06:19:46

+0

OK Arun Saha給了你一個答案 – john 2013-04-10 06:21:48

回答

2

我會嘗試解碼在調試器中轉儲的核心。

gdb ./Stack.exe ./Stack.exe.stackdump 

backtrace 
1

這使你的call stack在崩潰的地步。這與您似乎試圖執行的stack data structure無關。

對於調用堆棧上的每個函數,堆棧轉儲顯示堆棧指針,函數地址和前四個參數。不用試圖使用堆棧轉儲,可能更容易使用調試程序對程序進行故障排除。

+0

另外,找到爲你的可執行文件生成一個映射文件的選項(它將是一個鏈接標誌)。使用該映射文件,「Function」列將更易於理解。 (對於'gcc',它是'-Xlinker -Map = output.map',將映射文件的'ld'選項傳遞給鏈接階段。) – WhozCraig 2013-04-10 06:15:16

+0

@NPE我只是問如何讀這個stackTrace,我知道這個堆棧與我的數據結構沒有任何關係,還有很多應用程序崩潰的其他情況。我想知道如何讀取這個stackTrace,這個堆棧數據結構的例子只是爲了讓應用程序崩潰,因爲在那裏異常處理並不完美。 – 2013-04-10 06:23:00

+0

@GauravK:夠公平的。從你的問題來看,你完全不清楚你是否理解了這種區別。 – NPE 2013-04-10 06:23:59