c – 是什么导致我的堆栈中出现神秘的重复条目?

c – 是什么导致我的堆栈中出现神秘的重复条目?,第1张

概述我正在调查死锁错误.我用gcore取了一个核心,发现我的一个函数似乎已经调用了自己 – 即使它没有进行递归函数调用. 这是gdb的堆栈片段: Thread 18 (Thread 4035926944 (LWP 23449)):#0 0xffffe410 in __kernel_vsyscall ()#1 0x005133de in __lll_mutex_lock_wait () from 我正在调查死锁错误.我用gcore取了一个核心,发现我的一个函数似乎已经调用了自己 – 即使它没有进行递归函数调用.

这是gdb的堆栈片段:

Thread 18 (Thread 4035926944 (LWP 23449)):#0  0xffffe410 in __kernel_vsyscall ()#1  0x005133de in __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0#2  0x00510017 in _L_mutex_lock_182 () from /lib/tls/libpthread.so.0#3  0x080d653c in ?? ()#4  0xf7c59480 in ?? () from liBFOO.so#5  0x081944c0 in ?? ()#6  0x081944b0 in ?? ()#7  0xf08f3b38 in ?? ()#8  0xf7c3b34c in FOO::Service::releaSEObject ()   from liBFOO.so#9  0xf7c3b34c in FOO::Service::releaSEObject ()   from liBFOO.so#10 0xf7c36006 in FOO::RequesterImpl::releaSEObject ()   from liBFOO.so#11 0xf7e2afbf in bar::BAZ::unsubscribe (this=0x80d0070,sSymbol=@0xf6ded018)    at /usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_tree.h:176...more stack

我已经省略了一些名字:FOO& bar是namespaces.BAZ是一个类.

有趣的部分是#8和#9,对Service :: releaSEObject()的调用.这个函数不调用自身,也不调用任何调用它的函数……它不是递归的.为什么它会在堆栈中出现两次?

这是一个由调试器创建的人工制品,还是真的?

您会注意到最里面的调用正在等待互斥锁 – 我认为这可能是我的僵局. Service :: releaSEObject()锁定一个互斥锁,所以如果它神奇地传送回自身内部,那么肯定会发生死锁.

一些背景:

这是在RHEL4上使用g v3.4.6编译的.它是一个64位 *** 作系统,但这是32位代码,使用-m32编译.它在-O3进行了优化.我无法保证应用程序代码的编译与liBFOO代码完全相同.

类服务没有虚函数,所以没有vtable. RequesterImpl类继承自全虚拟接口,因此它具有vtable.

解决方法 你得到“坏”堆栈的原因是__lll_mutex_lock_wait具有不正确的展开描述符(它是用手工编码的汇编编写的).我相信这在最近(2008年)有所修复,但找不到确切的补丁.

一旦GDB堆栈解开“失去平衡”,它就会产生虚假帧(#2到#8),但最终会在使用帧指针的帧上发生故障,并为堆栈的其余部分产生正确的堆栈跟踪.

总结

以上是内存溢出为你收集整理的c – 是什么导致我的堆栈中出现神秘的重复条目?全部内容,希望文章能够帮你解决c – 是什么导致我的堆栈中出现神秘的重复条目?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212588.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存