Mmap()返回相同的指针两次
mmap() returns same pointer twice
我遇到了一个页面分配器的问题,我无法理解。该程序在Ubuntu 14.04 x86_64上运行,g++——版本输出显示"g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2"。
我的问题是,有时,我从mmap()调用中收到了我已经从先前的调用中收到的相同的指针,而以前的指针从未被mmunmap():ed。例如,在一个调试会话中,我成功地分配了2097152个字节,并获得了指针0x7fffaa398000,然后一段时间后,在其他一些分配中,我成功地为同一个指针0x7fffaa398000分配了12288个字节。分配器接着进行断言,因为簿记注意到了这个双条目。
调用是这样的:
void *p = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
指针是否可能以其他方式获得释放,而不是munmap()?
首先,如果强制映射地址,您确定不会与任何内容冲突吗?如果您为映射指定了一个地址,那么该位置的任何先前存在的映射都将被丢弃并覆盖。
查找在被复制的指针之前取消映射位于的内存的munmap()
调用,但是它足够接近以至于未映射的内容量覆盖了所讨论的地址。我冒昧地说,很可能是指针和/或映射长度被损坏了。如果您"over"- munmap()
和/或不对齐- munmap()
,内存仍然会被取消映射,但它不会对应于您分配的块。在strace
下运行进程,并且只跟踪 mmap()
和munmap()
调用,以尽量减少由时间问题引起的影响。查找munmap()
调用,其中地址加长度覆盖了您看到映射两次的指针。
嗯,你需要检查有没有重叠,试试这个或类似的。也可能有一个你可以映射的最大值。
警告未测试代码::
std::set<decltype(void *)> mySet;
// On mmap
void *p = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
assert(!(p & 0xfff));
auto pp = p;
while (size > 0) {
if (mySet.count(pp) {
printf("bug %pn", pp);
mySet.insert(pp);
pp += 4096;
size -= 4096;
}
// On unmap
res = unmap(p, size);
assert(!(p & 0xfff));
auto pp = p;
while (size > 0) {
if (!mySet.count(pp) {
printf("bug %p, size %dn", pp, mySet.size()); // %d or ld???
mySet.erase(pp);
pp += 4096;
size -= 4096;
}
mmap()
调用通常传递给文件描述符/驱动程序,在您的情况下是-1
(我假设您通常使用有效的描述符)。我的建议是,您查看驱动程序的代码,特别是驱动程序的mmap()
函数,并验证其功能。
另外查看dmesg
输出,如果有任何关于驱动程序的错误/警告。
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 不能通过两次带大括号的指针
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 析构函数在与 STL 的共享指针中调用两次
- 两次读取指针就是给出垃圾值
- 静态 c++ 对象中的 JNI 环境指针并调用连续两次使用字符串参数的 Java 函数会使 JVM 崩溃
- C++重载getter两次,一次返回指针,另一次返回常量引用,都失败了
- Java用JNI调用C++:为什么JNIEnv指针被取消引用两次
- 为什么我不能一次定义两个指针
- c++删除指针两次
- 什么是delete指针,指针=0;表述功?它清除内存两次吗?
- C++两次传递函数指针导致问题
- 为什么删除指针两次会导致崩溃
- Mmap()返回相同的指针两次