我被升级OS上我们的构建中的一个从Centos的5.3 32位至CentOS 5.5 32位。做我重新启动包更新后,检查出源的全新副本,建造和运行单元测试。这依赖于我们MEMMAP基类中所有的单元测试开始失败。

当我们试图映射存储器中之后立刻后设置保护页的值发生崩溃。围绕我能够将问题隔离到我们的使用MAP_GROWSDOWN标志戳后,测试运行正常,没有它,但是当设置了标志崩溃。这些测试中表现很好,当构建系统正在运行5.3,但立刻开始,当我们升级到5.5崩溃。他们还工作,我的开发机器,也运行5.5,但实际硬件上的罚款;构建系统是XEN虚拟机。这是尚未在几个版本被修改,并具有80%的单元测试覆盖率北的代码稳定位。

所以我想我的问题是,为什么会出现这种情况?

int flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_GROWSDOWN;
int prot = PROT_EXEC|PROT_READ|PROT_WRITE;
size_t length = 524288;

long rv = ::sysconf(_SC_PAGESIZE);
if (rv < 0)
    throw SystemException(errno);
size_t pagelength = size_t(rv);

//  Adjust length for guard page
length = pagelength * (((length + pagelength - 1) / pagelength) + 1);

m_addr = ::mmap(NULL, length, prot, flags, -1, 0);
if (m_addr == MAP_FAILED)
    throw SystemException(errno);

m_stackaddr = static_cast<void *>(static_cast<char *>(m_addr) + pagelength);
m_length = length - pagelength;

// Fill the guard page with an interesting pattern
unsigned int *g = static_cast<unsigned int *>(m_addr);
for (size_t i=0; i < pagelength; i += sizeof(unsigned int))
    *g++ = 0xBADC0FFEU;  <-- SIGBUS HAPPENS HERE ON FIRST ITERATION
有帮助吗?

解决方案

它看起来像MAP_GROWSDOWN已从glibc的 http://bugs.centos.org除去/view.php?id=4767 和不应当被使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top