使用clone():分段错误

时间:2010-07-23 10:11:54

标签: c++ segmentation-fault clone

我想使用clone记录程序的当前状态。 它有很多循环,我想跟踪进程而不在每次循环迭代中打印状态。

这就是我创建这个概念验证的原因:

#include <iostream>
#include <cstdlib>

unsigned int i;

int log(void*) {
  std::cout << "LOGGING START" << std::endl;
  while(true) {
    sleep(1);
    std::cout << i << std::endl;
  }
}

int main()  {
  void **child_stack = (void**)malloc(16384);
  i = 0;

  std::clog << "calling clone" << std::endl;
  clone(log, child_stack, CLONE_VM | CLONE_FILES, NULL);
  std::clog << "done" << std::endl;

  while(true) {
    ++i;
  }

  return 0;
}

当我在没有gdb的情况下运行它时,它会在clone()处崩溃并出现分段错误,但如果我使用gdb则可以正常工作。为什么呢?

你认为这是一个好习惯还是迟早会遇到麻烦? 有没有更好的方法来实现这一目标?

干杯,

曼努埃尔

2 个答案:

答案 0 :(得分:1)

clone的堆栈参数是一个简单的void*。此外,堆栈在大多数体系结构上都会增长,因此堆栈指针应指向已分配内存的 end

在任何情况下,除非您确实需要避免对外部库的任何依赖,否则不应直接使用clone。请改用pthreads库。它提供了一个更容易(和更安全)的API。

答案 1 :(得分:0)

在intel处理器上,child_stack参数应该指向堆栈的顶部,而不是底部。

无论如何,我认为使用clone不是一个好主意。调用clone的方法大约有三种,具体取决于结构,所有方法都记录不清。我建议使用pthreads库(或者,因为我们使用的是C ++,Boost.Threads)。