Запустить glibc тест на повреждение памяти вручную
Я собираюсь
*** glibc detected *** malloc(): memory corruption
ошибки типа. Это особенно трудно отлаживать в моем случае, потому что
- Среда кросс-компиляции, без valgrind
- libc собран без отладочной информации, поэтому загрузка дампов ядра в cross-gdb не даст много
- Корневая файловая система довольно хрупкая, попытка заменить glibc восстановленной копией приводит к серьезному повреждению
- Приложение, вызвавшее эти ошибки, начало работать как предоставленный поставщиком образец 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_
описание переменной среды.