建立乙個標頭檔案,通過巨集替換的方式替換掉記憶體分配(malloc,calloc,realloc)和釋放函式(free)。
建立乙個原始檔,定義替換函式,在替換函式中記錄呼叫和呼叫真正的目標函式和做相應處理。
* 標頭檔案 memhook.h
#if defined(__cplusplus)
extern "c"
#endif
* 原始碼
#include #include //不能引入 memhook.h
void *mmalloc (unsigned long counts, const char* const file , const unsigned long line)
//記錄記憶體分配
....
return buf;
}.....
void mfree (void *p)
}
需要手動引入該標頭檔案,如果有原始碼未引入該標頭檔案,會導致操作未記錄。
實現乙個動態庫,通過ld_preload環境變數,在所有動態庫前載入。
動態庫中定義標準的記憶體分配和釋放函式,例如:malloc,calloc,free等;由於先載入,變數設定後執行的程式中呼叫的這些函式都會被指向該庫中的實現。
在該庫中記錄分配和釋放記錄,以及呼叫真正的malloc,calloc,free等函式。
* 庫原始碼
#define _gnu_source
#include #include #include static void *(*true_malloc)(size_t);
static void (*true_free)(void *ptr);
void *malloc(size_t size)
printf(%d\n", size);
ptr = true_malloc(size);
//記錄分配操作
....
return ptr;
}.....
void free(void* ptr)
//記錄釋放操作
....
printf("%p\n", ptr);
return true_free(ptr);
}* 注意:
1. 函式定義需要和標準的一樣。
2. 生成動態庫時需要鏈結 dl庫。
* 編譯生成動態庫
* 設定環境變數
export ld_preload=./lib***x.so
* 執行其它程式
替換方式簡單,環境變數設定和取消非常方便。 Linux平台下解除安裝ORACLE
實驗環境 作業系統版本 red hat enterprise linux server release 5.5 tikanga 資料庫版本 oracle database 10g enterprise edition release 10.2.0.1.0。解除安裝oracle 10g的過程,在不同平...
Linux平台下安裝MySQL
2.解壓 tar xvf mysql 6.6.13 1.rhel5.i386.tar 3.切換root使用者 su 4.安裝server 5.5 rpm ivh mysql server 5.5.13 1.rhel5.i386.rpm 5.更改密碼 usr bin mysqladmin u root...
Linux 平台下 PHP 安裝 啟動
php安裝 tar xzvf php 5.2.5.tar.gz cd php 5.2.5 configure prefix home redadmin php with apxs2 home redadmin apache bin apxs with mysql home redadmin mysq...