这两天一直遇到标题上的问题,我相信很多朋友在执行代码的时候都会遇到这样的问题,我在网上也找了很多的资料解决这个问题,虽然有些方法能解决,但是总觉得总结的不是很全面,这里我自己在相对全面的总结一下,如果有不对的地方还请各位看官指正。

首先要交代一下背景情况,我执行的这段代码是别人写的,这段时间是我一直在维护,因为平台不一样,所以读库的方式不一样,我先在liunx的环境下编译了程序,执行都没有问题,可以按照我接口的方式读到数据库的数据。但是我用vs2010的window环境下编译的时候就出现了以下图片的问题。

字面上翻译过来的话就是:栈溢出了。

意思就是你分配的内存太小了,而你程序中有的数据太大,这里导致了栈溢出的情况。

于是我就在网上找资料来查询这个问题,一搜一大堆。

其中普遍的解决方式就是在   属性-》链接器-》系统-》堆栈保留大小和堆栈提交大小  中将数据增加,我这里将这两个数值都改成了16000000。如下图所以:

程序确实是可以运行起来了,但是我在想一个问题,一般我们程序都是使用的默认值,出现这样的问题归根到底的原因是什么呢?

其实还是回到我上面说到的那个问题 堆栈溢出了,vs在程序启动的时候一般分配的堆栈大小是1M的空间,如果你的全局变量或者静态变量有很大的值的话,这里就会出现这样的堆栈溢出的问题。

于是我就在代码里面找是否有较大数据的全局变量,发现了一个宏定义如下图所示:

这个宏定义一下就是1M了,加上其他的一些定义,肯定就超过了1M,如果你是在DEBUG的情况下去调试程序的时候,你会发现连主函数都进不去,因为有全局变量在主函数执行之前就已经栈溢出了,就好像下面这种情况,断点无效。

但是领导那边的要求是程序必须通过命令行的方式编译也要通过,因为客户那边只会操作命令行。

操作命令不难就是在有pro文件的情况下在命令行输入qmake,生成了makefile文件,再执行nmake,生成可执行文件。那么问题来了我用这种方式也执行成功了,也生成了可执行文件exe,但是当我双击exe的时候程序并没有起来,而且没有任何打印信息,这里我想到了可能还是这个栈溢出的问题,pro文件中应该也需要设置一下上面提到的堆栈保留大小和堆栈提交大小。那么在pro文件中如何去设置这两个量呢?

在pro文件中添加上以下两个量就可以了:

QMAKE_CXXFLAGS += /F 16000000
QMAKE_LFLAGS   += /STACK:16000000

这个设置跟vs2010上面的设置是一样的,当然大小自己可以定的,我这里还是设置的大小为16000000。

最后总结:

其实把问题都真正弄清楚了再会看一点都不难,但是在处理的过程中感觉还是比较费劲儿的,所有的提示都是比较精准的,最后找其原因还是回到了最本质的问题,我建议的话还是尽量将全部变量的大小设置的小一点,1024*1024就有点大了,我维护的这段代码并不是我写的,所以我还是准从开发的意愿吧。

希望这边文章对大家还是有所帮助 谢谢!!!

深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!的更多相关文章

  1. 有未经处理的异常: 0xC00000FD: Stack overflow

    将“项目属性.链接器.系统.堆栈保留大小”设大一点比如16000000 这是我在网上找到的答案,很好的解决了我的问题,忘了是哪位大神了,总之,向大神致敬

  2. 未处理的异常 stack overflow

    今天在编译程序时遇到“0x00e304f7 处有未经处理的异常: 0xC00000FD: Stack overflow”的错误,也就是栈溢出了,google了一下,原来是我申请的一个变量太大了,con ...

  3. w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常

    一.问题描述 昨天系统联调,用到了VS2010 附件进程,把w2wp.exe 进程添加到vs2010 的调试进程中,这样其他系统访问我们系统,就可以捕获断点进行调试 但是,今天F5 调试的时候,发现直 ...

  4. “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确

    引用sqlite的程序集时,有时会报如下异常:  "System.BadImageFormatException"类型的未经处理的异常在 PurchaseDevices.Acces ...

  5. System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生

    异常信息: “System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization. ...

  6. 使用C#在VS中开发:未处理AccessViolationException “System.AccessViolationException”类型的未经处理的异常

    未处理AccessViolationException: “System.AccessViolationException”类型的未经处理的异常在System.Data.dll中发生 其他信息:尝试读 ...

  7. OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合

    昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...

  8. “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。

    如果你的 WebService 客户端证书配置都没问题,唯独调用接口会出现这个错误 “System.FormatException”类型的未经处理的异常在 System.IdentityModel.d ...

  9. c#重命名文件,报错“System.NotSupportedException”类型的未经处理的异常在 mscorlib.dll 中发生”

    修改远程服务器的文件名,报错“System.NotSupportedException”类型的未经处理的异常在 mscorlib.dll 中发生”,“System.NotSupportedExcept ...

随机推荐

  1. Elasticsearch(10) --- 内置分词器、中文分词器

    Elasticsearch(10) --- 内置分词器.中文分词器 这篇博客主要讲:分词器概念.ES内置分词器.ES中文分词器. 一.分词器概念 1.Analysis 和 Analyzer Analy ...

  2. 前台提交数据到node服务器(get方式)

    .有两种办法,一种是表单提交,一种是ajax方式提交. 1.form提交  在前台模板文件上写: <form action="/reg" method="get&q ...

  3. Java 从入门到进阶之路(六)

    之前的文章我们介绍了 Java 的数组,本章我们来看一下 Java 的对象和类. Java 是一种面向对象语言,那什么是对象呢,对象在编程语言中属于一个很宽泛的概念,我们可以认为万事万物都是对象,每个 ...

  4. 为何stop()和suspend()方法不推荐使用(转)

    stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性. 用Thread.stop()方法来终止线程将会释放该线程对象已经锁定的所有监视器.如果以前 ...

  5. 前端获取后台传输过来是数据 {张三:12} 解析为[object object],获取其中内容

    昨天遇到前端传输过来的数据为[{张三:12},{李四:23}],后台用的是map格式,我在前端js中暂未找到直接调用对象内容的方法,故利用以下方法来获取: $.each(data.data,funct ...

  6. sort,uniq,wc,tr

    sort (选项)(参数)      sort是用来排序数据的. 以下面这个文本为例 [root@bogon ~]# cat a 123 4567 88 abc aaa AAA jk 777 777 ...

  7. phpexcel来做表格导出(多个工作sheet)及设置单元格格式

    <?php /** * 简单实用Execl */ set_include_path('.'.get_include_path().PATH_SEPARATOR.dirname(__FILE__) ...

  8. 3. Git与TortoiseGit基本操作

    1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(Check out ...), 更新 (U ...

  9. Spark 学习笔记之 共享变量

    共享变量: 共享变量通常情况下,当向Spark操作(如map,reduce)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被 ...

  10. C++set 和 multiset的使用

    最后一个自由支配的暑假,学一些自己感兴趣的部分,也算为大三作准备. C++中set集合的使用 定义一个int类型的集合 set<int> s: set<int>::iterat ...