目录

💡 一、为什么“程序卡住但 CPU 很低”?

🧰 二、用调试工具去“看看线程在干嘛”

🔹 在 Linux 或 macOS 上

🔍 看输出结果(重点!)

🔹 在 Windows 上

🧠 总结一口气讲清楚:


💡 一、为什么“程序卡住但 CPU 很低”?

👉 因为线程在等锁
锁没释放,它就一直卡着,不做事,也不占 CPU。

比喻:

你在排队领饭,一直站着不动(等别人),你不干活(CPU 不忙),
但你也没走(程序没崩),这就是“死锁”状态。

所以如果程序:

  • 不崩溃、不报错、也不继续运行

  • CPU 占用几乎 0%

那通常就是线程互相卡住了


🧰 二、用调试工具去“看看线程在干嘛”

死锁最准确的判断方法:
👉 看“每个线程卡在哪里”。


🔹 在 Linux 或 macOS 上

1️⃣ 找到程序的进程号(PID):

ps aux | grep 程序名

2️⃣ 把调试器 gdb 附到这个进程:

gdb -p <PID>

3️⃣ 输入命令:

(gdb) thread apply all bt

意思是:

“把所有线程(thread)都列出来,显示它们的调用栈(backtrace)。”


🔍 看输出结果(重点!)

如果你看到很多线程停在类似这样的地方:

pthread_mutex_lock
futex_wait

这些都是“等待锁”的系统函数。

🧠 翻译成人话就是:

“这些线程正在等别人释放锁”
如果多个线程都互相卡在这些函数 → 就是死锁。


🔹 在 Windows 上

1️⃣ 用 Visual Studio 打开正在运行的程序(Debug 模式)
2️⃣ 点击菜单栏:

调试 → 窗口 → 并行堆栈(Parallel Stacks)

3️⃣ 你会看到每个线程的调用栈图:

  • 哪个线程在执行哪行代码

  • 哪个线程卡在等待锁

如果看到两个线程互相等待 → 就是死锁。


🧠 总结一口气讲清楚:

你看到的现象说明
程序卡住但 CPU 很低线程都在等锁(没崩溃、没运行)
GDB/VS 看到很多线程卡在 pthread_mutex_lockfutex_wait它们都在等别人释放锁
多个线程互相等待✅ 确认是死锁

更多推荐