Marshal.GetExceptionPointers и WPF-овский DispatcherUnhandledException

172
16 сентября 2017, 22:03

Доброго времени суток. Есть WPF-приложение + дампер(MiniDumpWriteDump). Нужно при возникновении UnhandledException в приложении создавать minidump и затем ложить приложение.

App.xaml.cs:

protected override void OnStartup(StartupEventArgs e)
    {
      base.OnStartup(e);
      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
      Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
    }
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  var pointers = Marshal.GetExceptionPointers(); //тут все ок :)
  var thread = GetCurrentWin32ThreadId();
  handleAppException(e.ExceptionObject as Exception, thread, pointers);
}
private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
  var pointers = Marshal.GetExceptionPointers(); //тут IntPtr.Zero :(
  var thread = GetCurrentWin32ThreadId();
  handleAppException(e.Exception as Exception, thread, pointers);
}
private void handleAppException(int threadId, IntPtr pointers)
{
  System.Threading.Tasks.Task.Factory.StartNew(() =>
  {
    MiniDump.CreateMiniDump("C:\\Users\\Public\\Documents\\dump.dmp", threadId, pointers);
  }).Wait();
}

Если в программе возникает ошибка связанная с другим потоком, например:

  Thread t = new Thread(() =>
  {
    throw new Exception("Thread exception!");
  });
  t.Start();

то выполняется CurrentDomain_UnhandledException и Marshal.GetExceptionPointers(); корректно возвращает указатель. А если ошибка возникает в UI thread-е, например:

throw new Exception("UI thread");

то выполняется Current_DispatcherUnhandledException и GetExceptionPointers возвращает IntPtr.Zero.

Вопрос: Как мне получить ExceptionPointers при ошибке в UI?

Answer 1

Нашел решение:

использовать Current.Dispatcher.UnhandledExceptionFilter вместо Current.DispatcherUnhandledException.

READ ALSO
Быстрое преобразование ID3D11Texture2D в management Bitmap

Быстрое преобразование ID3D11Texture2D в management Bitmap

Использую данный код: http://wwwcleoag

157
Вывести на экран числа [требует правки]

Вывести на экран числа [требует правки]

При помощи цикла вывести числа след образом

288
Как привязать DataContext к UserControl?

Как привязать DataContext к UserControl?

В данный момент идёт ознакомление с MVVM-паттерномКак правильно привязать DataContext к UserControl?

203