我正在运行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问题的方式。
答案 0 :(得分:2)
核心被转储到当前工作目录中,并且可能与您启动程序的目录不同。
程序本身可以更改当前工作目录 - chdir - 并且您的程序可能正在执行此操作 - 您可能只是在查找错误的目录
编译程序的方式与生成核心的方式无关,除了内存布局可能会被更改,以便可能不再发生段错误或触发核心的任何内容
答案 1 :(得分:0)
什么时候做你不应该做的事情,比如在内存边界之外写,什么都可能发生。它可以核心转储,它可以输出不可预测的结果,或者它看起来可以正常工作。
-m32
选项改变了变量的布局,因此可以改变踩踏的内容和不踩踏的内容。
仅仅因为程序核心转储有时并不意味着它会一直在核心转储。
发布代码,我们可以确定UB的来源。