多线程程序卡死这个问题就是代码幽灵 ,特别是多线程情况下,排查起来巨恶心,下面是关于特例我的一点小思路,不至于束手无措
我借助工具是valgrind,能够用来检查内存泄漏、死锁和其他线程问题
sudo apt-get install valgrind
gcc编译程序用 -g 选项来编译程序,以便在可执行文件中包含调试信息
gcc -g -o my_program my_program.c -std=gnu99 -Wall -Wextra -lpthread
运行程序发现程序卡住
valgrind --leak-check=full ./my_program
可以看到程序运行时候每个函数堆栈分配了多少个,还存在多少个内存块没有释放
valgrind --tool=helgrind ./simulator8
这个可以看到每个线程运行完了之后,有多少个锁还没有释放
发现程序退出了有锁没有被释放,去找对应的线程函数thread #6
通过thread #6找到了是324行创建的线程函数里面锁的释放有问题。
至此排查完毕