c++ 如何通过gdb识别哪个线程持有std::recursive_mutex?

zujrkrfu  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(175)

如果我使用std::mutex并遇到死锁,我可以通过gdb找到哪个线程持有互斥量

  1. $ p mutex
  2. $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_mutexstd::shared_mutex时,事情变得越来越困难,因为我只能得到<incomplete type>std::shared_mutex的错误。

  1. 90 in /usr/local/bin/../include/c++/v1/__mutex_base
  2. (gdb) p __m
  3. $5 = (std::__1::lock_guard<std::__1::recursive_mutex>::mutex_type &) @0x7f163db94558: <incomplete type>

如果我指定了类型

  1. p (struct std::__recursive_mutex_base) __m
  2. No struct type named std.

我想知道我如何知道哪些线程持有std::recursive_mutexstd::shared_mutex

p3rjfoxz

p3rjfoxz1#

我有两种方法来“修复”这个问题:
1.我发现有一个错误

  1. 90 /usr/local/bin/../include/c++/v1/__mutex_base: No such file or directory.

在我的g++-9中,没有提供__mutex_basev1。然而,我发现一个mutex,它与这个__mutex_base文件非常相似。所以我修改了这个文件,第90行就是recursive_mutex的定义,然后是I directory /usr/include/c++。然后p (struct std::__recursive_mutex_base) __m就可以工作了。
1.另一种方法来自Can we define a new data type in a GDB session我写下面的代码

  1. #include <mutex>
  2. #include <shared_mutex>
  3. struct r_wrapper: std::recursive_mutex {
  4. void f() {
  5. printf("dummy");
  6. }
  7. };
  8. struct s_wrapper: std::shared_mutex {
  9. void f() {
  10. printf("dummy");
  11. }
  12. };
  13. struct r_wrapper r_wrapper_instance;
  14. struct s_wrapper s_wrapper_instance;

并且确保r_wrapper_instance是一个符号。然后我只需要add-symbol-file a.o 0p (struct r_wrapper&) __m就可以打印了。

展开查看全部

相关问题