Я пишу программу на C. У меня есть две основные машины для разработки, обе Mac. Один работает под управлением OS X 10.5 и является 32-битной машиной, другой работает под управлением OS X 10.6 и имеет 64-разрядную версию. Программа отлично работает при компиляции и запуске на 64-битной машине. Однако, когда я собираю ту же самую программу на 32-битной машине, она некоторое время запускается, а затем вылетает где-то внутри malloc
. Вот обратный след:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xeeb40fe0
0x9036d598 in small_malloc_from_free_list ()
(gdb) bt
#0 0x9036d598 in small_malloc_from_free_list ()
#1 0x90365286 in szone_malloc ()
#2 0x903650b8 in malloc_zone_malloc ()
#3 0x9036504c in malloc ()
#4 0x0000b14c in xmalloc (s=2048) at Common.h:185
...
xmalloc
- это моя пользовательская оболочка, которая просто вызывает exit
, если malloc
возвращает NULL
, так что памяти не хватает.
Если я свяжу тот же код с -ltcmalloc
, он будет работать нормально, поэтому я сильно подозреваю, что это ошибка где-то внутри стандартного распределителя OS X 10.5. Возможно, моя программа где-то вызывает повреждение памяти и что tcmalloc
каким-то образом не срабатывает. Я попытался воспроизвести ошибку, выполнив ту же последовательность malloc
s и free
s в другой программе, но это сработало нормально.
Итак, мои вопросы:
Кто-нибудь видел эту ошибку раньше? Или, альтернативно
Как мне отладить что-то подобное? Например, есть ли отладочная версия OS X malloc
?
Кстати, это связанные библиотеки:
$ otool -L ./interp
./interp:
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.5)
Обновление : Да, это повреждение кучи из-за записи за конец массива, теперь оно работает. Я должен был запустить valgrind
, прежде чем отправлять вопрос. Тем не менее я был заинтересован в методах (кроме valgrind), как защитить себя от такого рода коррупции, так что спасибо за это.