Запустить glibc тест на повреждение памяти вручную

Я собираюсь

*** glibc detected *** malloc(): memory corruption

ошибки типа. Это особенно трудно отлаживать в моем случае, потому что

  1. Среда кросс-компиляции, без valgrind
  2. libc собран без отладочной информации, поэтому загрузка дампов ядра в cross-gdb не даст много
  3. Корневая файловая система довольно хрупкая, попытка заменить glibc восстановленной копией приводит к серьезному повреждению
  4. Приложение, вызвавшее эти ошибки, начало работать как предоставленный поставщиком образец C с malloc/free повсюду. Я добавил свой собственный код, который использует умные указатели C++ для своего собственного размещения, но все еще есть много устаревших немых указателей.

Ошибки также возникают, когда я использую #if удалить код, который я добавил, хотя отчеты приходят в другом месте (рано, если мой код отсутствует, при выходе из приложения, если мой код присутствует). Это не особенно необычно; Проблемы компоновки кучи общеизвестно чувствительны к компоновке памяти.

Я считаю вероятным, что исходный пример кода где-то был "доброкачественным" переполнением, что мешает чему-то важному после того, как я внес изменения. Также возможно, что часть кода, который я удалил из примера, инициализировала указатель, который все еще где-то используется. Или ничего важного не перезаписывается, но включается отладочная информация с -g заставляет сообщать о большем количестве проблем.

Что еще хуже, пример является многопоточным и вызывает сложные библиотеки поставщиков также сомнительного качества.

Я хотел бы локализовать повреждение памяти. Есть ли способ вызвать проверку согласованности метаданных кучи glibc вручную, вместо ожидания следующего вызова malloc()?


FWIW ошибка не была в коде, который я написал, и я верю в публичный позор (и некоторые бедняги, работающие над тем же, могут сэкономить день, найдя это), так что здесь идет. От ilclient_utils.c по крайней мере в одном из образцов Texas Instruments OpenMAX:

  pAppDataPtr->capILComp->outPortParams =
    malloc (sizeof (IL_CLIENT_OUTPORT_PARAMS) *
            pAppDataPtr->capILComp->numOutport);

  memset (pAppDataPtr->capILComp->outPortParams, 0x0,
          sizeof (IL_CLIENT_OUTPORT_PARAMS) *
          pAppDataPtr->capILComp->numOutport);

  pAppDataPtr->deiILComp->inPortParams =
    malloc (sizeof (IL_CLIENT_INPORT_PARAMS) *
            pAppDataPtr->deiILComp->numInport);

  memset (pAppDataPtr->deiILComp->inPortParams, 0x0,
          sizeof (IL_CLIENT_INPORT_PARAMS));

  pAppDataPtr->deiILComp->outPortParams =
    malloc (sizeof (IL_CLIENT_INPORT_PARAMS) *
            pAppDataPtr->deiILComp->numOutport);
  memset (pAppDataPtr->deiILComp->outPortParams, 0x0,
          pAppDataPtr->deiILComp->numOutport *
          sizeof (IL_CLIENT_OUTPORT_PARAMS));

  pAppDataPtr->encILComp->inPortParams =
    malloc (sizeof (IL_CLIENT_INPORT_PARAMS) *
            pAppDataPtr->encILComp->numInport);
  memset (pAppDataPtr->encILComp->inPortParams, 0x0,
          sizeof (IL_CLIENT_INPORT_PARAMS));

  pAppDataPtr->encILComp->outPortParams =
    malloc (sizeof (IL_CLIENT_INPORT_PARAMS) *
            pAppDataPtr->encILComp->numOutport);
  memset (pAppDataPtr->encILComp->outPortParams, 0x0,
          sizeof (IL_CLIENT_OUTPORT_PARAMS));

  pAppDataPtr->disILComp->inPortParams =
    malloc (sizeof (IL_CLIENT_INPORT_PARAMS) *
            pAppDataPtr->disILComp->numInport);
  memset (pAppDataPtr->disILComp->inPortParams, 0x0,
          sizeof (IL_CLIENT_INPORT_PARAMS));

Обратите внимание, что два из указанных выше распределений памяти используют sizeof (IL_CLIENT_INPORT_PARAMS) но должен был использовать sizeof (IL_CLIENT_OUTPORT_PARAMS), Да здравствует C++ и безопасны new []!


К этому коду прикреплено обязательное уведомление:

/*
 *  Copyright (c) 2010-2011, Texas Instruments Incorporated
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  *  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *  *  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *  *  Neither the name of Texas Instruments Incorporated nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *  Contact information for paper mail:
 *  Texas Instruments
 *  Post Office Box 655303
 *  Dallas, Texas 75265
 *  Contact information:
 *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
 *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
 *  ============================================================================
 *
 */

2 ответа

Решение

Похоже, один из способов

#include <mcheck.h>

mcheck_check_all();

Документация не очень подробная, но кажется, что это mcheck.h это встроенная проверка glibc, которая уже выполняется во время распределения.

включение отладочной информации с помощью -g приводит к появлению большего числа проблем.

Это не то, как работает обнаружение повреждения кучи glibc.

Есть ли способ вызвать проверку согласованности метаданных кучи glibc вручную

Да: http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html Смотрите также MALLOC_CHECK_ описание переменной среды.

Другие вопросы по тегам