k = kh_put(symbol, SYMBOLHASH, (uint32_t)ptr, &rethash);
if (likely(rethash != 0)) // succeed to add in hash table
{
- char* tlast = (char*)malloc(strlen);
+ char* tlast = (char*)real_malloc(strlen);
if (likely(tlast != NULL))
{
memcpy(tlast, str, strlen);
{
if (kh_value(UIOBJECTHASH, k)->name == NULL)
{
- char* tlast = (char*)malloc(str_len);
+ char* tlast = (char*)real_malloc(str_len);
if (likely(tlast != NULL))
{
memcpy(tlast, classname, str_len);
{
kh_value(UIOBJECTHASH, k) = newentry;
- tlast = (char*)malloc(str_len);
+ tlast = (char*)real_malloc(str_len);
if (likely(tlast != NULL))
{
memcpy(tlast, type, str_len);
elm = find_element(key);
if (elm == NULL)
{
- elm = (element_t*)malloc(sizeof(element_t));
+ elm = (element_t*)real_malloc(sizeof(element_t));
if (likely(elm != NULL))
{
elm->keylen = strlen(key);
- elm->keystr = (char*)malloc(elm->keylen + 1);
+ elm->keystr = (char*)real_malloc(elm->keylen + 1);
if (likely(elm->keystr != NULL))
{
strcpy(elm->keystr, key);
int getExecutableMappingAddress();
bool printLog(log_t* log, int msgType);
+
+void *(*real_malloc)(size_t) = NULL;
+
/******************************************************************************
* internal functions
(this means that these functions do not need to set enter/exit flag)
void _init_(void)
{
char msg[DA_LOG_MAX];
+
+ rtdl_next_set_once(real_malloc, "malloc");
+
probeBlockStart();
init_exec_fork();
return 0;
}
+
+/* rtdl_next */
+void *rtdl_next(const char *symname)
+{
+ void *symbol;
+
+ probeBlockStart();
+
+ symbol = dlsym(RTLD_NEXT, symname);
+ if (symbol == NULL || dlerror() != NULL) {
+ fprintf(stderr, "dlsym failed <%s>\n", symname);
+ exit(41);
+ }
+
+ probeBlockEnd();
+
+ return symbol;
+}
/* TODO maloc/free for each event turns out expensive: think of buffer
* allocator implementation */
#define PREPARE_LOCAL_BUF() \
- char *LOCAL_BUF = (char *)malloc(MAX_LOCAL_BUF_SIZE); \
+ char *LOCAL_BUF = (char *)(*real_malloc)(MAX_LOCAL_BUF_SIZE); \
char *BUF_PTR = LOCAL_BUF; \
char *RET_PTR = NULL
char** da_backtrace_symbols (void* const* array, int size);
char** cached_backtrace_symbols (void* const* array, int size);
+/* real malloc function pointer */
+extern void *(*real_malloc)(size_t);
+
/* pid/tid values */
pid_t _getpid();
pid_t _gettid();
int __appendTypeLog(log_t* log, int nInput, char* token, ...);
int getBacktraceString(log_t* log, int bufsize);
+void *rtdl_next(const char *symname);
+
//char* captureScreenShotX(int* width, int* height);
//void releaseScreenShotX();
* helper macros
***************************************************************************/
+// ============================ rtdl ===============================
+
+#define rtdl_next_set_once(symbol, sname) \
+ do { \
+ if (symbol == NULL) \
+ symbol = rtdl_next(sname); \
+ } while (0)
+
+#define rtdl_next_current_set_once(symbol) \
+ rtdl_next_set_once(symbol, __func__)
+
// ========================= print log =====================================
#define PRINTMSG(...) print_log_fmt(MSG_MSG, __FUNCTION__, __LINE__, __VA_ARGS__)
#define PRINTWRN(...) print_log_fmt(MSG_WARNING, __FUNCTION__, __LINE__, __VA_ARGS__)
static enum DaOptions _sopt = OPT_ALLOC;
-static void *rtdl_next(const char *symname)
-{
- void *symbol;
-
- probeBlockStart();
-
- symbol = dlsym(RTLD_NEXT, symname);
- if (symbol == NULL || dlerror() != NULL) {
- fprintf(stderr, "dlsym failed <%s>\n", symname);
- exit(41);
- }
-
- probeBlockEnd();
-
- return symbol;
-}
-
-static void rtdl_next_set_once(void **symbol, const char *symname)
-{
- if (*symbol)
- return;
- *symbol = rtdl_next(symname);
-}
-#define rtdl_next_current_set_once(symbol) \
- rtdl_next_set_once((void **)(symbol), __func__)
-
void *malloc(size_t size)
{
static void* (*mallocp)(size_t);
DECLARE_VARIABLE_STANDARD;
void *pret;
- rtdl_next_current_set_once(&mallocp);
+ rtdl_next_current_set_once(mallocp);
PRE_PROBEBLOCK();
static void (*freep)(void *);
DECLARE_VARIABLE_STANDARD;
- rtdl_next_current_set_once(&freep);
+ rtdl_next_current_set_once(freep);
PRE_PROBEBLOCK();
DECLARE_VARIABLE_STANDARD;
void *pret;
- rtdl_next_current_set_once(&reallocp);
+ rtdl_next_current_set_once(reallocp);
PRE_PROBEBLOCK();
if(memblock != NULL && gProbeBlockCount == 0)