Лайфхаки, они же полезные советы, они же маленькие хитрости, которые помогут содержать дом в чистоте ... 
										
										
										 ... стандартный подход к 
 вещей. Их  ...  | Метки: 
										
Продолжаю цикл переводов понравившейся мне статьи автора James Dingle про исключения. 
Первый пост посвященный этой статье находится здесь.
 9. Сохраняйте дампы 
Функция Win32 API MiniDumpWriteDump() позволяет вам сохранить дамп и продолжить выполнение приложения.
Это очень удобный шаблон для улучшения разрешения проблем, в дополнение к логам.
Это очевидно довольно дорогой процесс. 
Так что использовать его нужно, довольно редко. 
Но обычно результаты оказываются очень ценными.
Здесь написано как сделать это на Си:
http://blogs.msdn.com/b/joshpoley/archive/2008/05/19/prolific-usage-of-minidumpwritedump-automating-crash-dump-analysis-part-0.aspx
.
Дальше будет пример на C#.  
Вы также можете найти много примеров в интернете.
Как только дамп сгенерирован и сохранен. 
Вы просто открываете его в Visual Studio.
И имеете доступные исходные коды (возможно имелось ввиду, что для разбора они нужны).
Важно чтобы вы вызывали этот метод внутри вашего блока catch.
Сделав так вы получите исключение встроенное (сохраненное) в дампе.
И указатель текущей инструкции будет установлен на строке с ошибкой.
А не на строке, в которой дамп был создан.
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
namespace Sample
{
  ///  /// Creates a mini dump of the current process /// 
  internal static class MiniDump
  {
    public static void CreateDump(string path, MiniDumpType miniDumpType)
    {
      var exceptionInfo = new MiniDumpExceptionInfo
        {
        ThreadId = GetCurrentThreadId(),
        ExceptionPointers = Marshal.GetExceptionPointers(),
        ClientPointers = false // false because own process
        };
      Process process = Process.GetCurrentProcess();
      using (var stream = new FileStream(path, FileMode.Create))
      {
        Debug.Assert(stream.SafeFileHandle != null);
        // The problem Marshal.GetExceptionPointers can return null on x86 machines due to differences
        // in low-level exception handling.
        // Then passing a MiniDumpExceptionInfo structure with a NULL ExceptionPointers members causes an
        // access violation. So we only pass this structure if we got a valid ExceptionPointers member.
        // It will probably result that x86 machines will see the instruction pointer to the MiniDumpWriteDump
        // line and not the exception itself.
        IntPtr exceptionInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(exceptionInfo));
        Marshal.StructureToPtr(exceptionInfo, exceptionInfoPtr, false);
        try
        {
          MiniDumpWriteDump(
          process.Handle,
          process.Id,
          stream.SafeFileHandle.DangerousGetHandle(),
          miniDumpType,
          exceptionInfo.ExceptionPointers == IntPtr.Zero ? IntPtr.Zero : exceptionInfoPtr,
          IntPtr.Zero,
          IntPtr.Zero);
        }
        catch (Exception exception)
        {
          Trace("Cannot generate the mini-dump because of exception " + exception);
        }
        Marshal.FreeHGlobal(exceptionInfoPtr);
      }
    }
    [DllImport("kernel32.dll")]
    private static extern int GetCurrentThreadId();
    [DllImport("DbgHelp.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    private static extern Boolean MiniDumpWriteDump(
      IntPtr hProcess,
      Int32 processId,
      IntPtr fileHandle,
      MiniDumpType dumpType,
      IntPtr excepInfo,
      IntPtr userInfo,
      IntPtr extInfo);
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    private struct MiniDumpExceptionInfo
    {
      public Int32 ThreadId;
      public IntPtr ExceptionPointers;
      [MarshalAs(UnmanagedType.Bool)]
      public bool ClientPointers;
    }
  }
  [Flags]
  internal enum MiniDumpType
  {
    Normal = 0x00000000,
    WithDataSegs = 0x00000001,
    WithFullMemory = 0x00000002,
    WithHandleData = 0x00000004,
    FilterMemory = 0x00000008,
    ScanMemory = 0x00000010,
    WithUnloadedModules = 0x00000020,
    WithIndirectlyReferencedMemory = 0x00000040,
    FilterModulePaths = 0x00000080,
    WithProcessThreadData = 0x00000100,
    WithPrivateReadWriteMemory = 0x00000200,
    WithoutOptionalData = 0x00000400,
    WithFullMemoryInfo = 0x00000800,
    WithThreadInfo = 0x00001000,
    WithCodeSegs = 0x00002000,
    WithoutAuxiliaryState = 0x00004000,
    WithFullAuxiliaryState = 0x00008000
  }
}
Все, на этом статья заканчивается.
										 
										
										
										
Наружная реклама и системы Digital Signage, спортивные объекты и площадки для проведения различных мероприятий – области  применения LCD дисплеев высокого разрешения сегодня расширяются.  Но на какие факторы необходимо обратить внимание при выборе атмосферостойких LCD панелей. Как оправдать инвестиции и обеспечить правильное функционирование и необходимую защиту устройства? Для принятия решения вам надо дать ответы на такие основные вопросы:
- Определите, в каких условиях будет работать дисплей
 
- Определите место размещения дисплея и условия его эксплуатации
 
- Факторы, которые могут повлиять на эксплуатационные характеристики
 
- Варианты исполнения и комплектация
 
- Техническое обслуживание
 
- Гарантия и техническая поддержка
 
Подробнее >>>
										
 
										
										
										Передача Жить здорово выпуск от 19.08.2013. Смотреть онлайн бесплатно последний выпуск за сегодня  ...