2011-05-04 81 views
17

我有一個System.Diagnostics.Process對象。我的C#程序正在監視它的某些情況。當條件被擊中時,我想要進程的完整內存轉儲。使用C進行內存轉儲#

達到此目的的最佳方法是什麼?

有沒有辦法可以通過CLR

+0

*全*內存轉儲?如在「整個地址空間」? – Jon 2011-05-04 08:21:55

回答

11

您可以使用ProcDump from Sysinternals並讓您的C#程序在需要時調用它。

Process.Start("procdump " + otherProgramPID.ToString()); 
1

您可以嘗試從C#代碼中調用C++方法。這裏是你如何把它聲明的例子:

[DllImport("dbghelp.dll", 
     EntryPoint = "MiniDumpWriteDump", 
     CallingConvention = CallingConvention.StdCall, 
     CharSet = CharSet.Unicode, 
     ExactSpelling = true, 
     SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool MiniDumpWriteDump(
     IntPtr hProcess, 
     uint processId, 
     SafeHandle hFile, 
     MINIDUMP_TYPE dumpType, 
     IntPtr expParam, 
     IntPtr userStreamParam, 
     IntPtr callbackParam); 

您可以檢查出這個項目的代碼爲例: https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Infrastructure/MiniDumpNativeMethods.cs https://github.com/projectkudu/kudu/blob/2db563be679bb60656050ec3f04945086f07b360/Kudu.Core/Infrastructure/ProcessExtensions.cs