Обнаружить блокирующий вызов в многопоточном приложении C ++ - PullRequest
1 голос
/ 18 апреля 2020

В приложении C ++ у меня есть 2 потока (thread1 и thread2) из одного класса. Они работают очень быстро, и ничто не должно вызывать никаких блокирующих вызовов внутри l oop:

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

В приложении есть какая-то ошибка, потому что когда я запускаю только один поток за раз и я установил его свойство end, оно может успешно завершить работу с l oop.

Однако, если я запускаю оба потока, иногда один из потоков не может выйти из l oop (несмотря на то, что у него установлено end свойство).

Сам l oop довольно большой (несколько сотен строк), я могу поставить в него (условную) точку останова, но когда я Шагаю, я теряю функциональность (так как поток должен работать быстро), поэтому, даже если я обнаружу, какие блоки строк, это может быть неправильный путь.

Итак, мой вопрос: есть ли опция в GDB для того, чтобы иметь точку останова, которая ведет себя как сторожевой пес? То есть: он должен прервать поток, если в течение определенного времени он не будет обработан, поэтому я могу проверить, какая строка вызывает проблему.

1 Ответ

0 голосов
/ 19 апреля 2020

Т.е.: он должен прервать поток, если в течение определенного времени он не попадет, поэтому я могу проверить, какая строка вызывает проблему.

Вам это не нужно функциональность, чтобы проверить, какая строка вызывает проблемы (а функциональность не существует).

Подождите, пока не произойдет условие "не завершить", и нажмите Control- C. GDB остановит все потоки процесса и выдаст приглашение (gdb). В этот момент введите команду thread apply all where, и вы увидите, где застрял «не выходящий» поток.

...