honk钩子主要实现pthread_mutex_lock、pthread_mutex_unlock的劫持,具体实现如下。
int pthread_mutex_lock(pthread_mutex_t *mutex){
pthread_t selfid = pthread_self();
lock_before(selfid, (uint64)mutex);
pthread_mutex_lock_f(mutex);//执行系统加锁的入口函数
lock_after(selfid, (uint64)mutex);
}
int pthread_mutex_unlock(pthread_mutex_t * mutex){
pthread_t selfid = pthread_self();
pthread_mutex_unlock_f(mutex);//执行系统解锁的入口函数
unlock_after(selfid, (uint64)mutex);
}
static int init_hook(){
pthread_mutex_lock_f = dlsym(RTLD_NEXT,"pthread_mutex_lock");
pthread_mutex_unlock_f = dlsym(RTLD_NEXT,"pthread_mutex_unlock");
}
(6)Demo
//测试样例
pthread_mutex_t mtx1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx3 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx4 = PTHREAD_MUTEX_INITIALIZER;
void *th_func1(void *arg) {
pthread_mutex_lock(&mtx1);
sleep(1);
pthread_mutex_lock(&mtx2);
pthread_mutex_unlock(&mtx2);
pthread_mutex_unlock(&mtx1);
}
void *th_func2(void *arg) {
pthread_mutex_lock(&mtx2);
sleep(1);
pthread_mutex_lock(&mtx3);
pthread_mutex_unlock(&mtx3);
pthread_mutex_unlock(&mtx2);
}
void *th_func3(void *arg) {
pthread_mutex_lock(&mtx3);
sleep(1);
pthread_mutex_lock(&mtx1);
pthread_mutex_unlock(&mtx1);
pthread_mutex_unlock(&mtx3);
}
void *th_func4(void *arg) {
pthread_mutex_lock(&mtx2);
sleep(1);
pthread_mutex_lock(&mtx3);
pthread_mutex_unlock(&mtx3);
pthread_mutex_unlock(&mtx2);
}
int main(){
init_hook();//初始化hook
start_check();//启动检测死锁线程
pthread_t t1,t2,t3,t4;
pthread_create(&t1,NULL,th_func1,NULL);
pthread_create(&t2,NULL,th_func2,NULL);
pthread_create(&t3,NULL,th_func3,NULL);
pthread_create(&t4,NULL,th_func4,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(t4,NULL);
return 0;
}
原文地址:死锁检测实现 - MrJuJu - 博客园