воскресенье, 3 мая 2009 г.

"Магические" числа в отладке проблем с памятью

Когда в процессе отладки появляется сообщение "Unhandled exception at 0x00416d9f in sailor.exe: 0xC0000005: Access violation reading location 0xfeeefeee." разработчики, бывают, начинают нервничать.
Между тем, шестнадцатеричные коды, как минимум, в Debug-версии приложения, собранном MSVC, уже могут кое о чем рассказать...


Например, после чтения документации совершенно очевидно, что:
  • программа попыталась использовать память, которая была освобождена через malloc или delete

  • выполняется Debug-версия программы (в Release-версии memory poisoning по соображениям производительности не выполняется)


Вот некоторые "магические числа", которые встречаются мне наиболее часто:









Число Пояснение
0xABABABABUsed by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
0xBAADF00DUsed by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
0xCCCCCCCCUsed by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
0xCDCDCDCDUsed by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
0xFDFDFDFDUsed by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
0xFEEEFEEEUsed by Microsoft's HeapFree() to mark freed heap memory


Дополнительную информацию можно почерпнуть в MSDN, или, например,
здесь.

Комментариев нет: