C++ 将堆栈跟踪转储到 *.exe.stackdump

Posted

技术标签:

【中文标题】C++ 将堆栈跟踪转储到 *.exe.stackdump【英文标题】:C++ Dumping stack trace to *.exe.stackdump 【发布时间】:2016-03-30 10:06:55 【问题描述】:

正在为赋值编写一些代码,以将整数作为输入并将它们放入要打印的数组中。

据我所知,我正在清理所有指针,但我不断收到运行时错误:

1 [main] new 3444 cygwin_exception::open_stackdumpfile: Dumping stack trace to new.exe.stackdump

代码主体:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int array[10];
int * p = array;

int *readNumbers()

    int i=0;
    for(i=0;i<10;i++)
    
        string number;
        int numb;
        cout << "enter digit " << i << " of 10" << endl;
        getline(cin, number);
        istringstream (number) >> numb;
        array[i]=numb;
    
    return p;
    delete p;


void printNumbers(int *numbers,int length) 

    int i;
    for(i=0;i<length;i++)
    
        cout << i << " " << *(numbers+i) << endl;
    

及主要调用代码:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

extern int *readNumbers();
extern void printNumbers(int *,int);


int main()

    int * q = readNumbers();
    printNumbers(q,10);
    delete q;
    return 0;

所以只是寻找堆栈转储的解决方案... 此外,我确定我用来将cin 返回的string number 应用于array[10] 中包含的值的方法不是问题所要寻找的,因此对此的任何注释都会很棒。 谢谢

【问题讨论】:

最佳解决方案取决于您的开发环境,因此您需要详细说明您的操作系统、编译器、IDE 等。 旁注:delete p;return p; 之后永远不会执行。为什么要删除无论如何都没有分配新的东西?这实际上适用于您的主要功能中的delete q;,我认为这是您崩溃的根本原因 不应在主调用代码中删除 q,因为 q 指向数组 【参考方案1】:

返回指向在函数内部分配的内存的指针不是一个好习惯,在这种情况下,您甚至没有在函数内部分配它,而是在全局空间中完成了它。 在编译期间激活所有警告是一个很好的做法,甚至在执行分配时将它们视为错误。 作为提示,您可以在 main 函数中分配内存,然后将指针传递给 readNumbers 函数。这样它就保持在同一范围内,并且更易于管理。 此外,与将数组长度传递给 printnumbers 函数的方式相同,您应该将其传递给 readnumbers one,而不是对其进行硬编码。

【讨论】:

【参考方案2】:

您的delete 无效,您只能删除您使用new 分配的内容。

第一个是无害的,因为它是在返回之后,所以永远不会执行(顺便说一句,您应该查看编译器警告)。

第二个可能会导致您的崩溃。

Also I'm sure the method I used to apply the string number returned by cin to the values contained in array[10] is not what the question was looking for so any notes on that would be great.

没关系。值得怀疑的是,数组的大小到处散布,如果你想改变它会发生什么?

【讨论】:

以上是关于C++ 将堆栈跟踪转储到 *.exe.stackdump的主要内容,如果未能解决你的问题,请参考以下文章

从核心转储中获取堆栈跟踪

如何转储 goroutine 堆栈跟踪?

有没有办法在不抛出异常的情况下转储堆栈跟踪?

在 App::abort(403) 之后抑制 Laravel 日志中的堆栈跟踪转储

TraceTool 跟踪工具的瑞士军刀(C++版使用)

来自未处理异常的 C++ 堆栈跟踪?