开发者

AccessViolationException in debugger with only managed code and WCF service

开发者 https://www.devze.com 2023-02-14 19:56 出处:网络
This application has a WCF web service that is called by a WinForms app.The WinForms app has a class WCFCache to manage data from the service.There is a section like this in that class to manage an op

This application has a WCF web service that is called by a WinForms app. The WinForms app has a class WCFCache to manage data from the service. There is a section like this in that class to manage an optional custom configuration section that a subset of the machines have:

private bool? m_HasCustomConfiguration = null;
public bool HasCustomConfiguration
{
    get
    {
        if (m_HasCustomConfiguration == null)
            m_HasCustomConfiguration = (CustomConfiguration != null);
        return (bool)m_HasCustomConfiguration;
    }
}

private WCFService.CustomConfiguration m_CustomConfiguration = null;
public WCFService.CustomConfiguration CustomConfiguration
{
    get
    {
        if (m_CustomConfiguration == null)
        {
            if (m_HasCustomConfiguration.HasValue
                && !m_HasCustomConfiguration.Value)
                return null;
            try
            {
                using (WCFService.WCFServiceClient wcf = new WCFService.WCFServiceClient())
                {
                    m_CustomConfiguration = 
                        wcf.GetCustomConfiguration(Machine.ProcessID);
                        // Above method returns null if no record exists.
                    m_HasCustomConfiguration = (m_CustomConfiguration != null);
                }
            } catch (Exception e) {
                // Error logging & re-throw
            }
        }
        return m_CustomConfiguration;
    }
}

When I step through the debugger in code that calls either of the above properties like this:

if (!Program.WCFCache.HasCustomConfig开发者_如何学编程uration)
    return new List<CustomComponents>();

...it throws the following exception:

System.AccessViolationException was unhandled
Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Source="System.Windows.Forms"
...

When I step onto the line containing the reference, there is a long pause, followed by a VS popup with the exception.

The exception doesn't appear when I just put a breakpoint after the above code has executed. It doesn't even appear when I put a breakpoint inside the accessors of the properties. It only occurs when I step onto a line with one of those properties from the outside. (So there is a workaround, but it can be a pain.)

Why is this happening? Can I stop it?

Edit: The whole application was written in the last year in 3.5 C#/.NET with WCF communicating between components; meaning, we don't have legacy unmanaged DLLs. Just two unmanaged calls: one to advapi32.dll when the WinForms app is loading, in the username detection procedure. The issue I'm having happens only in this one place in the code, in a place that is about as unrelated to the login section as you can get. The other is to kernel32.dll, in a GC force-flush long after anything is done with the results from calls like the one above.


Are you using any P/Invoke or other such native code? Odds are, that's where you should start looking.

This exception is a symptom of a larger problem, namely memory corruption (that what the exception says, after all). If this was a native application, you'd get a crash.

So, look at any native calls, make sure they're operating correctly, maybe run them under a debugger to try and trap the error closer to home.

Sorry, can't really give better advice given the circumstances.


I eventually found that others have encountered this situation and that it is likely a Visual Studio bug. I was using VS 2008 when the problem occurred.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号