代码之家  ›  专栏  ›  技术社区  ›  moogs

.NET调试-System.Threading.ExecutionContext.RunTrycode

  •  5
  • moogs  · 技术社区  · 14 年前

    我们有这个bug,它只在发布版本构建的30%时间内出现。 打开windbg中的碰撞垃圾场(剪下“!分析-v“输出):

    FAULTING_IP: 
    +4
    00000000`00000004 ??              ???
    
    EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
    ExceptionAddress: 0000000000000004
       ExceptionCode: c0000005 (Access violation)
      ExceptionFlags: 00000000
    NumberParameters: 2
       Parameter[0]: 0000000000000008
       Parameter[1]: 0000000000000004
    Attempt to execute non-executable address 0000000000000004
    ERROR_CODE: (NTSTATUS) 0xc0000005 - 
       The instruction at 0x%08lx referenced memory at 0x%08lx. 
       The memory could not be %s.
    WRITE_ADDRESS:  0000000000000004 
    MANAGED_STACK: 
    (TransitionMU)
    0000000024B9E370 000007FEEDA1DD38 
       mscorlib_ni!
       System.Threading.ExecutionContext.runTryCode(System.Object)+0x178
    (TransitionUM)
    (TransitionMU)
    0000000024B9DFB0 000007FF00439010 MyLibrary!DocInfo.IsStatusOK()+0x30
    

    现在,isstatusok()只调用 PrintSystemJobInfo.Get() 但这似乎并没有出现在堆栈中。

    关于如何调试这个有什么想法吗?我确信runtrycode()确实不是问题所在……但是……我卡住了。

    谢谢!(我真的在这里摸索)。

    3 回复  |  直到 14 年前
        1
  •  0
  •   David Gardiner    14 年前

    在黑暗中捅了一刀——但鉴于这可能与打印有关,这可能是由一个不可靠的打印机驱动程序引起的吗?

    问题是发生在不同的机器上还是只发生在特定的机器上?

        2
  •  0
  •   Tollo    14 年前

    访问冲突必须来自本机代码,因此下面的数据结构可能是错误的,或者与定义有关。您是对本机调用方法进行p-invoke,还是将数据结构发送给其他调用本机调用方法的托管方法?

    正如上面提到的线程一样,这段代码是运行多线程的吗?是否可能存在线程问题,您用来与本机代码对话的数据结构正被其他线程损坏?

        3
  •  0
  •   moogs    14 年前

    谢谢大家!终于明白了。

    这里有一些本机互操作正在进行,显然GC正在内存中的一些变量周围移动。这是在互操作方面造成巨大破坏的一个。解决方案:使用intptr或gcmhandle.alloc()。

    (诚然,这个答案写得有点匆忙,我有时间的时候会尽量填写一个合适的答案)。