スレッドのスタック領域情報の取得

Unix 系でもそれぞれ異なるので調べた。

スタックオーバーフローのハンドリング (Stack Overflow Handling)

Linux

header
  • #define _GNU_SOURCE
  • pthread.h
API

int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr);

main thread

pthread_getattr_npでもgetrlimit(2) でもとれるが、guard pageのサイズが含まれていることに注意。
__libc_stack_endでもaddrっぽいものが取れるが、argvやenviron、auxvの分ずれている。pthread_attr_getstackaddrは/proc/[pid]/mapsを読んで補正してくれている。
LinuxThreads では pthread_*_np 不可。

FreeBSD, DragonFly BSD

header
  • pthread_np.h
API
  • int pthread_attr_get_np(pthread_t pid, pthread_attr_t *dst);
main thread

pthread_*_np のみ。getrlimit(2) 不可。

NetBSD

manpage

なし

header
  • pthread.h
API
  • int pthread_attr_get_np(pthread_t pid, pthread_attr_t *dst);
main thread

pthread_*_np、getrlimit 共に可。

OpenBSD

header
  • pthread_np.h
API

int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);

main thread

未調査

Mac OS X

manpage

なし

header
  • pthread.h
API

size_t pthread_get_stacksize_np(pthread_t);
void * pthread_get_stackaddr_np(pthread_t);

main thread

getrlimit(2) を用いる。pthread_*_np 不可。
…だったと思うのだが、最近は大丈夫っぽい?