C#Windows服务导入C ++ dll崩溃,事件ID:1000 clr.dll

问题描述

我有一个Windows服务,可导入C ++ dll。如果我进行压力测试,则此Windows服务将直接崩溃,并带有事件ID:1000显示模块clr.dll但未记录任何异常。事件消息如下:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Application Error" />
    <EventID Qualifiers="0">1000</EventID>
    <Level>2</Level>
    <Task>100</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2020-10-26T08:22:52.027599500Z" />
    <EventRecordID>5246</EventRecordID>
    <Channel>Application</Channel>
    <Computer>computer</Computer>
    <Security />
  </System>
  <EventData>
    <Data>Server.exe</Data>
    <Data>5.1.0.1</Data>
    <Data>5f8d0a4f</Data>
    <Data>clr.dll</Data>
    <Data>4.7.3680.0</Data>
    <Data>5f233da8</Data>
    <Data>c0000409</Data>
    <Data>0056aa27</Data>
    <Data>1fc4</Data>
    <Data>01d6ab1690751cd9</Data>
    <Data>Server.exe</Data>
    <Data>C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll</Data>
    <Data>0772888d-b659-483c-b80b-d7b4de714636</Data>
    <Data>
    </Data>
    <Data>
    </Data>
  </EventData>
</Event>

我尝试了一些方法

  1. Windows Update
  2. 我的C#项目app.config添加
    <configuration>
       <runtime>
          <legacyCorruptedStateExceptionsPolicy enabled="true" />
       </runtime>
    </configuration>

以及使用C ++ dll添加功能

[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
  1. 所有使用C ++ dll的代码添加了try catch,但是Windows服务仍然崩溃,没有记录任何异常。

Windows环境是Windows Server 2016 64位。 C ++ dll是x86,因此我使用x86 cpu-调试来构建项目。我怀疑C ++ dll导致崩溃的原因,但无法证明。

解决方法

看起来简单的解决方案是将调试器附加到服务。您可能需要以管理员身份启动Visual Studio,因为该服务可能是在非交互式登录下运行的。

“ CorruptedState”非解决方案是对IsBadReadPtr 的抛弃,if(meta.reflectee is _Override) { print('Found!); } 是Microsoft过去发明的另一种不可靠且不稳定的方法。在调试时,调试器是更好的解决方案。一旦发布给客户,两种方法都无法保证解决问题。