Я работаю над проектом, и я пришел к точке, где на следующую трассировке стеки выскочила:.Возможно, ресурс не был выпущен? Что может быть причиной этого?
#0 0x0017c30c in _IO_flush_all_lockp() from /lib/libc.so.6
#1 0x0017d030 in _IO_cleanup() from /lib/libc.so.6
#2 0x0013e042 in exit() from /lib/libc.so.6
#3 0x00126bbe in __libc_start_main() from /lib/libc.so.6
#4 0x08049d11 in _start()
(код удален, потому что утечка памяти была решена Есть и другие, конечно, я буду. постарайтесь их отследить, прежде чем размещать их здесь. :) Исходная проблема может быть не связана с утечками памяти.)
Прежде всего, я даже смотрю в правильном направлении от начальной трассы стека? Я никогда не видел этого раньше, когда занимаюсь проблемами памяти. Есть идеи?
Редактировать: Кто-то сказал, что это связано с visual_mem_new0. Эта функция просто выделяет память. Он ничего не знает о плагине-> авторе.
Редактировать: Duh. Память прямо перед strdup заполняет память.
Редактировать: Хорошо, что избавляется от одной утечки памяти. Я не уверен, что начальная трассировка стека связана с утечкой памяти - она все еще существует, например. Он пытается выпустить некоторый ресурс, который я считаю. Часть этой программы использует много скомпилированной сборки (JIT-компилятор), которая использует память mmap'd поверх дескриптора файла для буфера. Я закрываю файл. Есть ли что-то, что мне нужно сделать с картой памяти?
Я буду продолжать пытаться очистить эти утечки памяти с пути. Я недавно что-то сделал, связанный с определенным плагином. Программа работает только при закрытии, когда я запускаю этот плагин, который использует карту памяти, о которой я говорил. Я не уверен, что это может быть. Я внес некоторые незначительные изменения. Первоначально я подозревал общий указатель, что я отслеживаю ссылки. Он использует ту же самую систему, которая используется во всем libvisual, и никаких утечек памяти, характерных для этого, не появляется. Во всяком случае, я надеюсь, что у кого-то есть некоторые подсказки. Я не могу придумать ничего другого.
Редактировать: Хорошо, отследил его с помощью истории изменений. Что случилось со следующим кодом? Могу ли я не копировать выходные данные на себя?
static inline int dump_stack(AvsCompilerContext *ctx)
{
AvsCompilerArgument *pa;
char output[2048];
snprintf(output, 2047, "\ncompiler: stackdump: Stack dump\n");
for (pa=(AvsCompilerArgument *)ctx->stack->base; pa < (AvsCompilerArgument *)ctx->stack->pointer; pa++) {
snprintf(stderr, 2047, "%scompiler: stackdump: [%2d] = ", output, (pa - (AvsCompilerArgument *)ctx->stack->base));
switch (pa->type) {
case AvsCompilerArgumentInvalid:
snprintf(output, 2047, "%sinvalid", output);
break;
case AvsCompilerArgumentConstant:
snprintf(output, 2047, "%s%.2f", output, pa->value.constant);
break;
case AvsCompilerArgumentIdentifier:
snprintf(output, 2047, "%s", pa->value.identifier);
break;
case AvsCompilerArgumentMarker: {
char *markers[] = { "invalid", "function", "argument", NULL };
snprintf(output, 2047, "%s--- %s marker ---", output, markers[pa->value.marker]);
break;
}
case AvsCompilerArgumentPrivate:
snprintf(output, 2047, "%sprivate", output);
break;
}
snprintf(output, 2047, "\n");
}
avs_debug(print(output));
return VISUAL_OK;
}
Масштаб avs_debug ничего не делает. Я прокомментировал его содержание.
Вы знаете, что было бы неплохо иметь исходный код здесь , Часть функции StackOverflow - отвечать на вопросы людей, которые приходят после вас. – Omnifarious
Этот код бесполезен для всех. Проблема заключается в трассировке стека, которая теперь полностью не связана с этим кодом. Код больше не работает для этого вопроса. – Scott
Думаю, вы должны были задать другой вопрос. – ergosys