我有一个用C#.Net 4.5编写的控制台应用程序,在Linux上运行Mono 3.2.8(Ubuntu 14.04 LTS)。
控制台应用程序作为upstart服务启动,我使用log4net v2.0.5和控制台appender记录输出。
Upstart重定向/ var / log / upstart / {appname} .log
中的所有输出随机地,几个小时到几天之后,应用程序挂起,我在日志中看不到任何内容。
我所知道的:
我使用命令strace查看最后的系统调用,这就是我得到的:
$ strace -p 5602
附加过程5602
民意调查([{fd = 6,events = POLLIN},{fd = 8,events = POLLIN}],2,-1)=? ERESTART_RESTARTBLOCK(信号中断)
--- SIGPWR {si_signo = SIGPWR,si_code = SI_TKILL,si_pid = 5602,si_uid = 1001} ---
rt_sigprocmask(SIG_BLOCK,[XCPU],NULL,8)= 0
futex(0x26b18c,FUTEX_WAKE_PRIVATE,1)= 1
rt_sigsuspend(〜[XCPU RTMIN RT_1])=? ERESTARTNOHAND(如果没有处理程序,则重新启动)
--- SIGXCPU {si_signo = SIGXCPU,si_code = SI_TKILL,si_pid = 5602,si_uid = 1001} ---
rt_sigreturn()= -1 EINTR(系统调用中断)
rt_sigprocmask(SIG_UNBLOCK,[XCPU],NULL,8)= 0
futex(0x26b18c,FUTEX_WAKE_PRIVATE,1)= 1
rt_sigreturn()= -1 EINTR(系统调用中断)
2个文件描述符6和8是管道:
$ file / proc / 5602 / fd / 6
/ proc / 5602 / fd / 6:破坏管道的符号链接:[6562495]'
$ file / proc / 5602 / fd / 8
/ proc / 5602 / fd / 8:破坏管道的符号链接:[6562496]'
我不明白问题的根本原因,我不知道该尝试修复它。
修改
根据@sushihangover的建议,我使用--debug选项在终端中运行了应用程序。最终应用程序再次被绞死。没有例外,没有错误。
代码从MJPEG流中获取帧,并在后台工作器上执行一些工作以检测帧中的对象。
只有在后台工作人员不忙时才会进行工作。我得到的最后一个日志跟踪是:
[后台工作人员]无事可做
我怀疑该应用程序在尝试从相机获取下一帧时挂起。我正在使用AForge.NET来读取MJPEG流。每当新画面到达时,AForge都会举起一个事件。
以下是一些代码:
private static void Camera_NewFrame(object sender, NewImageEventArgs e)
{
var bmp = (Bitmap)e.Frame;
log.DebugFormat("got image " + DateTime.Now.Ticks + " {0} x {1}", bmp.Width, bmp.Height);
if (!bWorker.IsBusy)
{
// Run the background operation to check image and update cloud
log.Debug("Starting background work");
bWorker.RunWorkerAsync();
}
else { } // skip frame
}
private static void BWorker_DoWork(object sender, DoWorkEventArgs e)
{
log.Debug("[Background worker] enter");
if (registeredCar)
{
log.Debug("[Background worker] opening the gate");
OpenGate();
}
else
{
log.Debug("[Background worker] nothing to do");
}
}
由gdb附加到挂起进程的回溯:
(gdb)bt
poll中的0 0xb6e19fc0在../ sysdeps / unix / syscall-template.S:81
来自/usr/lib/libMonoPosixHelper.so的Mono_Unix_UnixSignal_WaitAny()中的1 0xb4b264be
2 0xb4b6f740在? ()