Просмотреть все дерево вызовов на блокировках std::mutex в QT Creator

avatar
Vega4
1 июля 2021 в 19:54
45
0
0

Мы столкнулись с проблемой, в которой должно быть довольно легко разобраться, однако с QT Creator она не кажется такой уж очевидной; возможно, мы что-то упустили из виду, и, надеюсь, вы сможете указать нам правильное направление.

Короче говоря, мы пытались исследовать проблему тупиковой блокировки. Обычно мы ожидали, что представление отладки сможет отображать ПОЛНЫЕ кадры стека каждого потока. Так что в случае тупиковой ситуации мы ожидаем, что кадры стека с for ex. вызовы функций lock() std::mutex, ожидающих получения блокировки. Таким образом, мы могли бы выяснить, какой именно поток застрял при попытке захвата мьютекса. звучит как типичный способ решения проблемы.

Однако с QT Creator все не так просто. Вместо отладочной информации, указывающей прямо на файлы в нашем коде, представление отладки показывает только код, застрявший в libc.so, а части кадров стека ниже сообщаются как «??». Доступны символы отладки. Скриншот ниже был сделан после того, как приложение было приостановлено.

enter image description here Выше приведен кадр стека, о котором сообщил QT Creator после выполнения приведенного ниже кода:

.

enter image description here

Возникла тупиковая ситуация, так как mFieldsGuardian заблокирован и пытается снова заблокироваться при вызове getTools() ниже; однако из вывода отладчика невозможно узнать, какая функция пользовательского кода привела к этому вызову lock(). Мы хотели бы иметь возможность видеть весь кадр стека, ведущий к вызову той самой инструкции libc.

Конечно, «невозможно узнать» — это преувеличение; есть еще указатели памяти, предположительно доступные рядом с '??'

Идеи?

Источник
Peter Devenyi
1 июля 2021 в 20:21
0

Это немного другой подход, и он может оказаться неприемлемым для вашей кодовой базы, но вы можете немного прочитать об инструментарии дезинфицирующих средств. clang ThreadSanitizer или gcc sanitize=thread. Найдите эти ключевые слова. Это позволит вам обнаружить проблемы с потоками. Однако он поддерживается только на 64-битной архитектуре.

Ответы (0)