I wrote a WPF application that uses many Frame controls to view camera channels. When deployed, it crashes quite randomly (from 2 hours to 16 hours), and I see them in the event log, sequentially:
System.AccessViolationException: Attempted to read or write protected Memory. This often indicates that another memory is corrupt. in MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) with System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame frame) with System.Windows.Threading.Dispatcher.PushFrame (DispatcherFrame frame) with System.Windows.Threading.Dispatcher. Run () in System.Windows.Application.RunDispatcher (Object to ignore) when System.Windows.Application.RunInternal (Window window) in System.Windows.Application.Run (Window window) in System.Windows.Application.Run () at Status_Station_client.MainClass.Main ()
Malfunction of the application status station client.exe, version 1.0.0.0, stamp 4ad0faa5, faulty module msvfw32.dll, version 5.1.2600.2180, stamp 41109753, debug? 0, error address 0x00002642.
Any ideas on how to track this? Web pages contain ActiveX controls, so you can first assume that there is a problem.
I was unable to trace this in debug mode. Another thing I thought of is swallowing an exception from a navigation call, but I'm not sure if this is reasonable:
try { if (Frame1 != null) Frame1.Source = new Uri(uriWithResolution); } catch (AccessViolationException ex) {
EDIT: Here are some more source codes, I'm at a dead end, where is the error (i.e. where the exception is thrown)
MatrixView.cs:
public partial class MatrixView : Window { System.Timers.Timer timer; int pageNumber = 0; IEnumerable<List<CameraInfo>> _cameraList; GlobalSettings _globalSettings; Screen _screen; public MatrixView(List<CameraInfo> cameras, int pageFlipInterval, int camerasPerPage, GlobalSettings globalSettings, Screen screen) { InitializeComponent(); _globalSettings = globalSettings; _screen = screen; _cameraList = Partition<CameraInfo>(cameras, camerasPerPage); this.Dispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException); displayCameras(); timer = new System.Timers.Timer(pageFlipInterval * 1000); // interval (in seconds) * 1000 ms / s timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; this.KeyUp += new System.Windows.Input.KeyEventHandler(MatrixView_KeyUp); if (globalSettings.FullScreenOnLoad) { this.WindowStyle = WindowStyle.None; } } void MatrixView_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) { if (this.WindowStyle == WindowStyle.None) { if (e.Key == Key.F11 || e.Key == Key.Escape) { this.WindowStyle = WindowStyle.SingleBorderWindow; } } else { if (e.Key == Key.F11) { this.WindowStyle = WindowStyle.None; } } this.WindowState = WindowState.Maximized; } void timer_Elapsed(object sender, ElapsedEventArgs e) { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new ThreadStart(delegate() { displayCameras(); })); } void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { EventLog.WriteEntry("Matrix Monitor", string.Format("Unhandled exception from Matrix Dispatcher\r\nMessage: {0}\r\nSource: {1}\r\nInnerException: {2}\r\nStack Trace: {3}\r\nFull String: {4}", e.Exception.Message, e.Exception.Source, e.Exception.InnerException, e.Exception.StackTrace, e.Exception.ToString())); e.Handled = true; } private void displayCameras() { foreach (var child in uniformGrid1.Children) { FrameTimer c = child as FrameTimer; if (c != null) { c.Dispose(); c = null; } } GC.Collect(); GC.WaitForPendingFinalizers(); uniformGrid1.Children.Clear(); List<CameraInfo> camerasInPage = _cameraList.ElementAt(pageNumber); int numCameras = camerasInPage.Count; int sqrtOfCameras = (int) Math.Sqrt(numCameras); double height = _screen.Bounds.Height / sqrtOfCameras; double width = _screen.Bounds.Width / sqrtOfCameras; foreach (CameraInfo camera in camerasInPage) { uniformGrid1.Children.Add(new FrameTimer(camera, _globalSettings, height, width)); } pageNumber++; if (pageNumber >= _cameraList.Count<List<CameraInfo>>()) { pageNumber = 0; } } public static IEnumerable<List<T>> Partition<T>(IList<T> source, int size) { int remainder = source.Count % size == 0 ? 0 : 1; for (int i = 0; i < (source.Count / size) + remainder; i++) yield return new List<T>(source.Skip(size * i).Take(size)); } }
FrameTimer.cs:
public partial class FrameTimer : UserControl, IDisposable { System.Timers.Timer timer; string _uri; string _noImageUrl; bool? _successState = null; GlobalSettings _globalSettings; CameraInfo _camera; Ping ping; double _height; double _width; public FrameTimer(CameraInfo camera, GlobalSettings globalSettings, double height, double width) { InitializeComponent(); _noImageUrl = AppDomain.CurrentDomain.BaseDirectory + "noImage.jpg"; _globalSettings = globalSettings; _camera = camera; _height = height; _width = width; _uri = string.Format("http://{0}:{1}/LiveView.aspx?camera={2}", globalSettings.ServerIPAddress, globalSettings.ServerPort, camera.camName); this.Dispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException); setUrl(); timer = new System.Timers.Timer(_globalSettings.PingInterval * 1000); timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; } void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { EventLog.WriteEntry("Matrix Monitor", string.Format("Unhandled exception from Frame Dispatcher\r\nMessage: {0}\r\nSource: {1}\r\nInnerException: {2}\r\nStack Trace: {3}\r\nFull String: {4}", e.Exception.Message, e.Exception.Source, e.Exception.InnerException, e.Exception.StackTrace, e.Exception.ToString())); e.Handled = true; } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { this.Dispatcher.BeginInvoke(DispatcherPriority.Send, new ThreadStart(delegate() { setUrl(); })); } private void setUrl() { ping = new Ping(); ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); videoChecks checks = new videoChecks(); string ipAddressToUse = checks.isIPInternal(_camera.camIP) ? _camera.camIP : _camera.camExtIP; ping.SendAsync(ipAddressToUse, 1000, null); } void ping_PingCompleted(object sender, PingCompletedEventArgs e) { try { if (e.Reply.Status == IPStatus.Success) { if (_successState == null || _successState == false) { _successState = true; string uriWithResolution = string.Format("{0}&res={1}x{2}&header=0", _uri, (int)_width, (int)_height); if (Frame1 != null) Frame1.Source = new Uri(uriWithResolution); } } else { if (_successState == null || _successState == true) { _successState = false; Image1.Source = new BitmapImage(new Uri(_noImageUrl)); } } } catch (ObjectDisposedException ex) { Dispose(); } finally { ((IDisposable)sender).Dispose(); } } #region IDisposable Members public void Dispose() { if (timer != null) { timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = false; timer.Dispose(); timer = null; } Frame1.Source = null; if (ping != null) { ping.PingCompleted -= new PingCompletedEventHandler(ping_PingCompleted); ((IDisposable)ping).Dispose(); ping = null; } } #endregion }