我想使用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则可以正常工作。为什么呢?
你认为这是一个好习惯还是迟早会遇到麻烦? 有没有更好的方法来实现这一目标?
干杯,
曼努埃尔
答案 0 :(得分:1)
clone
的堆栈参数是一个简单的void*
。此外,堆栈在大多数体系结构上都会增长,因此堆栈指针应指向已分配内存的 end 。
在任何情况下,除非您确实需要避免对外部库的任何依赖,否则不应直接使用clone
。请改用pthreads库。它提供了一个更容易(和更安全)的API。
答案 1 :(得分:0)
在intel处理器上,child_stack
参数应该指向堆栈的顶部,而不是底部。
无论如何,我认为使用clone
不是一个好主意。调用clone
的方法大约有三种,具体取决于结构,所有方法都记录不清。我建议使用pthreads库(或者,因为我们使用的是C ++,Boost.Threads)。