# C/C++ 程序锁分析 #### [仓库](https://gitee.com/openkylin/deadlock-detect) ## 介绍 deadlock-detect 是一款基于OpenKylin社区kylin-code的拓展插件,用于C/C++程序的死锁检测及锁状态分析,帮助开发者在Linux系统下识别多线程死锁状态、互斥锁自旋锁等状态异常问题,并对程序加锁位置分析。 --- ## 功能 - C/C++ 多线程程序锁分析 - 可视化观察临界区进入次数、耗时、条件变量等待时长 - 线程退出未释放锁异常 - 可执行程序死锁检测 - 进程死锁检测 - 远程环境进程死锁检测 ## 使用方法 #### 检查依赖 依赖binutils、libc-bin、sshpass软件包 安装方式```sudo apt install binutils libc-bin sshpass -y``` 内核版本在4.19以上,支持BPF,内核选项```CONFIG_BPF_EVENTS=y``` #### C/C++ 多线程序锁分析 * 打开目标C/C++工程,点击`终端`->`配置任务` 选择`deadlockdetect: 可执行程序锁检测` task.json文件中自动添加的锁检测任务如下: ```json { "type": "deadlockdetect", "command": "被检测可执行程序", "args": [ "可执行程序参数(可选)" ], "options": { "env": { "程序执行所需额外环境变量如 DISPALY" : "1" } }, "problemMatcher": [], "label": "deadlockdetect: 可执行程序锁检测" } ``` 根据实际情况输入待检测程序,其中`args`,`options` 为空时可以删除。有多个检测任务时,可以修改不同的label字段。 * 执行锁检测任务 1. 选择`终端`->`运行任务`->`选择相应锁检测任务`; 2. 输入当前用户密码; 3. IDE终端中会显示被检测程序相关输出; 4. 当被测程序终止时,若检测到锁信息会有在相关页面展示; 5. 也可选择在终端中右键`终止终端` 或选择菜单栏中`终端`->`终止任务`,结束被测程序执行,若检测到锁信息会有在相关页面展示。 #### 进程死锁检测 打开命令面板,选择`C/C++程序死锁检测`,默认会打开一个页面,按要求添加`进程Pid`、`用户密码`即可。 #### 远程进程死锁检测 确保远程主机及用户可以`SSH`登录 本地依赖工具`sshpass` 打开命令面板,选择`C/C++程序死锁检测`,默认会打开一个页面,按要求添加`进程Pid`、`远程用户`、`远程IP地址`、`远程登录密码`即可。