所以,它完全未经测试,但这是一些互联网浏览的结果。
首先堆栈基地址存在于 中/proc/<pid>/maps
,然后它必须在某个时刻可以从用户空间访问。
我查看了pstack命令的代码,该命令打印正在运行的进程的堆栈内容。此代码从link_map
结构中获取基地址并将其存储在字段中l_addr
。该字段在函数内部设置readLinkMap()
:
static void readLinkMap(int pid, ElfN_Addr base, struct link_map *lm,
char *name, unsigned int namelen)
{
/* base address */
lm->l_addr = (ElfN_Addr) ptrace(PTRACE_PEEKDATA, pid,
base + offsetof(struct link_map,l_addr), 0);
/* next element of link map chain */
if (-1 != (long) lm->l_addr || !errno)
lm->l_next = (struct link_map *) ptrace(PTRACE_PEEKDATA, pid,
base + offsetof(struct link_map, l_next), 0);
if ((-1 == (long) lm->l_addr || -1 == (long) lm->l_next) && errno) {
perror("ptrace");
quit("can't read target.");
}
loadString(pid, base + offsetof(struct link_map, l_name), name, namelen);
}
我想这是正确的方法。因此,我建议您查看pstack
命令的代码(文件不是很长)并从中获得灵感,因为它执行的操作与您想要的非常相似(至少如果我理解您说的正确的话) )。
希望这篇简短的笔记对您有所帮助。