可以知道带有 + 的表示 malloc 了内存,而 - 表示释放,后面的 0x4 是分配的内存大小
可见正常情况 + - 数目应该一样多,现在不一样表明出现了 leakage。接着我们看看前面的
地址样的东西是啥,objdump 之得
08048424 <main>:
...
8048441: e8 d2 fe ff ff call 8048318
8048446: 89 45 f4 mov %eax,0xfffffff4(%ebp)
8048449: c7 04 24 04 00 00 00 movl {fckeditor}x4,(%esp)
8048450: e8 c3 fe ff ff call 8048318 <malloc@plt>;
8048455: 89 45 f8 mov %eax,0xfffffff8(%ebp)
8048458: 8b 45 f8 mov 0xfffffff8(%ebp),%eax
804845b: 89 44 24 08 mov %eax,0x8(%esp)
804845f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax
8048462: 89 44 24 04 mov %eax,0x4(%esp)
8048466: c7 04 24 54 85 04 08 movl {fckeditor}x8048554,(%esp)
804846d: e8 c6 fe ff ff call 8048338 <printf@plt>
8048472: 8b 45 f4 mov 0xfffffff4(%ebp),%eax
8048475: c7 00 01 00 00 00 movl {fckeditor}x1,(%eax)
可见是调用函数开始地方的地址。下面使用 mtrace 命令行工具进行分析,其基本调用方式为
mtrace binary tracefile。当使用 gcc -DDEBUGGING -g 编译才能获得最好的效果,会报告出
哪一行上的没有被释放掉。
10. obstack 是什么?
可以看做任意“对象”的 stack,用户可以建立多个 obstack,其使用类似于一个 stack
相关的定义在 obstack.h 中。使用一个 obstack 是通过一个结构 struct obstack 实现的。
obstack 中的东西放在 chunk 中,chunk 使用用户自定义的函数(其实是个 macro )分配
后来的东西是用一些接口函数放到 obstack 中,真是标准的 C 实现啊... 比较特别的是一种可以
grow 的对象的放入。建立一个 obstack 只需要弄一个结构,然后用
static struct obstack myobstack;
obstack_init (&myobstack);
当然,malloc 一个也行的。不过首先应该告诉编译器用什么分配 chunk -.-
#define obstack_chunk_alloc malloc
#define obstack_chunk_free free
分配的 chunk 大小是用下面的 macro 决定的
int obstack_chunk_size (struct obstack *obstack-ptr)
调用方式如下:
obstack_chunk_size (obstack_ptr) = new-chunk-size;
如果 trunk 分配失败,则会调用 obstack_alloc_failed_handler 对应的函数指针。
下面看看如何将一些东西放进去。最直接的就是通过分配一块地方
void * obstack_alloc (struct obstack *obstack-ptr, int size)
然后手动 memcpy 好了... 这样麻烦,因此有个
void * obstack_copy (struct obstack *obstack-ptr, void *address, int size)
减少工作量,对于字符串呢还有更简单的
void * obstack_copy0 (struct obstack *obstack-ptr, void *address, int size)
这样最后的 0x0 会自动被添加。如果想释放,可以调用
void obstack_free (struct obstack *obstack-ptr, void *object)
这时 obstack 中在此 object 之后添加的都会被释放掉(这才是 stack 嘛~)注意,如果 object == NULL,此时
就不仅仅释放了所有的 obstack 中的东西,obstack 自己也被恢复到未经初始化的状态了。
下面看看如何添加可以 grow 的对象,最基本的
void obstack_blank (struct obstack *obstack-ptr, int size)
![nixsky[www.nixsky.com]](/templets/images/toplogo.gif)

