所以我在OSX上的Mono 3.12.0中运行了一个控制台应用程序。偶尔,我的意思是,也许每100次或更多次执行CleanupPriorToApplicationStart()
,我得到下面的堆栈跟踪,调用清理方法的父线程就会死掉;基本上Process.Start必须包装本机代码,而本机代码会引发异常,至少我认为发生了什么。这个过程保持不变,所以它不是一个完整的退出(),这使得很难知道这种情况何时发生并纠正它。清理方法的日志消息中的异常处理程序永远不会出现在那里,因此无论出于何种原因,单声道运行时都不会在.NET / Mono异常中包装此本机异常,因此可以对其进行处理。这是预期的吗?有没有办法在没有我的线程被取出的情况下捕获这种行为?
protected override void CleanupPriorToApplicationStart()
{
try
{
ResetAppleMailDefaultWindowSize();
}
catch (Exception ex)
{
logger.Warning(ex, "{ApplicationName} Default Window Size reset FAILED with message", ApplicationName);
}
}
private void ResetAppleMailDefaultWindowSize()
{
logger.Debug("{0} resetting Default Window Size", ApplicationName);
var info = new ProcessStartInfo("defaults", " write com.apple.mail 'NSWindow Frame Torn Off Window' '13 630 1024 768 0 0 2560 1417'");
var p = new Process {StartInfo = info};
p.Start();
p.WaitForExit(6.Seconds());
logger.Debug("{0} Default Window Size reset", ApplicationName);
}
以下是控制台的输出
DEBUG - "Mail" resetting Default Window Size
Stacktrace:
at <unknown> <0xffffffff>
at (wrapper managed-to-native) System.Diagnostics.Process.Process_free_internal (System.Diagnostics.Process,intptr) <0xffffffff>
at System.Diagnostics.Process.Dispose (bool) <0x0013f>
at System.Diagnostics.Process.Finalize () <0x00018>
at (wrapper runtime-invoke) object.runtime_invoke_virtual_void__this__ (object,intptr,intptr,intptr) <0xffffffff>
Native stacktrace:
更新:
由于一些谷歌搜索,我想强调一下,在调用Cleanup方法之前,我明确地调用了垃圾收集GC.Collect();
答案 0 :(得分:1)
对我来说看起来像个错误。我在FreeBSD 10.1上运行mono 3.12.1_1也有同样的问题。当GC在错误的时间发生时,你会再次被咬。
我升级到mono 4.0.1.28并且无法重现我的问题。 它也可以解决你的问题。
Stacktrace:
at <unknown> <0xffffffff>
at (wrapper managed-to-native) System.Diagnostics.Process.Process_free_internal (System.Diagnostics.Process,intptr) <0xffffffff>
at System.Diagnostics.Process.Dispose (bool) <0x00199>
at System.ComponentModel.Component.Dispose () <0x00018>
...
at (wrapper dynamic-method) object.lambda_method (System.Runtime.CompilerServices.Closure,object,object) <0x00082>
at ServiceStack.Host.ServiceRunner`1.Execute (ServiceStack.Web.IRequest,object,TRequest) <0x00450>
at ServiceStack.Host.ServiceRunner`1.Process (ServiceStack.Web.IRequest,object,object) <0x000cc>
at ServiceStack.Host.ServiceExec`1.Execute (ServiceStack.Web.IRequest,object,object,string) <0x0012a>
at ServiceStack.Host.ServiceRequestExec`2.Execute (ServiceStack.Web.IRequest,object,object) <0x00076>
at ServiceStack.Host.ServiceController/<>c__DisplayClass11/<>c__DisplayClass13.<RegisterServiceExecutor>b__10 (ServiceStack.Web.IRequest,object) <0x00040>
at ServiceStack.Host.ServiceController.ManagedServiceExec (ServiceStack.Host.ServiceExecFn,ServiceStack.IService,ServiceStack.Web.IRequest,object) <0x001c3>
at ServiceStack.Host.ServiceController/<>c__DisplayClass11.<RegisterServiceExecutor>b__f (ServiceStack.Web.IRequest,object) <0x0023a>
at ServiceStack.Host.ServiceController.Execute (object,ServiceStack.Web.IRequest) <0x000e2>
at ServiceStack.HostContext.ExecuteService (object,ServiceStack.Web.IRequest) <0x00076>
at ServiceStack.Host.Handlers.ServiceStackHandlerBase.ExecuteService (object,ServiceStack.Web.IRequest) <0x00019>
at ServiceStack.Host.RestHandler.GetResponse (ServiceStack.Web.IRequest,object) <0x00091>
at ServiceStack.Host.RestHandler.ProcessRequestAsync (ServiceStack.Web.IRequest,ServiceStack.Web.IResponse,string) <0x00729>
at ServiceStack.AppHostHttpListenerBase.ProcessRequestAsync (System.Net.HttpListenerContext) <0x0030c>
at ServiceStack.Host.HttpListener.HttpListenerBase.InitTask (System.Net.HttpListenerContext) <0x0008f>
at ServiceStack.AppSelfHostBase/<>c__DisplayClass2.<ListenerCallback>b__1 () <0x0001e>
at Amib.Threading.Internal.WorkItemsGroupBase/<>c__DisplayClass1.<QueueWorkItem>b__0 (object) <0x00019>
at Amib.Threading.Internal.WorkItem.ExecuteWorkItem () <0x00115>
at Amib.Threading.Internal.WorkItem.Execute () <0x00065>
at Amib.Threading.SmartThreadPool.ExecuteWorkItem (Amib.Threading.Internal.WorkItem) <0x000af>
at Amib.Threading.SmartThreadPool.ProcessQueuedItems () <0x006aa>
at System.Threading.Thread.StartInternal () <0x0007e>
at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) <0xffffffff>
...
=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================
答案 1 :(得分:0)
事实证明,垃圾收集绝对是罪魁祸首。在我启动GC之前,我已将CleanupPriorToApplicationStart()
调用移至此处,并且不再看到这些零星错误。