Skip to content

Instantly share code, notes, and snippets.

@maliubiao
Last active March 22, 2021 10:39
Show Gist options
  • Save maliubiao/50f13960e6bddd069bbd to your computer and use it in GitHub Desktop.
Save maliubiao/50f13960e6bddd069bbd to your computer and use it in GitHub Desktop.
libc malloc, free trace

目标 

现成的工具,比如valgrind不是哪里都兼容,不如直接hook malloc这个符号,systemtap这种更好一些,但是生产环境又不好装

build

gcc mtrace.c -o libmtrace.so -fPIC -shared

use

LD_PRELOAD=./libmtrace.so ./test

sample

mtracemalloc: 0x291a980 64
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_Znwm+0x18) [0x7fa489401188]
/usr/local/lib/librocksdb.so.4.3(_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE19_M_emplace_back_auxIJRKS5_EEEvDpOT_+0x58) [0x7fa48a89f568]
/usr/local/lib/librocksdb.so.4.3(_ZN7rocksdb6DBImpl18PurgeObsoleteFilesERKNS_10JobContextE+0x1a9f) [0x7fa48a88ebaf]
/usr/local/lib/librocksdb.so.4.3(_ZN7rocksdb6DBImpl19DeleteObsoleteFilesEv+0x82) [0x7fa48a88f062]
/usr/local/lib/librocksdb.so.4.3(_ZN7rocksdb2DB4OpenERKNS_9DBOptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorINS_22ColumnFamilyDescriptorESaISD_EEPSC_IPNS_18ColumnFamilyHandleESaISJ_EEPPS0_+0x10ca) [0x7fa48a895fba]
/usr/local/lib/librocksdb.so.4.3(_ZN7rocksdb2DB4OpenERKNS_7OptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPPS0_+0x1a5) [0x7fa48a896475]
/usr/local/lib/librocksdb.so.4.3(rocksdb_open+0x46) [0x7fa48a840886]
#include <mcheck.h>
#include <malloc.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <execinfo.h>
static void *mtrace_malloc_hook (size_t, const void *);
static void mtrace_free_hook (void*, const void *);
void __mtracer_on () __attribute__((constructor));
void __mtracer_on ()
{
__malloc_hook = mtrace_malloc_hook;
__free_hook = mtrace_free_hook;
}
void mtrace_backtrace() {
void *array[1024];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 1024);
strings = backtrace_symbols (array, size);
for (i = 2; i < size; i++) {
fprintf (stderr, "%s\n", strings[i]);
}
free (strings);
}
static void *mtrace_malloc_hook (size_t size, const void *caller)
{
void *result = NULL;
__malloc_hook = NULL;
__free_hook = NULL;
result = malloc(size);
fprintf(stderr, "mtracemalloc: %p %ld\n", result, size);
mtrace_backtrace();
fprintf(stderr, "\n");
__malloc_hook = mtrace_malloc_hook;
__free_hook = mtrace_free_hook;
return result;
}
static void mtrace_free_hook (void *ptr, const void *caller)
{
__malloc_hook = NULL;
__free_hook = NULL;
free(ptr);
fprintf(stderr, "mtracefree: %p\n", ptr);
mtrace_backtrace();
fprintf(stderr, "\n");
__malloc_hook = mtrace_malloc_hook;
__free_hook = mtrace_free_hook;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment