【问题标题】:Sometimes cannot get stack range from /proc/self/maps有时无法从 /proc/self/maps 获取堆栈范围
【发布时间】: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


【解决方案1】:

在我的系统上,您的程序也没有显示第二个 stack 段,但似乎在 [heap] 上方分配了 5 个段,其中一个用于线程堆栈(proc_stack() 的局部变量存储在此段中)。

我用来检查它的代码(test.c):

#include <stdio.h>
#include <string.h>
#include <pthread.h>

void* proc_stack(void* p){
   FILE *fp;
   char line[2048];
   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);
//      }
   }
   printf("addr = %p %p\n", &fp, &line);
   return NULL;
}

int main(){
   pthread_t tid;
   void *rv;
   proc_stack( NULL );
   puts("main");
   pthread_create( &tid, NULL, proc_stack, NULL );
   pthread_join( tid, &rv );
   return 0;
}

使用gcc -Wall test.c -pthread 编译。结果(删除了一些行):

...
01933000-01954000 rw-p 00000000 00:00 0                                  [heap]
...
7fff75be3000-7fff75c04000 rw-p 00000000 00:00 0                          [stack]
7fff75d97000-7fff75d98000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
addr = 0x7fff75c00e68 0x7fff75c00e70
main
...
01933000-01954000 rw-p 00000000 00:00 0                                  [heap]
7f3be0000000-7f3be0021000 rw-p 00000000 00:00 0 
7f3be0021000-7f3be4000000 ---p 00000000 00:00 0 
7f3be6b79000-7f3be6b7a000 rw-p 00000000 00:00 0 
7f3be6b7a000-7f3be6b7b000 ---p 00000000 00:00 0 
7f3be6b7b000-7f3be737b000 rw-p 00000000 00:00 0 
...
7fff75be3000-7fff75c04000 rw-p 00000000 00:00 0                          [stack]
7fff75d97000-7fff75d98000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
addr = 0x7f3be73796c8 0x7f3be73796d0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2011-05-14
    • 2012-04-08
    • 2014-10-16
    • 1970-01-01
    • 2012-12-13
    • 2015-05-16
    • 2012-08-09
    相关资源
    最近更新 更多