【发布时间】:2011-01-09 09:41:47
【问题描述】:
我正在做一个项目,结果出现了以下堆栈跟踪:
#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。该函数只是分配内存。它对插件->作者一无所知。
编辑:呃。在 strdup 填充内存之前的 memcopy。
编辑:好的,这消除了一个内存泄漏。我不相信最初的堆栈跟踪是关于内存泄漏的——例如它仍然存在。它试图释放一些我相信的资源。该程序的一部分使用了大量已编译的程序集(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 的部分功能是回答后人的问题。
-
该代码对任何人都没用。问题在于堆栈跟踪,它现在与该代码完全无关。该代码不再适用于该问题。
-
我认为你应该开始另一个问题。
-
当前问题不可读。我希望您不要期望没有关注此问题更改的任何人提供任何帮助。
-
有什么要知道的?有内存泄漏,解决了。我没有删除任何文字。我刚刚删除了 sn-ps 代码,如果你真的被它所困扰,你可以随时在修订历史中查看。
标签: c linux debugging memory-leaks