我的公司有一个应用程序,它有一些响应性/稳定性/内存问题。我正在尝试编写一个小助手应用程序来帮助我们识别这些问题。我希望这个应用程序能够在命令上生成转储,并进行一些基本的自动化调试,首先,我试图获得目标应用程序中所有线程的所有堆栈跟踪。
所以我已经研究了一周左右,我已经找到了几种添加调试功能的方法。我找到的一些选择是使用ICorDebug、DbgEng.dll和DbgHost.exe。我真的很想使用DbgHost.exe,因为它让我能够将LeakTrack.dll注入到目标进程中,以跟踪内存分配。
我的问题是,我似乎不能让它工作,我在网上找不到任何关于DbgControl和DbgObj这两个对象的真正有用的信息。我找到了以下链接:
How to control a debugger engine?
第一篇文章解释了如何打开转储文件并使用它,第二篇文章解释了如何附加到进程并使用它进行操作。第二种方法是使用一些web自动化软件。第二个正是我想要做的。
到目前为止,这是我的代码,我只添加了重要的代码,其余的代码只是粘合到UI上。
private void OnAttach(uint? targetProcessId)
{
if (targetProcessId == null || targetProcessId.Value == default(uint))
{
return;
}
Process targetProcess = Process.GetProcessById((int)targetProcessId.Value);
if (targetProcess.HasExited)
{
return;
}
DbgControl dbgControl = new DbgControl();
dbgControl.AttachToProcess((int)targetProcessId.Value, @"C:\scripts", @"C:\symcache", null);
try
{
DbgObj dbgObj = new DbgObj();
Debug.WriteLine(dbgObj.ThreadInfo.Count);
foreach (ProcessThread processThread in targetProcess.Threads)
{
IDbgThread dbgThread = dbgObj.GetThreadBySystemID(processThread.Id);
foreach (IDbgStackFrame dbgStackFrame in dbgThread.StackFrames)
{
Debug.WriteLine(dbgStackFrame.InstructionAddress);
}
}
}
finally
{
dbgControl.DetachFromProcess();
}
}
private void OnOpen(string dumpFilePath)
{
if (!File.Exists(dumpFilePath))
{
return;
}
DbgControl dbgControl = new DbgControl();
DbgObj dbgObj = dbgControl.OpenDump(dumpFilePath, @"C:\symcache", @"C:\symcache", null);
Debug.WriteLine(dbgObj.ThreadInfo.Count);
}OnAttach代码成功地附加到进程中,我可以创建一个DbgObj,甚至可以转储线程数,但是当我尝试获取线程对象时,它失败了。我得到了:
The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))当我检查EventVwr.exe时,我得到以下条目:
Faulting application name: Dbghost.exe, version: 1.2.0.52, time stamp: 0x4e164226
Faulting module name: Dbghost.exe, version: 1.2.0.52, time stamp: 0x4e164226
Exception code: 0xc0000005
Fault offset: 0x0001907d
Faulting process id: 0x2300
Faulting application start time: 0x01cdcaa0cdffbb1a
Faulting application path: C:\Program Files\DebugDiag\x86Support\Dbghost.exe
Faulting module path: C:\Program Files\DebugDiag\x86Support\Dbghost.exe
Report Id: 0bb5082a-3694-11e2-a454-d4bed9031bdf因此,DbgHost.exe遇到了访问冲突。我即将放弃这一点,转而使用更常见的方法,但我希望有人能提供一些指导,帮助我克服道路上的颠簸。
发布于 2013-06-18 23:35:53
我发现了同样的问题。我只是理解这个link。我使用带有C#的DebugDiag 1.2进行自动转储。注意,请忽略"test.dmp",当前我不能指定文件名,它也不是我们真正需要的主函数。
这就是我们要找的代码。这是C#的一个示例。
C#代码:
int pid = 1234; //process id that you need to dump
string dumpPath;
dumpPath = @"C:\Programs\test.dmp";
DbgControl dbgControl = new DbgControl();
dbgControl.AttachToProcess(pid, @"C:\Programs\InjectLeakTrack.vbs", @"C:\", dumpPath);
DbgObj dbgObj = new DbgObj();
dbgObj.DumpPath = @"C:\";
dbgObj.CreateDumpForProcessID(pid, "No reason", false, true);
dbgControl.DetachFromProcess();对于InjectLeakTrack.vbs,我们只需要这个。
Sub Debugger_OnInitialBreakpoint()
Debugger.InjectLeakTrack
End Sub我们还使用C#进行自动化分析。C#代码:
DbgControl dbgControl = new DbgControl();
DbgObj g_Debugger = dbgControl.OpenDump(dumpPath, @"c:\symbols", @"c:\symbols", null);
dynamic g_UtilExt = g_Debugger.GetExtensionObject("CrashHangExt", "Utils");
dynamic g_VMInfo = g_Debugger.GetExtensionObject("MemoryExt", "VMInfo");
dynamic g_LeakTrackInfo = g_VMInfo.LeakTrackInfo;
Console.Write(g_LeakTrackInfo.IsLeakTrackLoaded());https://stackoverflow.com/questions/13547015
复制相似问题