linux - 确定线程的堆栈大小和位置

标签 linux multithreading stack radix

在 Linux 下如何确定线程堆栈的基数及其大小?是否有可用的 C/C++ API 或在 gdb 中查找的方法? 谢谢

最佳答案

这是一种不同的方法,涉及阅读 /proc/self/maps .与其他一些方法不同,它不需要在程序开始时进行特殊检测,并为您提供堆栈末尾的精确位置。

如果你尝试 cat /proc/self/maps ,你会得到这样的东西:

00400000-0040c000 r-xp 00000000 08:01 6039736              /usr/bin/cat
0060b000-0060c000 r--p 0000b000 08:01 6039736              /usr/bin/cat
0060c000-0060d000 rw-p 0000c000 08:01 6039736              /usr/bin/cat
00908000-00929000 rw-p 00000000 00:00 0                    [heap]
7fcdb1c68000-7fcdb1e01000 r-xp 00000000 08:01 6032628      /usr/lib/libc-2.21.so
7fcdb1e01000-7fcdb2000000 ---p 00199000 08:01 6032628      /usr/lib/libc-2.21.so
7fcdb2000000-7fcdb2004000 r--p 00198000 08:01 6032628      /usr/lib/libc-2.21.so
7fcdb2004000-7fcdb2006000 rw-p 0019c000 08:01 6032628      /usr/lib/libc-2.21.so
7fcdb2006000-7fcdb200a000 rw-p 00000000 00:00 0
7fcdb200a000-7fcdb202c000 r-xp 00000000 08:01 6032717      /usr/lib/ld-2.21.so
7fcdb21f5000-7fcdb21f8000 rw-p 00000000 00:00 0
7fcdb2209000-7fcdb222b000 rw-p 00000000 00:00 0
7fcdb222b000-7fcdb222c000 r--p 00021000 08:01 6032717      /usr/lib/ld-2.21.so
7fcdb222c000-7fcdb222d000 rw-p 00022000 08:01 6032717      /usr/lib/ld-2.21.so
7fcdb222d000-7fcdb222e000 rw-p 00000000 00:00 0
7ffe78c41000-7ffe78c62000 rw-p 00000000 00:00 0            [stack]
7ffe78dba000-7ffe78dbc000 r--p 00000000 00:00 0            [vvar]
7ffe78dbc000-7ffe78dbe000 r-xp 00000000 00:00 0            [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0    [vsyscall]

如您所见,有一个 [stack]入口。这可能就是您正在寻找的。

解析此行的示例程序:

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

int main(int argc, char *argv[]) {
    FILE *file = fopen("/proc/self/maps", "r");
    char line[1024];
    void *result = NULL;
    while (!feof(file)) {
        if (fgets(line, sizeof(line) / sizeof(char), file) == NULL) {
            break;
        }
        unsigned long start, end, offset;
        unsigned int devma, devmi, ino;
        char perms[6];
        char path[128];
        if (sscanf(line, "%lx-%lx %5s %lx %d:%d %d %127s", &start, &end, &perms, &offset, &devma, &devmi, &ino, &path) != 8) {
            continue; // could not parse. fail gracefully and try again on the next line.
        }
        if (strcmp(path, "[stack]") == 0) { // use [stack:TID] for a thread besides the main thread
            printf("Stack found from %lx to %lx\n", start, end);
            break;
        }
    }
    fclose(file);
    return 0;
}

这将打印如下内容:

Stack found from 7fff91834000 to 7fff91855000

这可能与您正在寻找的内容非常接近。

关于linux - 确定线程的堆栈大小和位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15515708/

相关文章:

linux - 在 Ubuntu 上阻止特定瘦客户端的特定网站

php - 长时间数据库操作的最佳方法?

python - 为什么 "stack smashing detected"一旦 ZeroMQ C++ 客户端针对 python 服务器运行?

python-3.x - GEKKO中优化问题的并行化

c - Linux线程C服务器

java - 在Java中为堆栈结构创建动态数组

assembly - 引导加载程序堆栈配置

linux - 就其第三个参数而言,mprotect() 作为 ASM 系统调用的用法是什么样的?

linux - 让 GMP 与 GCC 4.5.2 一起工作

linux - 根据文件夹名称移动文件夹