繁体   English   中英

程序在 make 启动时运行,但不是通过 shell,为什么?

[英]Program runs when launched by make, but not via shell, why?

我写了一个 C 程序,在其中我做了一些相当繁重的堆栈分配,大约 2 MiB。 由于我使用的是穷人的 IDE*,所以每次编译时,我都会通过 make 自动运行程序以对其进行测试。

我几乎已经完成了所有工作,但由于某种原因,在一些最终优化期间,我直接从 shell 运行它。 即时段错误,使用 make 运行它仍然有效。 并且手动运行它总是会产生相同的段错误。

我最终将我正在执行的堆栈分配量减少到 256 KiB,从而解决了这个问题。 我的理由是 make 可能正在执行该进程,因此它继承了一些奇怪的参数,允许它使用更多的堆栈空间。

虽然现在一切都很好,但我无法检验我的理论。 任何人都可以确认或否认,或建议某种测试方式吗?

* zsh、vim、gcc、gdb 和一些疯狂的 makefile

您可以尝试使用ulimit(1)设置最大堆栈大小,看看它是否有效:

# Limit stack to 1024 KiB
ulimit -s 1024; ./myprogram
# Now no limit
ulimit -s unlimited; ./myprogram

就个人而言,我的第一步是尝试使用 gdb 或调试printf或其他任何方法来定位代码中发生段错误的位置。 (这就是为什么您总是检查 malloc 的返回值的原因,它减少了段错误的可能来源;-p)一方面,找到问题的确切来源可以为您提供支持或反对您的堆栈分配理论的证据; 此外,它还可以让您插入错误检查代码,以便程序可以优雅地退出并提供信息丰富的错误消息而不是段错误。

需要更多信息来诊断。 也就是说,很高兴看到您正在使用的 makefile 和 shell 脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM