1

私の会社には、応答性/安定性/メモリの問題があるアプリケーションがあります。これらの問題を特定するのに役立つ小さなヘルパー アプリケーションを作成しようとしています。このアプリケーションがコマンドでダンプを生成し、基本的な自動デバッグを実行できるようにしたいと考えています。まず、ターゲット アプリケーションのすべてのスレッドのすべてのスタック トレースを取得しようとしています。

だから私はこれを1週間ほど研究してきました.デバッグを行う機能を追加するいくつかの方法を見つけました. 私が見つけたいくつかのオプションは、ICorDebug、DbgEng.dll、および DbgHost.exe を使用することでした。LeakTrack.dll をターゲット プロセスに挿入してメモリ割り当てを追跡できるので、DbgHost.exe を使用したいと思います。

私の問題は、DbgControl と DbgObj の 2 つのオブジェクトに関して、Web 上で適切な情報を見つけることができないことです。次のリンクを見つけました。

デバッガエンジンを制御するには?

スクリプティング DbgHostLib

最初の記事では、ダンプ ファイルを開いて処理を行う方法について説明し、2 つ目の記事では、プロセスにアタッチして処理を行う方法について説明します。2 つ目は、Web 自動化ソフトウェアを使用することです。2番目はまさに私がやりたいことです。

これまでのコードは次のとおりです。重要なコードのみを追加しています。残りのコードは、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);
    }

したがって、OnOpen は機能しますが、OnAttach は機能しません。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 でアクセス違反が発生しています。私はこれをあきらめて、より一般的な方法に移ろうとしていますが、誰かがこの道のりを乗り越えるのに役立つガイダンスを持っていることを願っています.

4

1 に答える 1