【发布时间】:2015-01-10 21:07:23
【问题描述】:
我有一个问题。我正在尝试从 /proc/self/maps 伪文件中获取堆栈偏移范围。但是我有时会遇到一些奇怪的事情。 这是我的代码
fp = fopen("/proc/self/maps", "r");
if (fp == NULL) {
perror("Error opening file");
return NULL;
}
while (fgets(line, 2048, fp) != NULL) {
if (strstr(line, "stack") != NULL) {
printf("%s", line);
}
}
如果你用一个或多个线程启动程序,你可以查看这个伪文件并得到类似的东西
7f20423a6000-7f2042ba6000 rw-p 00000000 00:00 0 [stack:3936]
7fffbe95e000-7fffbe97f000 rw-p 00000000 00:00 0 [stack]
这里第一行是线程栈,第二行是进程栈。 但问题是有时我无法获得线程堆栈。它可以从第一次开始,也可以出现在下一次执行中,因此无法确定。在某些发行版上,它根本不显示线程堆栈,我认为问题不在于发行版中伪文件的不同实现,而在于其他方面。 请帮忙解决这个问题
编辑
我其实是在thread里面调用这个函数,所以我通过pthread_create(&tid, NULL, proc_stack, NULL);创建线程我也一直在想这个。也许在线程启动后需要一些时间来更新这个伪文件,这只是我在这里看到的一个原因。
EDIT2
我尝试强制调用 sleep ,但这没有帮助,但最奇怪的是,在一个发行版上它显示线程堆栈,在另一个发行版上没有。
【问题讨论】:
-
创建线程后多久运行检查?你确定他们有时间真正开始吗?
-
我实际上是在线程内部调用这个函数,所以我通过 pthread_create(&tid, NULL, proc_stack, NULL); 创建线程并在线程中运行它。我也一直在思考这个问题。
标签: c++ c multithreading unix stack