我正在使用pthread.h
中的glibc-2.27
库,并且当我的进程调用pthread_create()
十八次或更多次(它应该是一个繁重的多线程应用程序)时,该进程因错误消息而中止:
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
我在调试过程中做了一些strace
,并且找到了原因。显然,作为mmap()
一部分的所有对pthread_create()
的隐式调用都看起来像这样:
mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f6de43fa000
一个人可以注意到MAP_STACK
标志,它指示:
在适合进程或线程堆栈的地址处分配映射。该标志当前是no-op,但在glibc线程实现中使用,因此,如果某些体系结构需要对堆栈分配进行特殊处理,则以后可以透明地实现对glibc的支持。
((我的系统上的man mmap
-Ubuntu 18.04 LTS)
可以配置pthread_create
呼叫不这样做吗?还是可以使用brk
或其他方式自动增加数据段?
感谢您的帮助!
可以配置pthread_create调用不执行此操作吗?
[您的问题极不可能与此MAP_STACK
标志有关。