2013-04-10 98 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