小编use*_*698的帖子

.NET应用程序因GC线程死锁而挂起

我们的应用程序有一个问题,即使用托管(C#)和非托管(C++)代码的混合.基本上我们有一个调用一堆程序集的exe,其中一个程序集是我们C++库的MC++包装器.该应用程序是一个控制台应用程 大部分时间它工作正常但偶尔会挂起而没有任何错误或例外.

使用内存转储和符号,我们已经能够在WinDbg中做一些诊断,但我不确定我们看到的是死锁与否.我已经搜索了堆栈中出现的CLR方法名称,但是却找不到一个线程试图分配内存并使用GC死锁的情况.

到目前为止,我已尝试使用sos,sosex,psscor4扩展的WinDbg.有趣的是,sosex有一个检查死锁的命令(!dlk),但它没有报告死锁.

发布代码很难,因为它是一个庞大而复杂的应用程序.有.NET 3.5和4.0程序集的混合.托管代码和非托管代码中都有线程.

如果有人可以查看堆栈跟踪并确认这可能是GC线程的死锁,我会批评.或者甚至更好,如果你可以建议一些其他方法来调试使用C#和MC++的.NET应用程序中的死锁/挂起.

这是我到目前为止所拥有的:

应用程序挂起时的线程列表:(!threads)

ThreadCount:      8
UnstartedThread:  0
BackgroundThread: 5
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                           PreEmptive                                                   Lock
       ID  OSID        ThreadOBJ     State GC       GC Alloc Context                  Domain           Count APT Exception
   0    1   de0 00000000008069f0      a020 Enabled  0000000000000000:0000000000000000 00000000007fa280     0 MTA
   2    2  2130 000000000080bd30      b220 Enabled  0000000000000000:0000000000000000 00000000007fa280     0 MTA (Finalizer)
   4    3  14fc 000000001d182880   200b020 Enabled  0000000000000000:0000000000000000 00000000007fa280     0 MTA
   5    4  20d0 000000001d18b400      b220 Enabled  0000000000000000:0000000000000000 00000000007fa280     2 MTA (GC)
   6    5 …
Run Code Online (Sandbox Code Playgroud)

.net multithreading garbage-collection deadlock critical-section

14
推荐指数
1
解决办法
2068
查看次数