我不知道如何调试这个.我有一个完全由托管代码组成的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任务列表:
其他说明: …
我有一个简短的异步任务,它经常需要在启动后取消."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#程序中有一个句柄泄漏.我正在尝试使用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)