RH Linux互斥锁调试
RH Linux Mutex lock debugging
如果有熟悉c++多线程代码的人能在互斥锁问题上给出一些建议,我将不胜感激。它运行在Red hat Linux 5.4上。我们正在调试不是我编写的遗留代码。它应该每秒执行非常高的调用,响应时间为3-5毫秒。我们在主应用程序中运行了大约400个线程。
我不喜欢这个应用程序的一件事是到处使用智能指针(每当SPtr超出作用域时都会有互斥调用)。写这篇文章的人似乎对sptr上瘾了。很多函数都接受SPtr作为参数。
应用程序可以正常运行几个小时,然后我们在锁定时突然获得互斥锁EINVAL(返回代码22)。我看过核心转储,它显示了不同的堆栈跟踪,没有一个地方导致它。
你会推荐什么工具来调试它?这是由于内存或堆栈损坏(意味着与互斥锁无关的东西)而发生的吗?感谢您的宝贵时间。
EINVAL
对pthread_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表示有效互斥锁。其他字段都应该包含小整数或有效的指针。如果您看到随机的垃圾,这意味着互斥锁可能被某些东西破坏了。
相关文章:
- 在linux上调试巨大的C++项目
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 在Linux Mint 19下,从哪里提取wxWidgets的源代码(.cpp文件)用于步骤内部调试
- 在Windows上调试linux崩溃转储
- 如何在 Linux 上强制执行矢量下标超出范围的调试断言
- 在 Linux 上从 Visual Studio Code 调试 Python C++ 扩展
- 调试从 Linux 中的另一个C++应用程序启动的 python 脚本
- 如何在 Linux 上调试本机代码时自动附加到多个子进程
- 混合调试和发布库:Windows vs Linux,静态与共享
- 使用 gdb 调试 linux 守护程序的初始启动
- 调试基于 Linux 的 C++ 代码 Visual Studio 代码时出现问题
- Linux Opensuse C 编译器问题.(无法初始化部分调试器的解压缩状态)
- 我们如何远程调试在 Linux 服务器上运行的C++应用程序
- Linux-有时仅分割故障 - 如何调试
- 无法解析符号'__builtin_va_start' Visual Studio Linux 远程调试
- 调试C :./nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录
- 适用于Linux的免费并行(MPI)调试器
- 使用 Linux Eclipse,我可以以编程方式判断我正在调试器 (gdb) 中执行
- 如何在 Linux 中调试践踏问题
- 如何使用Eclipse从Windows调试linux C++程序