You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET互操作内存泄漏:强句柄无法转储排查求助

排查托管对象被强句柄引用导致的内存泄漏问题

针对你遇到的VC++/C# COM互应用中LcUI.Portal.PortalMainForm无法被GC回收的问题,结合WinDbg输出,给出以下具体排查步骤:

1. 正确查看CLR托管句柄信息

你之前使用的!handle是Windows原生句柄调试命令,但02fd530c是CLR托管句柄表中的条目,不是系统句柄,因此报错。改用CLR专用命令查看该句柄:

!dumphandle 02fd530c

该命令会返回强句柄的类型、关联对象及所属AppDomain信息,帮你定位句柄的归属范围。

2. 检查COM互操作的引用计数管理

由于对象是在原生代码中通过COM创建和释放,需确认原生侧对COM对象的引用计数是否正确:

  • 托管对象会被包装为COM可调用包装(CCW),原生代码每次调用AddRef必须对应一次Release,若遗漏Release,CLR会因CCW引用计数未归零而保留强句柄,阻止GC回收。
  • 用以下命令查看对象的CCW相关信息:
    !dumpmt 1dcf176c  # 查看对象方法表,确认是否包含COM接口
    !dumpccw 234528ac # 若存在CCW,查看其当前引用计数
    
    若CCW引用计数大于0,说明原生侧未正确释放引用。

3. 追踪强句柄的创建来源

  • 若有完整符号文件,使用!traceheap查看对象的分配栈,确认对象创建并关联强句柄的调用路径:
    !traceheap -alloc 234528ac
    
  • 使用SOS扩展的!gchandles命令列出所有托管强句柄,对比上下文找到与02fd530c相关的线索:
    !gchandles -strong
    

4. 排查其他潜在GC根引用

除静态自引用外,还需检查:

  • 该对象是否被其他托管静态字段、全局变量引用(可结合!dumpheap -stat和!gcroot排查)
  • 是否存在未关闭的事件订阅、委托引用,这类引用也可能成为GC根

内容的提问来源于stack exchange,提问作者Daniel W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:40:31