2014-03-19 2 views
1

내 응용 프로그램에서 WinDbg가 시작되고 특정 명령을 WinDbg (예 : callstack을 표시하기 위해 k) 응용 프로그램에서 보내는 것과 같은 방법이 있는지 궁금합니다.C#을 사용하여 원격으로 WinDbg에 명령 보내기

나는이 도움을 줄 수 기능이 USER32.DLL의 일부를 사용 주위에 읽었지만 내가 진행하는 방법의 불분명 오전 내 응용 프로그램에 포함.

어떤 도움을 크게 감상 할 수있다.

스티브

+0

-

는 를 참조합니다. 이 차이점은 powershell이 ​​명령을 전송하지만 C#으로 포팅 할 수 있다는 것입니다. http://blogs.msdn.com/b/debuggingtoolbox/archive/2011/02/28에서 "PowerDhell v6.0 - PowerShell을 사용하여 WinDbg 제어" /powershell-script-powerdbg-v6-0-using-powershell-to-control-windbg.aspx –

답변

0

키 입력을 보낼 필요가 없습니다. 보다 안정적인 방법이 있습니다. .ocommand에 대한 WinDbg 도움말을 참조하십시오. 그것은 Debug.WriteLine() (Debug 빌드) 또는 Trace.WriteLine() (Release 빌드) 인 OutputDebugString을 통해 명령을 전송하여 .NET에서 작동합니다.

windbg.exe -p <PID> -c ".ocommand <Magic>;g" 

이러한 접근 방식은 빠른 어떤 더러운 방법 : 당신은 또한 스스로 디버거를 시작으로

, 당신은 아마 바로 당신이 -c 명령 줄 스위치를 추가 할 수있는 시작시 .ocommand을 실행합니다. @ joshpoley의 대답은 장기간 안정적인 솔루션을 원한다면 더 깨끗한 방법입니다.

.NET의 경우 기본 호출 스택 k이 원하는 것일 수 없습니다. SOS 확장자의 !clrstack 또는 !dumpstack을 시도하십시오 (.NET 버전에 따라 .loadby sos clr 또는 .loadby sos mscorwks을 사용하여로드 할 수 있음).

+0

'! clrstack'이 가장 먼저 선택해야한다는 것에 동의하지만, 여전히 기본값을 사용하고 싶은 시나리오가 많이 있습니다 스택 명령어 IMO. –

+0

@BrianRasmussen : 물론 P/Invoke 또는 COM을 사용하는 경우에 맞습니다. 나는 그 말씨를 바꿨다. –

4

디버그 엔진을 완전히 제어하려는 경우 노출 된 COM 인터페이스를 사용하여 C# 응용 프로그램 내에서 호스트를 호스팅해야합니다.

WinDbg 설치 디렉토리 (예 : C : \ Program Files (x86) \ Windows Kits \ 8.1 \ Debuggers \ x64 \ sdk \ samples)에서 디버그 엔진을 자동화하는 샘플 코드를 찾을 수 있습니다. 이 blog 게시물은 API (C로)를 사용하여 스택 추적을 얻는 방법을 보여주기 때문에 k 명령을 발행 한 후에 출력을 구문 분석 할 필요가 없습니다.

가장 어려운 부분은 모든 노출 된 개체에 대해 C#의 모든 IDebug * [ComImport] 인터페이스를 찾고/만드는 것입니다. 당신이 관리 목표를 다루고있는 경우는 (앞서 언급 한 바와 같이) 관리 스택을 얻을 SOS 확장을로드도 가능하다

internal static class WinDbgBase 
{ 
    // STDAPI DebugCreate(__in REFIID InterfaceId, __out PVOID* Interface); 
    [DllImport("dbgeng.dll", EntryPoint = "DebugCreate", CallingConvention = CallingConvention.StdCall)] 
    public static extern int DebugCreate([In] ref System.Guid InterfaceId, ref System.IntPtr Interface); 
} 

Guid uuidof_IDebugClient4 = new Guid("{ca83c3de-5089-4cf8-93c8-d892387f2a5e}"); 
IntPtr pObj = IntPtr.Zero; 
int hr = WinDbgBase.DebugCreate(ref uuidof_IDebugClient4, ref pObj); 
IDebugClient4 _client = (IDebugClient4)Marshal.GetTypedObjectForIUnknown(pObj, typeof(IDebugClient4)); 

// QueryInterface the other objects 
IDebugControl4 _control = (IDebugControl4)_client; 

_client.AttachProcess(0, ProcessId, DEBUG_ATTACH.DEBUG_ATTACH_DEFAULT); 
_control.WaitForEvent(DEBUG_WAIT.DEBUG_WAIT_DEFAULT, Win32.INFINITE); 
... 

과 : 당신이 그들을 일단, 당신은 같은 것을 할 것 네이티브 스택 트레이스와 병합하면 모든 네이티브 투 피어 관리 트랜지션으로 전체 스택을 표시 할 수 있습니다. 이것은 당신이 원하는 거의 무엇 Listing of all Debugger COM objects