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

C 程序在make启动时运行,但不是通过shell启动,为什么?,c,debugging,unix,makefile,C,Debugging,Unix,Makefile,我写了一个C程序,在其中我做了一些相当繁重的堆栈分配,大约2个MiB。由于我使用的是穷人的IDE*我每次编译时都会通过make自动运行程序来测试它 我几乎已经完成了所有的工作,但是出于某种原因,在一些最终的优化过程中,我直接从shell运行它。即时故障!使用make still运行它,而手动运行它总是会产生相同的故障 我最终将堆栈分配量减少到256kib,解决了这个问题。我的理由是make可能正在执行这个过程,因此它继承了一些奇怪的参数,允许它使用更多的堆栈空间 虽然现在一切都很好,但我没有办法

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

我几乎已经完成了所有的工作,但是出于某种原因,在一些最终的优化过程中,我直接从shell运行它。即时故障!使用make still运行它,而手动运行它总是会产生相同的故障

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

虽然现在一切都很好,但我没有办法检验我的理论。有人能证实或否认,或建议某种测试方法吗


*zsh、vim、gcc、gdb和一些nutty makefiles

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

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

您可以尝试使用设置最大堆栈大小,并查看其是否有效:

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

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

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

就我个人而言,我的第一步是尝试在代码中找到segfault发生的位置,无论是使用gdb还是调试printfs或其他什么。这就是为什么您总是检查malloc的返回值,它减少了可能的故障源-首先,找到问题的确切来源可以为您提供支持或反对堆栈分配理论的证据;此外,它还允许您插入错误检查代码,以便程序可以优雅地退出,并显示一条信息性错误消息,而不是segfaulting。

就我个人而言,我的第一步是尝试在代码中找到segfault发生的位置,使用gdb或调试printfs或其他方法。这就是为什么您总是检查malloc的返回值,它减少了可能的故障源-首先,找到问题的确切来源可以为您提供支持或反对堆栈分配理论的证据;此外,它还允许您插入错误检查代码,以便程序可以优雅地退出,并显示一条信息性错误消息,而不是分段出错。

是的,就是这样!在“ulimit-s unlimited”之后,它直接从shell工作。对一个成熟的make程序来说,这似乎是一个严重的bug。我使用的是gmake 3.81,我想我会给他们写封友好的电子邮件:-我不认为这是make的错误,因为它只在make之外失败:make可能出于自己的邪恶目的将ulimit设置为一个高值或无限值,这是它的子进程继承的。@pax,同意。但是,在我看来,改变子进程继承的环境仍然是一个bug。人们一直在做“make-test”之类的事情,并期望他们正在运行make不会影响任何事情。是的,就是这样!在“ulimit-s unlimited”之后,它直接从shell工作。对一个成熟的make程序来说,这似乎是一个严重的bug。我使用的是gmake 3.81,我想我会给他们写封友好的电子邮件:-我不认为这是make的错误,因为它只在make之外失败:make可能出于自己的邪恶目的将ulimit设置为一个高值或无限值,这是它的子进程继承的。@pax,同意。但是,在我看来,改变子进程继承的环境仍然是一个bug。人们一直在做“make-test”之类的事情,并期望他们正在运行make不会影响任何事情。