StackTrace C ++应用程序

时间:2013-04-10 06:07:32

标签: c++ stack-trace

我编写了一个C ++堆栈应用程序并使用CYGWIN g ++编译器运行它。应用程序崩溃,因为异常处理不当。

它将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

我想知道这个文件的含义以及如何阅读,google了很多但找不到满意的答案。

由于

2 个答案:

答案 0 :(得分:2)

我会尝试解码调试器中转储的核心。

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

backtrace

答案 1 :(得分:1)

这会在崩溃时给你call stack。这与您似乎试图实施的stack data structure无关。

对于调用堆栈上的每个函数,堆栈转储显示堆栈指针,函数的地址和前四个参数。而不是尝试使用堆栈转储,使用调试器对程序进行故障排除可能更容易。