PETSc содержит ряд средств, помогающих обнаружить проблемы распределения
памяти, включая утечки и неиспользуемое пространство:
Распределение памяти PETSc (которое собирает статистику и производит
контроль ошибок) по умолчанию реализуется для кодов, откомпилированных
в режиме отладки BOPT = g,
BOPT=g_c++, BOPT=g_complex.
Распределение памяти PETSc может быть активировано и для других случаев,
например для BOPT=O, опцией -trmalloc, в то время
как -trmalloc_off определяет использование обычного распределения
памяти для версий BOPT=g, BOPT=g_c++, и BOPT=g_complex.
При запуске временных тестов необходимо использовать версию библиотек
BOPT = O.
При использовании процедур распределения памяти PETSc опция -trdump
выводит список неосвобожденных блоков памяти после завершения программы.
Если вся память освобождается, выводится только сообщение, указывающее
максимально выделенное пространство. Однако если часть памяти остается
неосвобожденной, выводится информация об этом. Отметьте, что опция
-trdump активирует вызов PetscTrDump() во время
вызова PetscFinalize(); пользователь также может вызывать
PetscTrDump() в любом месте программы.
Удобной для процедур распределения
памяти PETSc является опция -trmalloc_log, которая активизирует
регистрацию всех вызовов malloc и сообщает об используемой
памяти, включая все массивы Фортрана. Эта опция предоставляет более
полную картину, чем -trdump, для основанных на Фортране
фиксированных массивах. Отметьте, что опция -trmalloc_log
активирует вызовы PetscTrLog (),
PetscTrLogDump(), и PetscGetResidentSetSize()
во время вызова PetscFinalize(); пользователь также может
использовать эти процедуры в любом месте программы.
Опция -trmalloc_nan полезна для отслеживания распределенной
памяти, которая используется до инициализации. Она вызывает
функцию PetscInitializeNans(), которая помечает
массив неинициализированным, в результате при использовании его значений
для вычислений, когда они еще не инициализированы, генерируется исключение
по операциям с плавающей точкой. Эта опция также вызывает
PetscInitializeLargeInts();
(см. справочные страницы для детальной информации). Отметьте, что в
настоящее время опции работают только на определенных платформах.