Отладка тупика с помощью pthread mutex (linux) - PullRequest
2 голосов
/ 23 ноября 2010

Я столкнулся с тупиковой ситуацией в одном из моих приложений 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

1 Ответ

0 голосов
/ 22 декабря 2010

Другие поля не особенно полезны для отладки взаимоблокировок. Важная информация - это то, что вы уже нашли: поток блокируется, поскольку он блокирует мьютекс, который уже заблокирован сам по себе.

Чтобы отладить это с помощью gdb, вы можете установить точки останова в каждой строке, где этот мьютекс заблокирован интересующей нитью. Каждый раз, когда срабатывает точка останова, просто продолжайте выполнение. Когда происходит взаимоблокировка, самая последняя предыдущая операция блокировки, очевидно, не имеет соответствующей разблокировки.

...