Я столкнулся с тупиковой ситуацией в одном из моих приложений c (это большой код), и мне удалось отладить этап, на котором я распечатал мьютекс. Похоже ниже -
{__data =
{__lock = 2,
__count = 0,
__owner = 15805,
__nusers = 1,
__kind = 0,
__spins = 0,
__list = {__prev = 0x0, __next = 0x0}
},
__size = "\002\000\000\000\000\000\000\000½=\000\000\001", '\0' <repeats 26 times>,
__align = 2
}
Теперь я могу понять, что __owner является идентификатором потока, удерживающего этот мьютекс, этот же поток заходит в тупик для этого мьютекса. Кто-нибудь знает значение остальных полей, таких как _ lock, _count, __ spins и т. Д., Которые могут быть полезны при отладке тупиков? Любые советы / хитрости также приветствуются? (Основываясь на отладке, я понял, что поток пытается заблокировать мьютекс, который он уже содержит, заканчивая тупиком, а также другие потоки ожидают этого мьютекса)
Также возможно ли выяснить, в какой строке кода это заблокировано, наблюдая за процессом / потоками через отладчик (gdb) (конечно, отладочная информация и код под рукой), не требуя тщательного прохождения кода? Я просмотрел свой код несколько раз, но не смог найти, где эта блокировка была оставлена невыпущенной, прежде чем вернуться из функции.
Спасибо
Nerdy