gpt4 book ai didi

c++ - RH Linux 互斥锁调试

转载 作者:太空宇宙 更新时间:2023-11-04 09:47:07 25 4
gpt4 key购买 nike

如果有人使用 C++,多线程代码可以阐明互斥锁问题,我将不胜感激。它在 Red Hat Linux 5.4 上运行。我们正在调试不是我写的遗留代码。假设每秒进行非常高的调用,响应时间为 3-5 毫秒。我们在主应用程序中运行了大约 400 个线程。

我不喜欢这个应用程序的一件事是到处使用智能指针(只要 SPtr 超出范围,就会有互斥调用)。写这篇文章的人似乎沉迷于 SPtrs。许多函数都将 SPtr 作为参数。

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

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

最佳答案

pthread_mutex_lock 调用上的

EINVAL 表示锁未正确初始化。这也可能意味着锁已被 pthread_mutex_destroy 销毁。如果您有内存或堆栈损坏——如果您用随机垃圾覆盖了互斥锁对象,或者您试图在调用其析构函数后使用带有互斥锁的对象。

如果你在 gdb 中打印一个互斥对象,你会看到类似的东西:

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

在这种情况下,-1 的 kind 字段意味着互斥量已被销毁。 0、1 或 2 的种类字段表示有效的互斥量。其他字段都应包含小整数或有效的外观指针。如果您看到乱七八糟的垃圾,则表示互斥锁可能被某些东西破坏了。

关于c++ - RH Linux 互斥锁调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15188052/

25 4 0