如何找到终结器队列挂起的原因?

2024-03-20

我有一个应用程序从 go 开始就经历了缓慢的内存泄漏。

Using ANTS 内存分析器我可以看到所有泄漏的内存都由终结器队列的 GC 根保存。

我怀疑可能发生的情况是终结器死锁,等待锁变得可用。

我们的类都没有实现显式终结器,我们通常避免使用它们,这让我认为锁可能与系统或库类相关。

我用过SOS.dll查看终结器队列的内容,如果我正确解释它,那么它会报告第一个项目是一个实例System.Threading.Thread但是我不确定队列的头部是否实际上代表当前正在处理的对象或下一个要处理的对象。

  • 我可以使用什么技巧来了解正在完成的内容吗?
  • 有没有办法可以找出终结器线程正在等待什么锁?
  • 是否可以打开任何额外的调试来跟踪终结器线程的操作?
  • 我还能看什么?

Update

终结器线程的堆栈如下所示:

ntdll.dll!_ZwWaitForSingleObject@12()  + 0x15 bytes  
ntdll.dll!_ZwWaitForSingleObject@12()  + 0x15 bytes  
user32.dll!_NtUserPostMessage@16()  + 0x15 bytes     

kernel32.dll!_WaitForSingleObjectExImplementation@12()  + 0x43 bytes     
kernel32.dll!_WaitForSingleObject@8()  + 0x12 bytes  
ole32.dll!GetToSTA()  + 0x72 bytes   

ole32.dll!CRpcChannelBuffer::SwitchAptAndDispatchCall()  - 0x1939 bytes  
ole32.dll!CRpcChannelBuffer::SendReceive2()  + 0xa6 bytes    
ole32.dll!CAptRpcChnl::SendReceive()  + 0x5b7 bytes  
ole32.dll!CCtxComChnl::SendReceive()  - 0x14b97 bytes    
ole32.dll!NdrExtpProxySendReceive()  + 0x43 bytes    
rpcrt4.dll!@NdrpProxySendReceive@4()  + 0xe bytes    
rpcrt4.dll!_NdrClientCall2()  + 0x144 bytes  
ole32.dll!_ObjectStublessClient@8()  + 0x7a bytes    
ole32.dll!_ObjectStubless@0()  + 0xf bytes   

ole32.dll!CObjectContext::InternalContextCallback()  - 0x511f bytes  
ole32.dll!CObjectContext::ContextCallback()  + 0x8f bytes    
clr.dll!CtxEntry::EnterContext()  + 0x119 bytes  

clr.dll!RCWCleanupList::ReleaseRCWListInCorrectCtx()  + 0x2bb bytes  

clr.dll!RCWCleanupList::CleanupAllWrappers()  - 0x20fb0 bytes    
clr.dll!SyncBlockCache::CleanupSyncBlocks()  + 0x1ec6 bytes  
clr.dll!Thread::DoExtraWorkForFinalizer()  + 0x411b5 bytes   

clr.dll!WKS::GCHeap::FinalizerThreadWorker()  + 0x8b bytes   
clr.dll!Thread::DoExtraWorkForFinalizer()  + 0xb6e76 bytes   
clr.dll!Thread::ShouldChangeAbortToUnload()  - 0x5f8 bytes   
clr.dll!Thread::ShouldChangeAbortToUnload()  - 0x53d bytes   
clr.dll!ManagedThreadBase_NoADTransition()  + 0x35 bytes     
clr.dll!ManagedThreadBase::FinalizerBase()  + 0xf bytes  
clr.dll!WKS::GCHeap::FinalizerThreadStart()  + 0xfb bytes    
clr.dll!Thread::intermediateThreadProc()  + 0x48 bytes   
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes     
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes    
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes     

在我看来,您的 COM 服务器有问题。调用堆栈显示它正在尝试对单线程 COM 对象进行 IUnknown::Release() 调用。 ReleaseRCWListInCorrectCtx() 调用将其关闭,_NtUserPostMessage@16() 是将请求编组到拥有 COM 对象的 STA 的调用。

典型的原因是创建 COM 对象而不是泵送消息循环。对 STA 线程的硬性要求。您可以通过在主 UI 线程上创建它们并且从不阻塞它来避免这种情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到终结器队列挂起的原因? 的相关文章

随机推荐

  • 如何监控 iOS 模拟器的网络调用

    我正在尝试像 Firebug 一样监视从应用程序到我的服务器的调用 我找不到在 iOS Simulator 或 xCode 中查看该内容的方法 有没有办法在不嗅探所有流量的情况下做到这一点 如果没有 您建议使用什么工具 就我个人而言 我使用
  • 射线交叉未击中目标

    我正在尝试选择一个 3d 点 我阅读了各种网站 但我的代码不起作用 鼠标右键单击 glGetFloatv GL MODELVIEW MATRIX mv mat glGetFloatv GL PROJECTION MATRIX p mat i
  • C# Assert.AreNotEqual 与 Equals

    在尝试向自己验证 C Equals for IEnumerables 是一个引用 equals 时 我发现了一些奇怪的东西 在 NUnit 中进行以下设置 var a IEnumerable
  • QNetworkAccessManager没有完成信号

    我想直接请求和响应而不是使用connect SLOT finished SLOT 您可以使用QEventLoop以便应用程序等待并可以同时处理其他事件 include
  • 在 Cocoa 中获得机器唤醒+用户登录通知的可靠方法?

    我尝试过注册NSWorkspaceDidWakeNotification with NSNotificationCenter defaultCenter 但当我的 MacBook Pro 从睡眠状态唤醒时 它永远不会触发 我注册了其他通知
  • Kotlin:如何绕过 CancellationException

    我正在将一些旧的 RxJava 代码移植到协程中 使用 RxJava 我可以在我的活动中执行此操作 someBgOperation as AutoDispose autoDisposable AndroidLifecycleScopePro
  • PHP – setcookie() 不起作用

    我有这个页面 它设置一个 cookie 并在您选中复选框时回显一个字符串 字符串打印正确 但 cookie 从未被设置 我不知道为什么
  • 如何启用Windows 10“容器”功能?

    使用最新的 Windows 10 Fast Ring build 14316 在 VMware 虚拟机内 我试图使桌面应用程序转换器 https msdn microsoft com windows uwp porting desktop
  • 编码/gob 和编码/json 之间的区别

    我正在用 Go 编写一个应用程序 它使用编码 gob 在节点之间通过 UDP 发送结构和切片 它工作正常 但我注意到encoding json也有类似的API 搜索了一下 发现了这个信息 https golang org pkg encod
  • 使用 Spring Security (Spring Boot 3.0.2) 时如何访问 H2 控制台?

    所以我正在尝试学习 Spring 因为今年晚些时候我的一个项目将需要它 项目使用 Spring Boot 3 0 2 和 Java 17 我还使用 Spring Security 依赖项 这意味着我需要在不使用令牌的情况下授权某些 URL
  • 使用 X509certificate2 进行 RSA 加密和解密

    所以 我接下来需要的是 创建用于开发的证书 为客户端获取一份证书 为服务器获取一份证书 通过API检索客户端编码的密码并在服务器上解码 现在 我成功创建了以下证书这个链接 https blog jayway com 2014 09 03 c
  • 禁用屏幕键盘

    我正在为嵌入式应用程序开发 Windows 应用商店应用程序 其中唯一的输入设备是小型触摸屏 因此 我正在开发自己的数字和文本输入控件 它们与应用程序的视觉外观相匹配 并且在小屏幕上工作得更好 当文本框获得焦点时 是否可以防止 Window
  • num2cell() 的 python/numpy 等价物是什么?

    我很不幸能够通过 numpy 数组将一些 MATLAB 代码转换为 Python 有没有共识num2cell 就我个人而言 我认为这违背了 Python numpy 语法 这个想法是这样的 Using num2cell 你最终会得到一个看起
  • Spring中指定默认属性值为NULL

    我想在 Spring XML 配置文件中定义默认属性值 我希望这个默认值是null 像这样的东西
  • ap 在 Haskell 中如何以及为何被定义为 liftM2 id

    在试图更好地理解 Applicative 的同时 我查看了 的定义 它往往被定义为 ap 而 ap 又被定义为 ap Monad m gt m a gt b gt m a gt m b ap liftM2 id 查看 liftM2 和 id
  • 如何在提交前更改隐藏输入字段的值

    我有一个 Feedburner 订阅表格 其中有两个按钮 一个用于每日新闻 一个用于每周新闻 问题是如何更改带有名称的隐藏输入字段的值 uri 提交之前 我的解决方案不起作用 这就是我尝试使用的
  • 如何在vi中从中间开始缩进多行?

    例如 要转换这个 example array First gt This Second gt is Third gt an Fourth gt example Fifth gt 进入这个 example array First gt Thi
  • 按数据属性对列表进行排序

    我有一个人员列表 其职称按名字排序 如下所示 ul li a href span class list name John Smith span a span class list desc Professor span li li a h
  • 在 iOS 模拟器中运行 React Native 应用程序时找不到 UMModuleRegistryAdapter.h

    我有一个简单的 React Native 应用程序 我一直在 Android 上测试它 现在想在 iOS 上测试它 它使用 React 导航 I ran npm run ios但我收到以下错误 info In file included f
  • 如何找到终结器队列挂起的原因?

    我有一个应用程序从 go 开始就经历了缓慢的内存泄漏 Using ANTS 内存分析器我可以看到所有泄漏的内存都由终结器队列的 GC 根保存 我怀疑可能发生的情况是终结器死锁 等待锁变得可用 我们的类都没有实现显式终结器 我们通常避免使用它