Как принудительно прервать & ldquo; обнаруженный glibc *** free (): неверный указатель & rdquo;

Если вы получаете эту ошибку для видео YouTube, вместо того, чтобы использовать полный URL-адрес, используйте URL-адрес встраивания из параметров совместного доступа. Он будет выглядеть как http://www.youtube.com/embed/eCfDxZxTBW4

Вы также можете заменить watch?v= на embed/, поэтому http://www.youtube.com/watch?v=eCfDxZxTBW4 станет http://www.youtube.com/embed/eCfDxZxTBW4

16
задан Kevin Panko 25 May 2011 в 15:56
поделиться

4 ответа

Я верю, если Вы, которых setenv MALLOC_CHECK_ к 2, glibc позвонит abort(), когда он обнаружит "свободный (): недопустимый указатель" ошибка. Отметьте запаздывающее подчеркивание от имени переменной среды.

, Если MALLOC_CHECK_ 1 glibc, распечатает "свободный (): недопустимый указатель" (и подобный printfs для других ошибок). Если MALLOC_CHECK_ будет 0, то glibc тихо проигнорирует такие ошибки и просто возвратится. Если MALLOC_CHECK_ будут 3 glibc, то будет печатать сообщение и затем звонить abort(). Т.е. это - битовая маска.

можно также звонить mallopt(M_CHECK_ACTION, arg) с аргументом 0-3 и получить тот же результат как с MALLOC_CHECK_.

, Так как Вы видите "свободный (): недопустимый указатель" сообщение, я думаю, что необходимо уже быть установкой MALLOC_CHECK_ или вызовом mallopt(). По умолчанию glibc не печатает те сообщения.

Что касается того, как отладить, это, устанавливая обработчик для [1 110] является, вероятно, лучший способ продолжиться. Можно установить точку останова в обработчике или сознательно инициировать дамп ядра.

16
ответ дан nneonneo 25 May 2011 в 15:56
поделиться

Я рекомендую получить valgrind:

valgrind - tool=memcheck - leak-check=full./a.out

7
ответ дан dicroce 25 May 2011 в 15:56
поделиться

В целом похоже, что Вам, возможно, придется перекомпилировать glibc, тьфу.

Вы не говорите, на какой среде Вы работаете, но если можно перекомпилировать код для OS X, тогда его версия libc имеет свободное (), который слушает эту переменную среды:

MallocErrorAbort             If set, causes abort(3) to be called if an
                              error was encountered in malloc(3) or
                              free(3) , such as a calling free(3) on a
                              pointer previously freed.

страница справочника бесплатно () на OS X имеет больше информации.

, Если Вы находитесь на Linux, затем попробуйте Valgrind, он может найти некоторые невозможные к поиску ошибки.

3
ответ дан Adrian 25 May 2011 в 15:56
поделиться

, Как установить точку останова в gdb?

(gdb) b filename:linenumber//, например, b основное cpp:100

там способ вызвать аварийное прекращение работы? Я вспоминаю там быть огибающим var управлять этим?

у меня создалось впечатление, что это прервалось по умолчанию. Удостоверьтесь, что Вам установили отладочную версию.

Или использование libdmalloc5: "Понижение замены для системы malloc', перевыделение', calloc', свободные' и другие стандартные программы управления памятью при обеспечении мощных средств отладки, настраивающихся во времени выполнения. Эти средства включают такие вещи как отслеживание утечки памяти, обнаружение записи столба забора, создание отчетов файла/номера строки и общее журналирование статистики".

Добавляют, что это к Вашей команде

-L/usr/lib/debug/lib -ldmallocth

ссылки gdb должно автоматически возвратить управление, когда glibc инициировал аварийное прекращение работы.

Или можно настроить обработчик сигналов для SIGABRT для дампа stacktrace к fd (дескриптор файла). Ниже, mp_logfile является ФАЙЛ*

void *array[512 / sizeof(void *)]; // 100 is just an arbitrary number of backtraces, increase if you want.
size_t size;

size = backtrace (array, 512 / sizeof(void *));
backtrace_symbols_fd (array, size, fileno(mp_logfile));
3
ответ дан mat_geek 25 May 2011 в 15:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: