تولید MiniDump در حین کرش برنامههای دات نت
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۱۱/۱۶ ۸:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
[Flags]
public enum MiniDumpType
{
MiniDumpNormal = 0x00000000,
MiniDumpWithDataSegs = 0x00000001,
MiniDumpWithFullMemory = 0x00000002,
MiniDumpWithHandleData = 0x00000004,
MiniDumpFilterMemory = 0x00000008,
MiniDumpScanMemory = 0x00000010,
MiniDumpWithUnloadedModules = 0x00000020,
MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
MiniDumpFilterModulePaths = 0x00000080,
MiniDumpWithProcessThreadData = 0x00000100,
MiniDumpWithPrivateReadWriteMemory = 0x00000200,
MiniDumpWithoutOptionalData = 0x00000400,
MiniDumpWithFullMemoryInfo = 0x00000800,
MiniDumpWithThreadInfo = 0x00001000,
MiniDumpWithCodeSegs = 0x00002000,
MiniDumpWithoutManagedState = 0x00004000
} public static class NativeMethods
{
[DllImport("Dbghelp.dll")]
public static extern bool MiniDumpWriteDump(
IntPtr hProcess,
int processId,
IntPtr hFile,
MiniDumpType dumpType,
IntPtr exceptionParam,
IntPtr userStreamParam,
IntPtr callbackParam);
} public static class DebugInfo
{
public static void CreateMiniDump(
string dumpFileName, MiniDumpType dumpType = MiniDumpType.MiniDumpNormal)
{
using (var stream = File.Create(dumpFileName))
{
var process = Process.GetCurrentProcess();
// It is safe to call DangerousGetHandle() here because the process is already crashing.
NativeMethods.MiniDumpWriteDump(
process.Handle,
process.Id,
stream.SafeFileHandle.DangerousGetHandle(),
dumpType,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero);
}
}
public static void CreateMiniDump(MiniDumpType dumpType = MiniDumpType.MiniDumpNormal)
{
const string dateFormat = "yyyy-MM-dd-HH-mm-ss-fffZ"; // Example: 2010-09-02-09-50-43-341Z
var thisAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly();
var dumpFileName = string.Format(@"{0}-MiniDump-{1}.dmp",
thisAssembly.GetName().Name,
DateTime.UtcNow.ToString(dateFormat, CultureInfo.InvariantCulture));
var path = Path.Combine(getApplicationPath(), dumpFileName);
CreateMiniDump(path, dumpType);
}
private static string getApplicationPath()
{
return HttpContext.Current != null ?
HttpRuntime.AppDomainAppPath :
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}
} class Program
{
static void Main(string[] args)
{
try
{
var zero = 0;
Console.WriteLine(1 / zero);
}
catch (Exception ex)
{
Console.Write(ex);
DebugInfo.CreateMiniDump(dumpType:
MiniDumpType.MiniDumpNormal |
MiniDumpType.MiniDumpWithPrivateReadWriteMemory |
MiniDumpType.MiniDumpWithDataSegs |
MiniDumpType.MiniDumpWithHandleData |
MiniDumpType.MiniDumpWithFullMemoryInfo |
MiniDumpType.MiniDumpWithThreadInfo |
MiniDumpType.MiniDumpWithUnloadedModules);
throw;
}
}
}