System.AccessViolationException故障排除

时间:2014-06-25 16:38:57

标签: c# pinvoke

我有一个自定义Windows服务,安装在大约500个生产系统上,收集有关机器的信息(硬盘大小/自由空间,安装了RAID控制器等)上周我发现其中一台服务器没有' t报告,所以我登录到机器,我注意到该服务确实抛出异常。

问题出现了:异常都是System.AccessViolationException类型,但我不确定为什么我会突然看到它们。它们发生在两个不同的地方:一次是我调用SqlServerCe程序集(非托管)的地方,另一个地方是我尝试释放NetApi32.dll中的缓冲区(该代码如下)

    private static string GetNetworkName()
    {
        int result = 0;
        string network = null;
        IntPtr pDomain = IntPtr.Zero;
        NetJoinStatus status = NetJoinStatus.NetSetupUnknownStatus;
        try
        {
            result = NetGetJoinInformation(null, out pDomain, out status);
            if (result == ErrorSuccess && status == NetJoinStatus.NetSetupDomainName)
            {
                network = Marshal.PtrToStringAuto(pDomain);
            }
            else if (result == ErrorSuccess && status == NetJoinStatus.NetSetupWorkgroupName)
            {
                network = Marshal.PtrToStringAuto(pDomain);
            }
        }
        finally
        {
            if (pDomain != IntPtr.Zero) NetApiBufferFree(pDomain);
        }
        if (network == null) network = "";
        return network;
    }

在finally块中抛出异常。我对如何解决这个问题感到茫然;我没有在任何其他服务器上看到这个问题,几年内没有对服务本身进行更新等等。在服务失败之前,机器上发生的最后一件事是与Crypt32和ASP相关的Windows更新。 NET已下载并安装,但我不认为这与手头的问题有关。

我是否可以采取任何步骤来弄清楚为什么会出现这个问题?我知道AccessViolationException通常意味着非托管代码试图在内存中寻址无效地址,但无论如何,我是否要解决为什么会发生这种情况并纠正它?

0 个答案:

没有答案