1

C++ スタック アプリケーションを作成し、CYGWIN g++ コンパイラを使用して実行しました。例外が完全に処理されないため、アプリケーションがクラッシュします。

スタック トレース ダンプがファイル 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

このファイルの意味と読み方を知りたいのですが、よくグーグル検索しましたが、満足のいく答えが見つかりませんでした。

ありがとう

4

2 に答える 2

1

これにより、クラッシュの時点でのコール スタックが得られます。これは、実装しようとしていると思われるスタック データ構造とは無関係です。

コール スタックの各関数について、スタック ダンプは、スタック ポインター、関数のアドレス、および最初の 4 つの引数を示しています。スタック ダンプを操作する代わりに、デバッガーを使用してプログラムのトラブルシューティングを行う方が簡単な場合があります。

于 2013-04-10T06:13:09.910 に答える