gpt4 book ai didi

C# 捕获 ThreadPool 上发生的异常

转载 作者:可可西里 更新时间:2023-11-01 09:12:03 25 4
gpt4 key购买 nike

我正在调查我的应用程序中由 Win32 异常引起的一些崩溃,我已经缩小了它必须发生在处理 EventLog.EntryWrittenEventHandler 事件处理程序的线程池中的范围我的应用程序。我是这样设置的:

// Create the event log monitor
eventLog.Log = "Application";
eventLog.EnableRaisingEvents = true;
eventLog.EntryWritten += new EntryWrittenEventHandler(EventLogMonitor);

EventLogMonitor 是我的事件的处理程序。我想知道是否有人知道我在哪里可以找到导致此异常的原因。似乎要监听事件,正在设置 ThreadPoolWaitOrTimerCallback,上面没有我的任何代码,如果发生异常,我就看不到如何处理这个问题。非常感谢任何帮助!!

这是 WinDBG 中 !clrstack 的输出:

0:008> !clrstack
OS Thread Id: 0x106c (8)
ESP EIP
049df1c8 7756f871 [HelperMethodFrame: 049df1c8]
049df26c 73ce6fa0 System.Diagnostics.EventLog.get_OldestEntryNumber()
049df27c 73bf24ed System.Diagnostics.EventLog.CompletionCallback(System.Object)
049df2c4 73bf0fe4 System.Diagnostics.EventLog.StaticCompletionCallback(System.Object, Boolean)
049df2f4 744fc3b8 System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context(System.Object, Boolean)
049df300 744fc373 System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context_f(System.Object)
049df304 7400027f System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
049df31c 744fc477 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)
049df4ac 74991b5c [GCFrame: 049df4ac]

如果有帮助,我的应用程序只是检查写入事件日志的每个条目的事件 ID,如果它与一组特定 ID 中的一个相匹配,那么我会记录它。崩溃很少发生,异常是带有消息“访问被拒绝”的 System.ComponentModel.Win32 异常。这听起来像是一个权限问题,但为什么它在一段时间内可以正常工作,然后突然崩溃。

最佳答案

如果我对你的理解正确(如果你传递了导致你得出异常发生在线程池线程内的结论的堆栈跟踪,这将有所帮助),那么只需将你的 EventLogMonitor 代码包装在 try/catch block 中。

例子:

void EventLogHandler(object sender, EventArgs args)
{
try
{
// Your original code.
}
catch (Exception ex)
{
// Log or Write "ex" to the console. Set a breakpoint, whatever.

throw;
}
}

更新:在您更新之后,看起来异常确实不是从您的处理程序内部引发的,而是在它甚至在 EventLog 类内部被调用之前。

您可以尝试使用 AppDomain.UnhandledException 注册处理程序事件并在那里进行日志记录/处理。请注意,这将不允许您抑制或“更改”或包装异常,而只是为了诊断目的将其记录在某处。

如果您只想检查一次异常(或偶尔),您应该尝试在 WinDBG 中使用 SOS 扩展的 !PrintException 命令。

更新 2:经过进一步调查后,我发现异常冒泡很奇怪。您的堆栈跟踪表明您使用的是 .NET 3.5(或更早版本,但不是 4.)并查看 Reflector 中的 EventLog 类,您可以看到 EventWrittenHandler 的整个处理过程,包括似乎导致异常,被包裹在一个大的“try/catch(Exception)/catch” block 中。有趣。

关于C# 捕获 ThreadPool 上发生的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com