我有一个奇怪的问题malloc
。在使用多个 malloc 分配 <10mb 后,malloc 突然返回地址0x100000000
,这会在访问时导致 SIGSEGV。我不知道出了什么问题。设置errno
为0
并且我的内存有足够的空间,所以这不应该是空间问题。malloc 返回的最后地址小于0x6255f0
。知道要寻找什么吗?
有关我的系统的一些信息:
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
Run Code Online (Sandbox Code Playgroud)
运行 valgrind 揭示了问题:它是之前几行的 calloc:
calloc( n, sizeof(unsigned int));
本来应该是:
calloc( n, sizeof(unsigned int*));
这导致分配的块太小,该块用于存储 malloc 的结果。
叹
谢谢你的橡皮鸭!
尝试将以下行添加到您的程序中:
#define MALLOC_CHECK_ 3
Run Code Online (Sandbox Code Playgroud)
malloc
这应该会导致使用不同的版本,该版本可以检测某些错误并将其报告给您。有关更多详细信息,请参阅malloc 手册页的“注释”部分。