tornado创建项目后build vxworks报错unable to allocate heap, heap_chunk_size 587202560, Win32 error 0

  1. build报错“unable to allocate heap”
  2. 解决方法
  3. 原因分析
  4. 参考

build报错“unable to allocate heap”

按照原帖VxWorks+Tornado从听说到入门的相关步骤在win10下,进行到“使用篇、step4、build vxworks”时,会有以下报错

wtxtcl D:\zjm\VxWorks相关\Tornado2.2\host\src\hutils\configGen.tcl ..\Project0.wpj
ccpentium -c -g -mcpu=pentium -march=pentium -ansi -nostdlib -fno-builtin -fno-defer-pop - 
P -xassembler-with-cpp -I.. -ID:\zjm\VxWorks相关\Tornado2.2\target\config\vmware -ID:\zjm\ 
VxWorks相关\Tornado2.2\target\h      -ID:\zjm\VxWorks相关\Tornado2.2\target\config\comps\src  
-ID:\zjm\VxWorks相关\Tornado2.2\target\src\drv     -DCPU=PENTIUM -DTOOL_FAMILY=gnu  -DTOOL=gn 
u -DPRJ_BUILD   -fvolatile D:\zjm\VxWorks相关\Tornado2.2\target\config\vmware\sysALib.s -o 
 sysALib.o
ccpentium -c -g -mcpu=pentium -march=pentium -ansi -nostdlib -fno-builtin -fno-defer-pop - 
I.. -ID:\zjm\VxWorks相关\Tornado2.2\target\config\vmware -ID:\zjm\VxWorks相关\Tornado2.2\t 
arget\h      -ID:\zjm\VxWorks相关\Tornado2.2\target\config\comps\src -ID:\zjm\VxWorks相关\Tor 
nado2.2\target\src\drv     -DCPU=PENTIUM -DTOOL_FAMILY=gnu  -DTOOL=gnu -DPRJ_BUILD   -fvolati 
le D:\zjm\VxWorks相关\Tornado2.2\target\config\vmware\ln97xEnd.c -o ln97xEnd.o
d:\zjm\VxWorks相关\Tornado2.2\host\x86-win32\lib\gcc-lib\i586-wrs-vxworks\2.9-PentiumIII-0 
10221\cc1.exe: *** 2. unable to allocate heap, heap_chunk_size 587202560, Win32 error 0
make: *** [ln97xEnd.o] Error 0x1

Done.

看提示是说无法分配堆,似乎是太大了

解决方法

借助visio studio的命令行工具修改cc1.exe的二进制文件

首先打开命令行工具

进入到目录:xxx\Tornado2.2\host\x86-win32\lib\gcc-lib\i586-wrs-vxworks\2.9-PentiumIII-010221依次输入如下命令

dumpbin /HEADERS cc1.exe
editbin /STACK:67108864 cc1.exe
dumpbin /HEADERS cc1plus.exe
editbin /STACK:67108864 cc1plus.exe

然后再次进行build

原因分析

在从在WindowsXP 32位编译到Windows 7 64位的过程中,发现GCC 2.96为PowerPC编写的cc1.exe程序失败了,在一些编译中也出现了同样的错误。使用VisualStudio调试器附加到cc1.exe并使用Sysinals工具进行监视的调查表明:

1、当cc1.exe程序成功时,它会产生3个线程。

2、当cc1.exe程序失败时,第三个CreateThread()调用失败ERROR_NOT_ENOUGH_MEMORY.

3、运行VisualStudio时报告的cc1.exe图像头dumpbin /HEADERS命令,显示堆栈保留大小为400000000字节。也就是说,创建的每个线程都需要400000000字节的连续虚拟地址空间。

4、当CreateThread调用失败时ERROR_NOT_ENOUGH_MEMORY,Sysinals VMMAP工具表明,最大空闲虚拟内存区域小于请求的400000000字节堆栈保留大小。

5、cc1.exe是一个32位进程,它有2GBytes的虚拟地址空间。Windows 7具有ASLR(地址空间布局随机化),这使得DLL的负载地址被随机化。我认为ASLR实际上正在分割虚拟地址空间,因此在cc1.exe进程的某些调用中,加载DLL使用的虚拟地址不会为线程堆栈留下足够大的空闲区域。和ASLR一样,在Windows 7中,加载到cc1.exe中的DLL比在WindowsXP下加载的DLL多出大约4倍,这可能是问题的原因。

基于上述调查,VisualStudioeditbin /STACK:67108864程序用于将cc1.exe的堆栈保留大小减小到64兆字节,其中选择64兆字节作为用于C+代码的cc1plus.exe程序的堆栈保留大小。随着堆栈储备大小的减小,ERROR_NOT_ENOUGH_MEMORY错误没有再出现。

参考

https://www.jianshu.com/p/d156809e0e64
http://www.babaiye.com/?p=349
https://stackoverflow.com/questions/14840572/win32-error-8-during-ccppc-compile-on-windows-7-x86


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 452966517@qq.com

文章标题:tornado创建项目后build vxworks报错unable to allocate heap, heap_chunk_size 587202560, Win32 error 0

文章字数:816

本文作者:Night Zhang

发布时间:2019-08-23, 14:11:28

最后更新:2019-08-23, 14:33:12

原始链接:https://night-zhang.github.io/2019/08/23/tornado创建项目后build-vxworks报错unable-to-allocate-heap-heap-chunk-size-587202560-Win32-error-0/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github