首页 > 解决方案 > 检测多线程 C++ 应用程序中的阻塞调用

问题描述

在 C++ 应用程序中,我有来自同一类的2 个线程(thread1和)。thread2他们正在非常快速地运行一个循环,并且不会在循环内进行任何阻塞调用:

while (!end) {
  //dostuff, no blocking!
}
cout << "ended" << endl;

应用程序中存在一些错误,因为当我一次只运行一个线程并设置其end属性时,它可以成功退出循环。

但是,如果我同时运行两个线程,有时其中一个线程无法脱离循环(尽管end设置了它的属性)。

循环本身很大(几百行),我可以在其中放置一个(条件)断点,但是当我单步执行时,我失去了功能(因为线程应该运行得很快),所以即使我找到了哪一行块,这可能是错误的方式。

所以,我的问题是:gdb 中是否有任何选项可以让断点表现得像看门狗?即:如果在一定时间内它不会被击中,它应该会破坏线程,所以我可以检查哪一行导致了麻烦。

标签: c++multithreadingdebugginggdb

解决方案


即:如果在一定时间内它不会被击中,它应该会破坏线程,所以我可以检查哪一行导致了麻烦。

您不需要此功能来检查哪条线路导致问题(并且该功能不存在)。

等待“不退出”情况发生,然后按 Control-C。GDB 将停止该进程的所有线程,并给出(gdb)提示。此时,发出thread apply all where命令,您将看到“未退出”线程卡住的位置。


推荐阅读