小编Mik*_*ike的帖子

代码中的访问冲突不是我的

我不知道如何调试这个.我有一个完全由托管代码组成的C#程序,在.NET 4.5中运行.运行一段时间后,在一些看似随机的时间,我得到一个错误"mscorlib.dll中发生了'System.AccessViolationException'类型未处理的异常".因为我是从Visual Studio(2012)运行的,所以我点击"break"并显示以下调用堆栈:

mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes    
[Native to Managed Transition]  
ntdll.dll!_NtRequestWaitReplyPort@12()  + 0xc bytes 
kernel32.dll!_ConsoleClientCallServer@16()  + 0x4f bytes    
kernel32.dll!_GetConsoleLangId@4()  + 0x2b bytes    
kernel32.dll!_SetTEBLangID@0()  + 0xf bytes 
KernelBase.dll!_GetModuleHandleForUnicodeString@4()  + 0x22 bytes   
mdnsNSP.dll!7177aa48()  
[Frames below may be incorrect and/or missing, no symbols loaded for mdnsNSP.dll]   
mdnsNSP.dll!71775b06()  
mdnsNSP.dll!71774ded()  
mdnsNSP.dll!71774e8c()  
bcryptprimitives.dll!746d1159()     
bcryptprimitives.dll!746d1137()     
ntdll.dll!_LdrpCallInitRoutine@16()  + 0x14 bytes   
ntdll.dll!_NtTestAlert@0()  + 0xc bytes 
ntdll.dll!_NtContinue@8()  + 0xc bytes  
ntdll.dll!_LdrInitializeThunk@8()  + 0x1a bytes 
Run Code Online (Sandbox Code Playgroud)

我注意到一个有趣的事情是调用堆栈中没有任何东西是我的代码.

你会建议我用什么策略来找到问题的路线?或者你有没有看到类似的问题并有任何提示?

由于异常似乎不包括我的代码,我不知道要包含什么信息有助于回答问题,但问我是否还有其他任何我应该包括的内容.

由于错误可能与IO相关(因为PerformIOCompletionCallback位于堆栈顶部),因此这是此应用程序执行的典型IO任务列表:

  • TcpListener.AcceptTcpClientAsync
  • NetworkStream.Write /的BeginRead/EndRead
  • SqlCommand.BeginExecuteReader/EndExecuteReader
  • StreamWriter.WriteLine

其他说明: …

.net c# access-violation

23
推荐指数
1
解决办法
6757
查看次数

C#async CTP - 如何在不抛出TaskCanceledException的情况下将异步任务标记为已取消?

我有一个简短的异步任务,它经常需要在启动后取消."Task"类有一个IsCanceled指示器,我认为可以方便地指示异步任务在没有运行完成的情况下被取消,但据我所知,将异步任务标记为已取消的唯一方法是在异步函数中抛出TaskCanceledException.例行地抛出异常,以指示无异常发生的情况,违背了我应该如何理解应该使用的异常.是否有人知道更好的方法来指示异常任务在预计经常发生时被取消?

我的下一个最好的选择是返回一个拥有它自己的IsCanceled属性的结构:

(为了简洁,我忽略了一些好的编码和样式实践)

class MightBeCanceled<T>
{
    public readonly T Value;
    public readonly bool IsCanceled;

    public MightBeCanceled(T value) { Value = value; IsCanceled = false; }
    public static MightBeCanceled<T> Canceled = new MightBeCanceled<T>(default(T), true);
    private MightBeCanceled(T value, bool isCanceled) { Value = value; IsCanceled = isCanceled; }
}

...

static async Task<MightBeCanceled<int>> Foo()
{
    if (someCancellationCondition)
        return MightBeCanceled<int>.Canceled;
    else
        return new MightBeCanceled<int>(42);
}

static async void Bar() 
{
    var mightBeCanceled = await Foo();

    if (mightBeCanceled.IsCanceled)
        ; // Take canceled action
    else …
Run Code Online (Sandbox Code Playgroud)

c# cancellation async-ctp

6
推荐指数
1
解决办法
923
查看次数

无法在WinDbg中显示C#堆栈跟踪

我在C#程序中有一个句柄泄漏.我正在尝试使用WinDbg使用!htrace进行诊断,大致如此答案中所示,但是当我运行!在WinDbg中运行htrace -diff时,我看到的堆栈跟踪没有显示我的C#函数的名称(或者甚至我的.net组装).

我创建了一个小测试程序来说明我的难度.除"泄漏"手柄外,该程序不执行任何操作.

class Program
{
    static List<Semaphore> handles = new List<Semaphore>();

    static void Main(string[] args)
    {
        while (true)
        {
            Fun1();
            Thread.Sleep(100);
        }
    }

    static void Fun1()
    {
        handles.Add(new Semaphore(0, 10));            
    }
}
Run Code Online (Sandbox Code Playgroud)

我编译了程序集,然后在WinDbg中我去"File" - >"Open Executable"并选择我的程序(D:\ Projects\Sandpit\bin\Debug\Sandpit.exe).我继续执行程序,打破它,然后运行"!htrace -enable",然后再继续一段时间,然后打破并运行"!htrace -diff".这就是我得到的:

0:004> !htrace -enable
Handle tracing enabled.
Handle tracing information snapshot successfully taken.
0:004> g
(1bd4.1c80): Break instruction exception - code 80000003 (first chance)
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77b2f17d esi=00000000 edi=00000000
eip=77ac410c esp=0403fc20 ebp=0403fc4c iopl=0         nv up ei pl zr …
Run Code Online (Sandbox Code Playgroud)

c# windbg stack-trace handle-leak

6
推荐指数
1
解决办法
2998
查看次数