【问题标题】:Segmentation fault before entering main [closed]进入main之前的分段错误[关闭]
【发布时间】:2017-07-16 02:14:15
【问题描述】:

我最近对以前工作的代码做了一些小改动,现在程序在执行时会立即遇到分段错误。事实上,它甚至没有进入 main 的第一行。

这里是代码的开头:

int main (int argc, char* argv[])
{
    fprintf(stderr, "Not even getting here!\n");

    bool d;
    bool v;        
    ...
}

以及来自 gdb 的相应输出(编译时包含 -g 标志)。 警告:禁用地址空间随机化时出错:成功

Program received signal SIGSEV, Segmentation fault.
0x0000000000400978 in main (argc=<error reading variable: Cannot access         
memory at address 0x7fffca168f1c, argv=<error reading variable: Cannot 
access memory at address 0x7fffca168f10>) at src/prog.c:35

仅供参考:第 35 行只是 main 方法的左大括号(“{”)。没有实际代码。

我以前从未遇到过如此奇怪的错误,我对这是怎么发生的感到困惑。在出现此错误之前,一开始的代码根本没有改变,而且在新代码附近的任何地方甚至都没有发生分段错误这一事实让我大吃一惊。我放在 main 中的任何代码都没有被执行,所以我不能完全打印出值来看看出了什么问题。

另外,我尝试在有/没有命令行参数的情况下运行程序,看看这是否是原因。它不会改变任何东西。

【问题讨论】:

  • src/prog.c 中的第 35 行是什么?你做了哪些改变?如果您还原这些更改,它会起作用吗?
  • 第 35 行是“{”。主要的开口支架。至于更改,它们是在几个小时前进行的,并且文本编辑器已关闭,因此我无法撤消所做的更改。
  • 基础:代码#include &lt;stdio.h&gt;,#include &lt;stdbool.h&gt;?
  • 您能否提供一个可以重现此错误的代码并与我们分享?
  • 您的程序在堆栈上放置了多少数据?在 Windows 中,堆栈限制(默认情况下)仅为 1 兆字节)

标签: c segmentation-fault gdb argv argc


【解决方案1】:

发现错误。我有一个结构,其中包含 50 个其他结构的数组,该数组中的每个元素也有一个由 50 个其他结构组成的数组。我迅速将数组的大小更改为 1 以确保这是原因,结果确实如此。

main 中的代码现在执行。

【讨论】:

    【解决方案2】:

    如果没有整个代码,很难确定,但根据其他 SO 帖子和个人经验,我认为您在 main() 堆栈上分配给变量的空间过多。从操作系统的角度比较您正在使用多少字节以及您的程序允许具有的堆栈大小对您很有用。请参阅以下帖子:Segmentation Fault before main

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多