当我尝试调试我的C程序时,甚至在编译器开始执行任何行之前我得到: “HistsToFields.exe中0x00468867处的未处理异常:0xC00000FD:堆栈溢出。”
我不知道如何发现问题,因为程序甚至没有开始执行任何行(或者至少这是我从编译器调试窗口中看到的)。如果我的程序还没有执行任何一行,怎么能告诉导致溢出的原因? “调试器打破它的时间指向chkstk.asm中的一行”
我在win7上使用Microsoft Visual Studio 2008。
我将Stack Reserve Size设置为300000000
PS:用于在另一台机器上执行罚款的程序。
我有一个csv格式的数据库(120000 x 60),我需要将其更改为空格分隔。该程序(我自己没有写)定义了输出文件的结构:
`struct OutputFileContents {
char Filename[LINE_LEN];
char Title[LINE_LEN];
int NVar;
char VarName[MAX_NVAR][LINE_LEN];
char ZoneTitle[LINE_LEN];
int NI;
int NJ;
int NK;
double Datums[MAX_NVAR];
double Data[MAX_NVAR][MAX_NPOINT];`
最后一个数组“Data [] []”包含所有输出。因此是巨大的尺寸。 此数组大小“MAX_NPOINT”在项目的标题源文件中设置,此标题由项目中的多个程序使用。
非常感谢您提前。 艾哈迈德。
答案 0 :(得分:3)
首先,IDE!=编译器!=调试器。
其次,无论为什么调试器无法调试应用程序 - 堆栈中巨大的数据集是严重的设计错误。修复设计错误,调试器问题就会消失。
至于调试器失败的原因......不知道。安装的RAM太少了? 32位对64位平台?构造静态变量的无限递归?如果不看你没有向我们展示的东西,比如来源,环境规格等,就不能说真的。
编辑:如果错过了提示:在main()
开始执行之前构建全局/静态数据对象。这些构造函数中的无限(或刚刚太深)递归可以触发堆栈溢出。 (我假设C ++而不是C,因为您给出的错误消息显示“未处理的异常”。)
编辑2:您添加了一个“数据库”,您需要将其转换为以空格分隔。没有看到你的其余代码:尝试在内存中一次完成整个转换并不是一个好主意。读取记录,转换,写入。重复。如果您需要“最长记录”之类的东西来确定输出格式,请将只读的输入迭代一次以查找输出大小,然后再次迭代进行实际转换。