Да, вы можете делать похожие вещи, используя LD_PRELOAD
; вам необходимо скомпилировать примерно следующее:
#include <dlcfn.h>
void *malloc(size_t size) {
static unsigned count = 0;
static void *(*real_malloc)(size_t) = NULL;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
if (++count == 100) {
count = 0;
return NULL;
}
return real_malloc (size);
}
как общий объект, например. с
gcc -shared -ldl -fPIC my_malloc.c -o libmy_malloc.so
После того, как вы сделали это, вы можете запустить программу следующим образом:
LD_PRELOAD=/path/to/libmy_malloc.so ./my_program
и он будет вызывать процедуру замены malloc()
.
Я предполагаю, что есть предустановленные версии выше с более сложными функциями отладки, но вы получите эту идею.
О, кстати, вышеуказанный код не проверен (написано в Переполнение стека). Также небезопасный поток и необходимо заменить потоковое безопасное, если вы замените malloc(), поэтому вы хотите использовать pthread_once()
и API-интерфейсы pthread_mutex
, чтобы исправить это.
Это интересно. Могу ли я предположить, что 'operator new' также вызовет этот malloc? – qdii
@qdii: Нет, но вы тоже можете это заменить. Это даже стандартно на C++, поэтому вам не нужен хакер LD_PRELOAD. – MSalters