【问题标题】:Why coredump does not generate for my C application为什么 coredump 不会为我的 C 应用程序生成
【发布时间】:2016-07-01 04:55:09
【问题描述】:

我正在运行 ubuntu 14.04。我跑了

$ulimit -c unlimited

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

 21876 Segmentation fault      (core dumped) | ./stack6

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

 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.
  }
}

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

【问题讨论】:

  • 贴出导致核心转储的代码
  • 您注释掉的部分是相关的。显示整个代码
  • 代码很大...而且我无法更改代码(这意味着我无法调整它以生成核心转储)。除了使用 coredump 之外,还有其他方法可以调试这个程序吗(请注意,我更喜欢像 coredump 提供的那样重建崩溃状态)?

标签: c debugging


【解决方案1】:

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

程序本身可以更改当前工作目录 -- chdir -- 您的程序可能正在这样做 -- 而您可能只是在错误的目录中查找

你编译程序的方式与它是否会生成一个内核无关,除了内存布局可能会被改变,这样segfault或任何触发内核的事情可能不再发生

【讨论】:

  • 其实我犯了一个错误。你说得对,我编译的方式无所谓
  • 嗨,我发现了问题。你是完全正确的。代码中有一个chdir,核心文件就在目标目录中...
【解决方案2】:

Undefined behavior

当你做一些你不应该做的事情时,比如在内存范围之外写,任何事情都可能发生。它可以核心转储,可以输出不可预知的结果,或者可以正常工作。

-m32 选项改变了变量的布局,因此可以改变什么被踩到,什么没有被踩到。

程序核心转储有时并不意味着它会一直进行核心转储。

贴出代码,我们大概可以识别出UB的来源。

【讨论】:

  • 嗨,感谢您的提示。我只是更新问题。 -m32 不会造成差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多