小编Iri*_*ium的帖子

可能的.NET JIT调用参数生存期错误?

由于.NET运行时出现内部错误(退出代码0x80131506),我一直在追逐.NET服务中间歇性崩溃的原因.有问题的服务不执行任何通常应归咎于此类错误的操作(不安全代码,PInvoke等).我已尝试禁用并发GC,如KB2679415中所述,以及切换到服务器GC,但间歇性崩溃仍然存在.在调试模式下编译时,问题在.NET 4.7.2及更早版本中出现.

该服务广泛使用旧版本的NHibernate(2.0.1),当我在调试器中检查崩溃转储时,在发生错误时,callstack中总会有NHibernate代码,尽管NHibernate本身都是托管代码,所以不应该导致这种崩溃.

我已设法在调试器下重现崩溃并启用GC压力日志和堆验证,虽然它似乎指向JIT/GC中的问题,但我不确定我是否正确解释输出.

查看发生崩溃的线程,此时它发生在clr!JIT_Stelem_Ref:

clr!JIT_Stelem_Ref+0x18: cmp     r9,qword ptr [r8] ds:aaaaaaaa`aaaaaaaa=????????????????
Run Code Online (Sandbox Code Playgroud)

在这种情况下,0xaas 字符串似乎是启用HeapVerify的结果,这会导致GC填充收集的内存区域,可能是为了更容易识别,并建议我们仍然有一个对收集/重定位对象的旧位置的引用.

追溯到堆栈中,有很多0xaaaaaaaaaaaaaaaa条目,但是当最近的GC发生时,这些停止出现在调用堆栈顶部的方法中,在这种情况下,NHibernate.Loader.Loader.GetRow()根据最近的GC压力日志此线程上的GC:

(注意:我已经从SOS' !dumplog输出中反转了记录行的顺序,以便于阅读):

2404 12445.672380360 : `GC`GCROOTS`         Starting scan of Thread 000000001EF4DED0 ID = 20 {
2404 12445.672380963 : `GCROOTS`            Scanning ExplicitFrame 000000001E6ED3B8 AssocMethod = 0000000000000000 frameVTable = 000007FEF365B640 (clr!RedirectedThreadFrame::`vftable')
2404 12445.672386397 : `GCROOTS`            Scanning Frameless method 000007FE93F43460 (NHibernate.Loader.Loader.GetRow(System.Data.IDataReader, NHibernate.Persister.Entity.ILoadable[], NHibernate.Engine.EntityKey[], System.Object, NHibernate.Engine.EntityKey, NHibernate.LockMode[], System.Collections.IList, NHibernate.Engine.ISessionImplementor)) ControlPC = 000007FE945E3095
2404 12445.672388208 : `GC`GCROOTS`             GC …
Run Code Online (Sandbox Code Playgroud)

.net c# jit garbage-collection

18
推荐指数
1
解决办法
394
查看次数

使用模拟时,互斥锁创建会挂起

在测试应用程序时,我遇到了一个奇怪的行为.一些测试使用模拟以不同的用户身份运行代码,但它们总是挂起,永远不会完成.

经过一番调查后,问题被缩小到使用互斥量.最初,我们使用了基于MSDN文档的我们自己的模拟代码,但即使使用SimpleImpersonation库,问题仍然存在.以下是重现问题的最小示例:

using (Impersonation.LogonUser(DOMAIN, USER, PASSWORD, LogonType.Interactive))
{
    Console.WriteLine("Impersonated");
    bool mine;
    using (new Mutex(true, "Mutex", out mine))
    {
        if (!mine)
            throw new Exception("Couldn't get mutex");
        Console.WriteLine("Got mutex");
    }
}

Console.WriteLine("Finished");
Run Code Online (Sandbox Code Playgroud)

这永远不会完成,它与互斥锁创建一致.该文件指出,它要么抛出一个异常,或返回的东西,但没有提到封锁.

其他一些观察结果,可能与也可能没有关系:

  • 如果我们"模仿"当前用户,它会立即返回
  • 如果我们运行实际应用程序并以另一个用户身份启动另一个实例,那么一切都按预期工作

可能底层系统资源正在发生,但我们无法弄明白.如何使这项工作?

更新:根据汉斯的评论,我尝试禁用Windows Defender,它没有帮助.这是挂起的地方的堆栈跟踪:

    ntdll.dll!_NtWaitForSingleObject@12()
    KernelBase.dll!_WaitForSingleObjectEx@12()
    mscorlib.ni.dll!719c1867()
    [Frames below may be incorrect and/or missing, native debugger attempting to walk managed call stack]   
    mscorlib.ni.dll!719c1852()
    [Managed to Native Transition]  
    mscorlib.dll!System.Threading.Mutex.CreateMutexHandle(bool initiallyOwned, string name, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES securityAttribute, out Microsoft.Win32.SafeHandles.SafeWaitHandle mutexHandle)
        mscorlib.dll!System.Threading.Mutex.MutexTryCodeHelper.MutexTryCode(object userData)
    [Native to …
Run Code Online (Sandbox Code Playgroud)

.net c# impersonation winapi mutex

5
推荐指数
1
解决办法
335
查看次数

标签 统计

.net ×2

c# ×2

garbage-collection ×1

impersonation ×1

jit ×1

mutex ×1

winapi ×1