有时候为了排查malloc内存分配相关的问题,需要对malloc的分配逻辑进行打印埋点,用于分析分配出来的内存是不是被正常释放掉,以及特定的大块内存分配的堆栈来源。基于这个问题,有了本文的一些尝试。 先看代码。
1 | //malloc_mock.c |
上述的代码中,有几个细节点,做一下记录
__attribute__((constructor))
和__attribute__((destructor))
在编译动态库的时候,gcc会自动编译成加载动态库会执行的函数,以及卸载动态库会执行的函数。 函数本身不会要求一定是static的。dlsym
函数可以从动态库中获取指定函数的引用,同时使用RTLD_NEXT
,可以从下一个加载的动态库中查找,而不会直接加载当前的动态库造成冲突backtrace
配合backtrace_symbols
可以获取当前线程的堆栈信息。 具体的详细内容可以参考 man backtracegdb
调试的时候,可以通过set environment LD_PRELOAD=./malloc_mock 进行调试。
1 | //malloc.c |
- malloc 返回的是一个void** 指针类型,其可以正常转换为其他类型,但在做内存touch的时候,需要留意指针类型的长度
1 |
|
参考:
- https://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work
- https://stackoverflow.com/questions/10448254/how-to-use-gdb-with-ld-preload
- https://stackoverflow.com/questions/6083337/overriding-malloc-using-the-ld-preload-mechanism
- https://stackoverflow.com/questions/105659/how-can-one-grab-a-stack-trace-in-c
- https://stackoverflow.com/questions/11043313/im-getting-invalid-initializer-what-am-i-doing-wrong