如果我使用std::mutex并遇到死锁,我可以通过gdb找到哪个线程持有互斥量
$ p mutex
$3 = (std::__1::mutex &) @0x7f70b56ffc90: {__m_ = {__data = {__lock = 2, __count = 0, __owner = 28539, __nusers = 1, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}},
__owner
字段表示互斥锁由线程28539持有。
然而,当涉及到std::recursive_mutex
或std::shared_mutex
时,事情变得越来越困难,因为我只能得到<incomplete type>
。std::shared_mutex
的错误。
90 in /usr/local/bin/../include/c++/v1/__mutex_base
(gdb) p __m
$5 = (std::__1::lock_guard<std::__1::recursive_mutex>::mutex_type &) @0x7f163db94558: <incomplete type>
如果我指定了类型
p (struct std::__recursive_mutex_base) __m
No struct type named std.
我想知道我如何知道哪些线程持有std::recursive_mutex
或std::shared_mutex
。
1条答案
按热度按时间p3rjfoxz1#
我有两种方法来“修复”这个问题:
1.我发现有一个错误
在我的g++-9中,没有提供
__mutex_base
或v1
。然而,我发现一个mutex
,它与这个__mutex_base
文件非常相似。所以我修改了这个文件,第90行就是recursive_mutex
的定义,然后是Idirectory /usr/include/c++
。然后p (struct std::__recursive_mutex_base) __m
就可以工作了。1.另一种方法来自Can we define a new data type in a GDB session我写下面的代码
并且确保r_wrapper_instance是一个符号。然后我只需要
add-symbol-file a.o 0
,p (struct r_wrapper&) __m
就可以打印了。