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 - 博客园
