在某些情况下, 不得已无法修改代码,但有需要对系统调用进行相应监控,获取相关信息进行调试的时候,可以对系统的API进行 hook hack, 监控整个系统的调用情况, 下面用 文件 fd 的监控为例, 顺便说一句,fd在libc中,是尽量重用旧的策略的,推断系统为了优化和效率, 这样更容易出现错误关闭fd的情况
typedef int(*CLOSE)(int);
static void *handle = NULL;
static CLOSE sys_close = NULL;
AGORA_API int AGORA_CALL close(int fd)
{
if( !handle )
{
handle = dlopen("libc.so", RTLD_LAZY);
sys_close = (CLOSE)dlsym(handle, "close");
}
if(sys_close!=NULL) {
//printf("!!! hack function invoked. %d\n",fd);
__android_log_print(ANDROID_LOG_ERROR,"HOOK","!!! hack function invoked. %d \n",fd);
int ret = sys_close(fd);
if(ret == -1) {
__android_log_print(ANDROID_LOG_ERROR,"HOOK","!!! hack function invoked. %d , errno %d\n",fd ,errno);
abort();
}
return ret;
} else {
__android_log_print(ANDROID_LOG_ERROR,"HOOK","!!! hack function not found. %d \n",fd);
return -99;
}
}