首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gdb调试pthread

使用gdb调试pthread
EN

Stack Overflow用户
提问于 2012-08-24 17:25:10
回答 3查看 2.8K关注 0票数 0

我正在尝试调试一个非常罕见的死锁,我已经将其范围缩小到pthread_mutex的问题,它属于类型1(递归)。我想要追踪这个互斥锁来自哪里,因为我们所有的代码都使用正常的互斥锁,我认为检测互斥锁何时输入==递归来追踪它是有意义的。

我尝试过在pthread_mutex_lock中设置一个手动断点,通过堆栈指针取消对pthread_mutex_t的引用等来检查它的类型,但这被调用了数百万次,而且它永远都要花上很长时间才能捕捉到互斥类型==递归的情况。

我还尝试插入一个库并替换pthread_mutex_lock,以使在互斥锁类型上设置断点成为可能,但这并没有获得任何成功(我不相信这会捕获对pthread_mutex_lock的所有调用)

我感觉在gdb中一定有一种方法可以设置观察点/条件断点,用于每当使用递归类型的互斥调用pthread_mutex_lock时?

在上述方面的任何帮助都将不胜感激。提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-08-26 01:08:11

我已经把范围缩小到一个pthread_mutex的问题,它是类型1(递归) ...

我想要追踪这个互斥锁来自哪里,因为我们所有的代码都使用普通互斥锁。

假设您已经以某种方式确定您的线程在试图锁定递归互斥锁的pthread_mutex_lock中被阻塞,但是您不知道谁持有这个互斥锁,以及为什么。

导致pthread_mutex_lock的堆栈跟踪应该准确地告诉您哪个代码正在试图锁定该互斥锁,这是理解问题所需了解的全部内容。

我不明白为什么要在锁定互斥锁的过程中“捕捉”pthread_mutex_lock,因为这可能不会给您提供比检测到死锁后查看堆栈所获得的更多的信息。

通常,尝试用GDB调试互斥锁问题是徒劳的--设置断点(甚至只是附加GDB)的行为会在很大程度上改变操作的时间,以至于大多数问题在GDB下运行时都不会出现。

票数 1
EN

Stack Overflow用户

发布于 2012-08-24 17:32:38

可以使用监视点而不是gdb断点。

票数 0
EN

Stack Overflow用户

发布于 2012-08-24 17:38:08

您可以尝试:

代码语言:javascript
复制
(gdb) conditional yourbreakpointid mutex.__m_kind==PTHREAD_MUTEX_RECURSIVE

其中mutex是作用域中互斥锁的名称,yourbreakpointid是放在函数中的断点的id。

根据实现的不同,__m_kind可能会更改名称,如果这个不起作用,请搜索您的分发头(pthread.h)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12106581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档