【发布时间】:2011-07-18 11:33:56
【问题描述】:
malloc 有一个奇怪的问题。在用多个 malloc 分配 0x100000000,这导致访问时出现 SIGSEGV。我不知道出了什么问题。 errno 设置为 0 并且我在 ram 中有足够的空间,所以它不应该是空间问题。 malloc 返回的最后一个地址小于0x6255f0。知道要寻找什么吗?
关于我的系统的一些信息:
- gcc 版本 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
- 标志:-墙
- uname: 2.6.35-27-generic #48-Ubuntu SMP Tue Feb 22 20:25:46 UTC 2011 x86_64 GNU/Linux
PMAP 输出:
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 0 32 0 r-x-- tests
000000000060a000 0 4 4 r---- tests
000000000060b000 0 4 4 rw--- tests
000000000060c000 0 116 116 rw--- [ anon ]
00007ffff75cd000 0 348 0 r-x-- libc-2.12.1.so
00007ffff7747000 0 0 0 ----- libc-2.12.1.so
00007ffff7946000 0 16 16 r---- libc-2.12.1.so
00007ffff794a000 0 4 4 rw--- libc-2.12.1.so
00007ffff794b000 0 12 12 rw--- [ anon ]
00007ffff7950000 0 32 0 r-x-- libm-2.12.1.so
00007ffff79d2000 0 0 0 ----- libm-2.12.1.so
00007ffff7bd1000 0 4 4 r---- libm-2.12.1.so
00007ffff7bd2000 0 4 4 rw--- libm-2.12.1.so
00007ffff7bd3000 0 28 0 r-x-- liblinopt.so
00007ffff7bdb000 0 0 0 ----- liblinopt.so
00007ffff7dda000 0 4 4 r---- liblinopt.so
00007ffff7ddb000 0 4 4 rw--- liblinopt.so
00007ffff7ddc000 0 108 4 r-x-- ld-2.12.1.so
00007ffff7f6c000 0 432 432 rw--- [ anon ]
00007ffff7ff8000 0 12 12 rw--- [ anon ]
00007ffff7ffb000 0 4 0 r-x-- [ anon ]
00007ffff7ffc000 0 4 4 r---- ld-2.12.1.so
00007ffff7ffd000 0 4 4 rw--- ld-2.12.1.so
00007ffff7ffe000 0 4 4 rw--- [ anon ]
00007ffffffde000 0 16 16 rw--- [ stack ]
ffffffffff600000 0 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 9160 1196 648
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd8e67 in bound_knapsack (sizes=0x610b30, profits=0x610ad0, B=103,
limit=2) at /home/x/Development/binpacking/src/lib/knapsack.c:123
更新
运行 valgrind 揭示了问题:之前的几行代码是 calloc:
calloc( n, sizeof(unsigned int));
应该是:
calloc( n, sizeof(unsigned int*));
这导致分配的块太小,用于存储malloc的结果。
叹息
谢谢你的橡皮擦!
【问题讨论】:
-
你能发布你正在使用的代码吗? (请尽可能使用小代码 sn-p 来演示这一点。)另外,请记住“内存不足”!=“内存不足”,这意味着“地址空间不足”并且 Linux 默认会过度使用内存,所以地址空间分配可能会成功,但在页入时访问分配可能会失败(尽管如果您有大量可用内存,这不太可能成为问题)。
-
这可能是由于另一个
malloced 块中的某种内存损坏。您是否尝试过通过valgrind运行它? -
您可能在其他地方遇到了问题,当您尝试分配更多内存时就会表现出来。
-
-1 因为那个“问题”并没有给 SO 添加任何东西