首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mmap2未能为线程分配堆栈,但在GDB下工作。

mmap2未能为线程分配堆栈,但在GDB下工作。
EN

Stack Overflow用户
提问于 2013-04-14 09:08:57
回答 1查看 331关注 0票数 0

我正在ARMv7 7上运行应用程序--一台有Fedora 18,2GB内存的机器。

申请终止:

代码语言:javascript
复制
130413 15:49:34 19344 Xrd: PhyConnection: Can't run reader thread: out of system resources. Critical error.

如果我这样做,我就会看到对于一个新线程的堆栈分配失败:

代码语言:javascript
复制
mmap2(NULL, 8388608, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = -1 ENOMEM (Cannot allocate memory)
gettimeofday({1365921367, 588018}, NULL) = 0
gettid()                                = 6309
writev(2, [{"130414 02:36:07 6309 ", 21}, {"Xrd", 3}, {"", 0}, {": ", 2}, {"PhyConnection: Can't run reader "..., 80}, {"\n", 1}], 6130414 02:36:07 6309 Xrd: PhyConnection: Can't ru
n reader thread: out of system resources. Critical error.
) = 107
munmap(0x48172000, 292)                 = 0
munmap(0x48225000, 292)                 = 0

实际代码:

代码语言:javascript
复制
253       if (fReaderthreadhandler[i]->Run(this)) {
254          Error("PhyConnection",
255                "Can't run reader thread: out of system resources. Critical error.");
256 // HELP: what do we do here
257          exit(-1);
258       }

该应用程序具有300-350 is的虚拟内存大小,250 is为驻留内存大小。高内存限制为1.3GB。虚拟地址空间不受限制:

代码语言:javascript
复制
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-m: resident set size (kbytes)      unlimited
-u: processes                       1024
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  64
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 15870
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 0
-N 15:                              unlimited

但GDB确实有用!我还查看了GDB报告的限制,它们是相同的。因此,GDB不调整软限制,这将是继承的。

摘要:

  • 我有足够的内存来运行应用程序。它在GDB内部甚至工作得很好。
  • 它似乎没有达到任何资源限制。
  • 在GDB工作,但不在外面。

这里有什么不对劲的迹象吗?

EN

回答 1

Stack Overflow用户

发布于 2013-04-14 16:03:39

在GDB工作,但不在外面。

与“GDB内部”不同的是地址布局(随机化)。

为了简化调试,GDB默认禁用ASLR。你可以把它打开

代码语言:javascript
复制
(gdb) set disable-randomization off

然后运行该应用程序几次,并检查它是否仍然可靠工作。

我有足够的内存来运行应用程序。

失败的分配(映射)请求8MB的连续内存,如果您的地址空间是分段的,则可能没有这些内存。如果您实际上不需要8MB的堆栈(大多数应用程序不需要),那么可以通过将ulimit -s (或在应用程序中使用setrilimit(RLIMIT_STACK, ...) )设置为一个小得多的值来获得更多的线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15997428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档