Сегодня я расскажу вам о девайсе, предназначенном для подключения IDE и SATA ...
Продолжаю цикл переводов понравившейся мне статьи автора 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
}
}
Все, на этом статья заканчивается.
Кеш стандартный.
Мод - бесконечные деньги и золото.
Кеш стандартный.
С момента первого обзора среды (этот обзор был опубликован более чем год назад) IDE Brackets превратилась из просто многообещающего прототипа во вполне полноценный инструмент для разработки web-приложений. Недавно также был опубликован пост, в котором вскользь упоминалась эта среда, но сам текст и комментарии были так скупы на описание проекта, что я посчитал полезным рассказать сообществу о возможностях этой IDE более подробно.
Немного информации о том, что из себя представляет IDE Brackets. Среда разрабатывается на web-платформе (HTML, CSS и JavaScript) для web-программистов с использованием Chromium Embedded Framework (CEF) компанией Adobe. В основе Brackets лежат такие проекты, как CodeMirror, jQuery, require.js, Bootstrap, Node.js. Исходные коды распространяются под open source лицензией MIT. Основная цель проекта — упрощение процесса web-разработки. Работа над IDE идёт по методологии scrum (спринтами по 2.5 недели). Среда вполне стабильна — сами разработчики IDE Brackets стали использовать её в своей повседневной работе уже достаточно давно. Скачать среду можно отсюда.
Основные моменты: среда стала доступна для Linux, появилась поддержка Node.js, реализовано интеллектуальное автодополнение кода для HTML, CSS, JavaScript, сообщество создало более сотни полезных плагинов, плюс в разработке находится продвинутая система для упрощения создания макетов с отзывчивым дизайном, которая уже успела произвести WOW-эффект на тех, кто её видел.
(под катом скриншоты ~1.5Mb)
Читать дальше →
Наконец то нашел время описать старый метод обогащения в играх фермах. Это не баг - это фитча.