为什么coredump不会为我的C应用程序生成

时间:2016-07-01 04:55:09

标签: c debugging

我正在运行ubuntu 14.04。我跑了

$ulimit -c unlimited

核心转储已启用,当我触发coredump时,我可以在我的一个C应用程序目录中生成“核心”文件。在coredump期间,我可以在shell中看到以下内容:

 21876 Segmentation fault      (core dumped) | ./stack6

但是,我在另一个目录中触发另一个C应用程序的核心转储,但它不会生成“核心”文件。我在coredump期间看到的这个应用程序的消息是:

 21056 Segmentation fault      (core dumped) | ./stackN

我很确定这不是目录权限的问题。为什么我的第二个应用程序不生成“核心”文件?

更新1: 可能很容易描述核心转储的原因,而不是为我们的讨论发布代码。

代码如下所示:

static char buf[100];

int main() {
  while (1) {
  // get stdin and copy to buf, we maintain an index so that new inputs will be concatenated with the old one in the buffer.
  }
}

通过从stdin提供大量输入来触发核心转储。到目前为止,如果我只是使用第二种方法编译它总是转储。我怀疑这是构建二进制文件导致coredump问题的方式。

2 个答案:

答案 0 :(得分:2)

核心被转储到当前工作目录中,并且可能与您启动程序的目录不同。

程序本身可以更改当前工作目录 - chdir - 并且您的程序可能正在执行此操作 - 您可能只是在查找错误的目录

编译程序的方式与生成核心的方式无关,除了内存布局可能会被更改,以便可能不再发生段错误或触发核心的任何内容

答案 1 :(得分:0)

Undefined behavior

什么时候做你不应该做的事情,比如在内存边界之外写,什么都可能发生。它可以核心转储,它可以输出不可预测的结果,或者它看起来可以正常工作。

-m32选项改变了变量的布局,因此可以改变踩踏的内容和不踩踏的内容。

仅仅因为程序核心转储有时并不意味着它会一直在核心转储。

发布代码,我们可以确定UB的来源。