【问题标题】:Pro*C based batch, Out of Memory?基于 Pro*C 的批处理,内存不足?
【发布时间】:2015-03-12 16:42:14
【问题描述】:

当尝试编译基于 Pro*C 的批处理文件时,进程“proc”卡在 1 个 CPU 内核的 100%,并且内存开始增长到系统需要 OOM 杀死进程的程度(机器有 16GB内存和进程增长到 9GB)。

以前有人见过这种行为吗?

作为附加信息:

-mk是安装主包的那个
- .pc 文件是原始文件(我尝试编译了几个,例如 dtesys.pc)
- 库已正确编译
-环境变量设置正确

【问题讨论】:

  • 预计内存使用量是多少?你是在另一台机器上运行的吗?它应该做什么?
  • 预计不会增长到这些值。我们正在谈论一个由 oracle 自己制作的软件包附带的文件。是的,我尝试在不同的开发环境中编译相同的批处理文件,并且效果很好。这批应该抓取几个表并将它们写入硬盘上的文件。
  • 发现了问题。它与不在正确路径上的“limits.h”包含有关。我相信我拥有的版本没有定义以避免在预处理中双重包含。

标签: c oracle-pro-c


【解决方案1】:

是的,它是limits.h,因为它在第123行递归地包含了自己:

 /* Get the compiler's limits.h, which defines almost all the ISO constants.
    We put this #include_next outside the double inclusion check because
    it should be possible to include this file more than once and still get
    the definitions from gcc's header.  */
#if defined __GNUC__ && !defined _GCC_LIMITS_H_
/*  `_GCC_LIMITS_H_' is what GCC's file defines.  */
# include_next <limits.h>
#endif

因此,解决方案是将 parse=none 选项传递给 Pro*C 预编译器:

proc parse=none iname=filename.pc oname=filename.c

或者,第二种选择:您可以先使用 c 预编译器预编译您的源代码以获取 pc 文件:

cpp -P -E yourfile.someextension -o yourfile.pc

然后你会得到limits.h,不用递归解析。

-P 选项是必需的,因为 Pro*C 是可能与线标记混淆的程序。

-E 选项是必需的,因为 Pro*C 是可能与非传统输出混淆的程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多