程序运行时由make启动,但不是通过shell启动 - 疯狂的废话!

时间:2009-03-19 19:13:44

标签: c debugging unix makefile

我写了一个C程序,其中我做了一些相当重的堆栈分配,大约2 MiB。因为我使用穷人的IDE *我每次编译时都会通过make自动运行程序来测试它。

我几乎完成了所有事情,但出于某种原因,在最后的一些优化过程中,我直接从shell运行它。即时段错误!使用make运行它仍然有效,并且手动运行它总是产生相同的段错误。

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

就个人而言,我的第一步是尝试找到段错误发生在代码中的哪个位置,使用gdb或调试printf或其他。 (这就是为什么你总是检查来自malloc的返回值,它减少了段错误的可能来源;-p)首先,找到问题的确切来源可以为你提供有关堆栈分配理论的证据;此外,它还允许您插入错误检查代码,以便程序可以使用信息性错误消息而不是segfaulting正常退出。

答案 2 :(得分:0)

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