RH Linux互斥锁调试

RH Linux Mutex lock debugging

本文关键字:调试 Linux RH      更新时间:2023-10-16

如果有熟悉c++多线程代码的人能在互斥锁问题上给出一些建议,我将不胜感激。它运行在Red hat Linux 5.4上。我们正在调试不是我编写的遗留代码。它应该每秒执行非常高的调用,响应时间为3-5毫秒。我们在主应用程序中运行了大约400个线程。

我不喜欢这个应用程序的一件事是到处使用智能指针(每当SPtr超出作用域时都会有互斥调用)。写这篇文章的人似乎对sptr上瘾了。很多函数都接受SPtr作为参数。

应用程序可以正常运行几个小时,然后我们在锁定时突然获得互斥锁EINVAL(返回代码22)。我看过核心转储,它显示了不同的堆栈跟踪,没有一个地方导致它。

你会推荐什么工具来调试它?这是由于内存或堆栈损坏(意味着与互斥锁无关的东西)而发生的吗?感谢您的宝贵时间。

EINVALpthread_mutex_lock调用意味着锁没有被正确初始化。它也可以意味着锁已被pthread_mutex_destroy破坏。这两种情况都可能发生,如果你有内存或堆栈损坏——如果你用随机垃圾覆盖了互斥对象,或者你试图在互斥对象的析构函数被调用后使用它。

如果在gdb中打印互斥对象,您将看到如下内容:

$5 = {
  __data = {
    __lock = 0, 
    __count = 0, 
    __owner = 0, 
    __nusers = 0, 
    __kind = -1, 
    __spins = 0, 
    __list = {
      __prev = 0x0, 
      __next = 0x0
    }
  }, 
  __size = '00' <repeats 16 times>"377, 377377377", '00' <repeats 19 times>, 
  __align = 0
}

在本例中,kind字段为-1表示互斥锁已被销毁。类型字段为0、1或2表示有效互斥锁。其他字段都应该包含小整数或有效的指针。如果您看到随机的垃圾,这意味着互斥锁可能被某些东西破坏了。