基本思路:在加锁时,通过有向图来对锁进行记录,判断图结构是否形成了闭环,形成闭环则出现死锁。
实现方法HOOK
以linux环境为例子,使用有向图存储信息,通过hook加锁解锁的函数如pthread_mutex_lock()、pthread_mutex_unlock(),在加锁后记录锁和线程的信息,在解锁后移除锁和线程的信息。
实现步骤:
通过dlsym()函数将当前程序的pthread_mutex_lock、pthread_mutex_unlock保存进变量中。
再实现的pthread_mutex_lock、pthread_mutex_unlock函数,在通过变量中保存的函数调来进行加锁解锁。
示例代码
typedef int (*pthread_mutex_lock_t)(pthread_mutex_t *mutex);
pthread_mutex_lock_t pthread_mutex_lock_f = NULL;
typedef int (*pthread_mutex_unlock_t)(pthread_mutex_t *mutex);
pthread_mutex_unlock_t pthread_mutex_unlock_f = NULL;
int pthread_mutex_lock(pthread_mutex_t *mutex) {
pthread_t selfid = pthread_self();
//向有向图添加元素
pthread_mutex_lock_f(mutex);
}
int pthread_mutex_unlock(pthread_mutex_t *mutex) {
pthread_mutex_unlock_f(mutex);
pthread_t selfid = pthread_self();
//从有向图移除元素
}
文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂