在Linux机器上运行C代码时出现分段错误(核心转储)

时间:2018-09-08 12:38:25

标签: c linux segmentation-fault

如果使用Visual Studio在Windows机器上运行C代码,则不会显示分段,并且输出也符合预期。 注意:在代码中有很多指针用于内存分配和释放。指针的使用深度很高(最多3个级别)。
可能是什么问题呢??在gdb中调试C代码也非常困难,因为它仅显示哪个函数引发seg错误,而不是代码中的行。

1 个答案:

答案 0 :(得分:1)

您还没有真正提供足够的信息。这里的人将需要更多信息,才能为您提供帮助。如果有更多详细信息,我将更新答案。

到目前为止,您几乎可以执行此操作。

  1. 尝试缩小问题范围,并将其发布在此处。当然,您使用C的经验有限,没关系。但是,尽管您可能没有意识到,但是您所提供的有关程序的详细信息(例如,指针的“大量使用”或“指针的指针”(3级)等)适用于每个现实世界的C程序。在看到segfault的地方查找功能。

  2. 您确定对it works on windows, but not linux的结论。或仅仅是间歇性故障(有时会随机工作/失败)。确保在Windows和Linux上使用不同的输入(如果可能)多次运行它。

  3. 发布一些详细信息,例如您在Windows vs Linux上使用哪个编译器。根据我的经验,我看到字符串分配在不同的编译器中的工作方式不同。

  4. 如果可能的话,尝试发布一段可复制的代码,这是程序中的一小段代码,可以独立运行,并显示类似的错误。或至少张贴一段段错误的代码和堆栈跟踪。这就是人们最有可能为您提供帮助的方式。

  5. 如果您的程序在出现分段错误时生成核心文件,请了解如何使用gdb对其进行分析(如果尚未执行的话)。它提供了相当详细的信息。如果没有生成核心文件,或者它不完整/损坏。在启动程序之前,请在终端上运行ulimit -c unlimited,或将此行放入〜/ .bashrc文件中。

  6. 了解如何使用valgrind。使用valgrind运行程序,并查看生成的报告是否显示为invalid readsinvalid writes。经验法则是,您不应该拥有任何这些,除非您在经过审查后完全确定存在某个原因,除非您有绝对的把握。大多数时候,总有一种更好的方法来避免这种情况。任何此类错误都会导致您遇到问题,或将来发生其他问题。