12

私はかなり難しいデバッグの課題に苦労しており、誰かがこれを機能させる方法の手がかりを持っているかもしれないことを望んでいます。

シナリオは次のとおりです。

管理者権限を持つユーザーアカウントで実行され、標準のユーザー権限を持つユーザーアカウントで別の実行可能プロセスを起動するC#Windowsサービスがあります。2つのプロセスは、WCFを使用して通信するように設計されています。

残念ながら、子プロセスが起動されると、すぐにクラッシュし、イベントログには何が起こったかを示すものが何もありません。親プロセスは例外なく実行を継続します。

詳細:これら2つのアプリケーションは、親プロセスがデスクトップアプリケーションである構成で確実に連携します。親もWindowsサービスとして成功しましたが、両方のプロセスが管理者権限を持つ同じユーザーアカウントで実行されている場合に限ります。

子プロセスの特権を制限するためにそれらの関係を再構成する必要がありますが、これはクラッシュが発生したときです。

私がやろうとしていることが実行可能であることを証明するために、2つのスタブアプリケーションを作成し、それらを目的の構成で正常に起動しました。したがって、実際の子アプリには、この構成と互換性がなく、コードの実行が開始される前でもクラッシュを引き起こすものが含まれていると推測できます。残念ながら、子プロセスはかなり複雑なレガシーコードに基づいているため、問題を解決するまでその要素を分離するのは簡単ではありません。そのため、信頼できるステップスルー手段が本当に必要です。

子プロセスのコードを変更して、起動直後にデバッグを開始すると、デバッガーをアタッチするように促されますが、アタッチを完了できず、そのことを示すメッセージが表示されThe Just-in-time debugger does not have permission to debug the processます。

私もこの質問を見て、この提案されたソリューション(これは本当に有望に見えます)を実装しようとしましたが、私のシナリオでは機能しません。アプリケーションを起動する前にデバッグを起動する代わりに、何も実行しないように見えます。デバッガーもアプリケーションも起動されず、デバッグの招待ダイアログは表示されません。ただし、この手法が自分の環境で機能することを確認したので(Notepad.exeを起動するために使用することにより)、問題の原因となっているアプリケーションまたは起動方法に明らかに何かがあります。

誰かが何か提案があれば、私は実験して、私のテスト結果についての詳細を共有することを嬉しく思います。

あなたのアイデアに感謝します、

ティム

4

4 に答える 4

4

デバッガーが子に対して起動しないという事実は、 PARENTサーバー プロセスでエラーが発生しているはずであることを意味します。適切に設定した場合Image File Execution Options(Microsoft の無料の Windows Debugging Tools を使用して GFlags プログラムを使用するのが最も簡単です)、それは子の作成を開始しないことを意味します。これをテストする最も簡単な方法は、子プロセスの作成呼び出しの直前に Assert をコードに追加し、親サービスをデバッグ モードでビルドし、それをサービスとしてインストール/登録し、起動することです。Assert がポップアップしたら、プロセスにアタッチし、そこからデバッグを開始します。次に、親で発生している作成プロセス エラーを確認する必要があります。

親サービスと子プロセスの両方を対話的にデバッグする場合は、WinDbg と GFlags を使用してこれを行うことができますが、複雑になります。

WinDbg と GFlags が必要です。これらのツールは、Debugging Tools for Windows の一部として Microsoft から無償で提供されています。フリー ソフトウェア パッケージは、http: //msdn.microsoft.com/en-us/windows/hardware/gg463009.aspxにあります 。

GFlag を使用して、PARENT SERVICE の実行オプションを次のデバッガー オプションで設定します。

"C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\WinDbg.exe" -server tcp:port=5000:9000 -o -g 

Windows が親サービスを開始すると、WinDbg の下で開始されます。-oオプションにより、WinDbg は起動された子プロセスも管理し、開始から子プロセスをインタラクティブにデバッグできるようにします。-gオプションにより、WinDbg は通常のデバッグ動作のようにロード時に停止するのではなく、ParentService を起動して実行します。これにより、Windows SCM がシャットダウンして新しいインスタンスを開始できなくなります。

サービスを実行しているため、デスクトップにアクセスできず、ホストの WinDbg にもアクセスできません。ParentServiceを実行している WinDbg の実行中のインスタンスに別のデバッガをアタッチする必要があります。別の WinDbg インスタンスを使用してこれを行うことができます。これを行うには、WinDbg の 2 番目のインスタンスを開始し、メニュー項目 [ファイル |リモート セッションに接続...] を使用してリモート接続します。ダイアログで、次のように入力します。

tcp:Port=5000:9000,Server=[マシン名]

接続すると、ParentService.exe を操作できるようになり、ChildProcess が作成されると、実行中のコンテキストがそれにスワップされ、デバッグも可能になります。

この手法を使用して、以前に Windows サービスによって作成された子プロセスをデバッグしました。IDE の Visual Studio の組み込みデバッガーで何かをデバッグするほど簡単ではありませんが、機能します。

WinDbg には、Microsoft とオンラインの他のソースの両方から入手できる広範なドキュメントがあります。上記の URL には、WinDbg ドキュメントへのリンクが含まれています。

GFlags を使用することをお勧めします。選択したデバッガーで実行可能ファイルを実行するためにレジストリに必要なすべての編集が行われるからです。それはまた、はるかに多くのことを行うので、学ぶ価値があります。

ブレークポイントを設定し、WinDbg の開始時にあらゆる種類のオプションを設定することができます。-gオプションをコマンド ライン オプションに置き換えます。

-c "$$<c:\MyDebugCommands.txt"

これは、WinDbg にコマンドを実行するように指示します。コマンドは、"MyDebugCommands.txt" という名前の WinDbg スクリプトを実行することです。MyDebugCommands.txt ファイルに、必要なすべての設定変更 (シンボルの読み込みオプションなど) を入力し、関心のあるブレークポイントを設定します。ファイルの最後のコマンドは-gです。

前述したように、VS IDE とその組み込みデバッガーを使用するだけでは簡単ではありませんが、親サービスとその起動された子プロセスを対話的にデバッグできます。

于 2012-12-04T19:16:27.750 に答える
2

上記のシナリオに基づく私のテスト(親プロセスは管理者権限のあるサービス、子は管理者権限のないコンソール)によると、子プロセスに許可例外をスローするように人為的に強制すると、同じデバッグエラーが表示されます。開始します。この場合のエラーメッセージは、これが実際にデバッガーのアクセス許可の問題であるかどうかが明確でないため、誤解を招く可能性があります。

子プロセスがどのタイプのアプリケーションであるかを知っておくと、使用しているデバッグオプションに影響するため便利です。

これをデバッグしようとした最初の方法は、子プロセス(コンソールアプリ)で未処理の例外をすべてインターセプトすることです。これを行うには、子アプリの起動手順に次のコードを追加します。

AppDomain.CurrentDomain.UnhandledException += new 
    UnhandledExceptionEventHandler(App_UnhandledException);

次に、 App_UnhandledExceptionプロシージャにコードを追加して、例外をログに記録しました。これは私にとってはうまくいきました、そして私は許可エラーの理由を見ることができました。唯一の注意点は、権限の問題が原因でアプリが読み込まれないという例外をインターセプトしないことです。ただし、このアプローチでは、許可の問題を理解する上で、少なくとも検索スペースを減らす必要があります。

例外ハンドラに到達する前に例外が生成された場合、別の可能性として、アセンブリバインディングログビューアを使用することができます。これは非常に便利なツールです。

FWIWでは、Visual Studio内でサービスを開始することにより、サービスコードをステップスルーできます(ただし、残念ながら子プロセスには入りません)。以下に示すDEBUGというswitchケースのコードを使用すると、VS内でサービスを開始/デバッグできます。

// This is the entry point
static void Main(string[] args)
{
    // If parameter passed, act on it
    if ( args.Length > 0 )
    {
        switch (args[0] )
        {
            // Debug the service as a normal app from within Visual Studio
            case DEBUG:
                MyService DebugService = new MyService();
                DebugService.OnStart(null);
                break;
            // Install the service programatically
            case INSTALL:
                ManagedInstallerClass.InstallHelper(new string[] _
                { Assembly.GetExecutingAssembly().Location });
                break;
            // Un-install the service programatically
            case UNINSTALL:
                ManagedInstallerClass.InstallHelper(new string[] +
                { UNINSTALL, Assembly.GetExecutingAssembly().Location });
                break;
            // We don't understand this parameter!
            default:
                message = string.Concat(DEBUG, " to run service manually.",     Environment.NewLine);
                message += string.Concat(INSTALL, " to install service.",     Environment.NewLine);
                message += string.Concat(UNINSTALL, " to un-install service.",     Environment.NewLine);
                message += string.Concat("Do not understand the command-line parameter ", args[0]);
                throw new System.NotImplementedException(message);
        }
    }
    // If no parameter passed, just start the service normally
    else
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MyService() };
        ServiceBase.Run(ServicesToRun);
    }
}
于 2012-11-30T11:37:49.523 に答える
2

Visual Studio を管理者として実行し、Process.EnterDebugMode()メソッドを呼び出してみましたか?

于 2012-12-05T08:09:49.060 に答える
1

起動時にすぐにデバッグを開始するように子プロセスのコードを変更すると、デバッガーをアタッチするように求められますが、アタッチメントを完了できず、ジャストインタイム デバッガーにデバッグのアクセス許可がないことを示すメッセージが表示されます。プロセス

管理者として secpol.msc を実行し、[ローカル ポリシー] の下で実行します。ユーザー権利管理] で [プログラムのデバッグ] を選択します。次に、「ユーザー」グループをそれに追加します。これで権限の問題が解決するかどうかを確認してください。

HTH

于 2012-12-11T04:49:25.330 に答える