7

「w3wp.exe」プロセスでホストされているアプリケーションを実行しています。

デバッグ中に、次の手順に従っていることに気付くことがよくあります。

1 - 変更を加える

2 - プロジェクトをビルドする

3 - [ツール] メニューの [プロセスにアタッチ] ダイアログを使用して、「w3wp.exe」にアタッチします。

4 - アプリケーションで何らかのアクションを実行してコードを実行し、デバッガーでステップ実行できるようにする

ビルド後のスクリプトのステップ 3 を自動化して、ビルドの完了後に IDE がプロセスに自動的にアタッチされるようにしたいと考えています。ビルド後のプロセスの一部として既にアプリケーションを起動しているので、この時点で存在するプロセスを当てにできることに注意してください。

「プロセスにアタッチ」コマンドを自動化する方法を知っている人はいますか? コマンド ラインからの何かが特に優れていますが、マクロも同様です。

Windows 7、64 ビットで Visual Studio 2008 を使用しています。

編集 @InSane は基本的に正しい答えをくれましたが、ネイティブ コードではなくマネージ コードをデバッグする必要があるため、うまくいきません。vsjitdebugger はデフォルトでネイティブ コードになっているようで、ブレークポイントにヒットしません。IDE 内から「マネージド コード」を指定すると、デバッガーが期待どおりにアタッチされます。では、vsjitdebugger をマネージ コードに向ける方法はありますか?

4

4 に答える 4

7

インターネット上の他の場所で見つけた例を使用して、最終的にこの問題を解決することができました。これは私にとって役に立ったので、ここで共有します。

1 - 以下のコードで新しいコマンド ライン アプリケーションを作成します (この例は VB.NET にあります)。

Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading

Module modMain
    Function AttachToProcess(ByVal processName As String, _
                             ByVal Timeout As Integer) As Boolean
        Dim proc As EnvDTE.Process
        Dim attached As Boolean
        Dim DTE2 As EnvDTE80.DTE2

        Try
            DTE2 = _
            System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0")

            For Each proc In DTE2.Debugger.LocalProcesses
                If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
                    proc.Attach()
                    System.Threading.Thread.Sleep(Timeout)
                    attached = True
                End If
            Next
        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try

        Return attached
    End Function

    Sub Main()
        'to call w/ Command Line arguments follow this syntax
        'AttachProcess <<ProcessName>> <<TimeOut>>
        'AttachProcess app.exe 2000
        Dim AppName As String = "w3wp.exe"
        Dim TimeOut As Integer = 20000 '20 Seconds
        Try
            If Environment.GetCommandLineArgs().Length > 1 Then
                AppName = Environment.GetCommandLineArgs(1)
            End If

            If Environment.GetCommandLineArgs().Length > 2 Then
                If IsNumeric(Environment.GetCommandLineArgs(2)) Then
                    TimeOut = Environment.GetCommandLineArgs(2)
                End If
            End If
            Environment.GetCommandLineArgs()
            AttachToProcess(AppName, TimeOut)
            Console.WriteLine("Attached!!")

        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try
    End Sub
End Module

2 - Visual Studio でデバッグするソリューションを開きます

3 - 「ビルド後」イベントの最後に、次のように、この新しいユーティリティへの呼び出しを入力します。

c:\AutoAttach.exe w3wp.exe 20000

4 - アプリケーションをビルドする

于 2010-12-21T18:40:51.160 に答える
2

Windows コマンド ラインから次のコマンドを試すことができます。

期待どおりに機能する場合は、ビルド後の手順の一部として配置できます。

ProcessID は、アタッチ先として起動したプロセスの ID です。

vsjitdebugger.exe -p ProcessId 

コマンドラインからこれを使用するためのその他のオプションは次のとおりです。 代替テキスト

于 2010-10-05T04:44:32.623 に答える
0

これがジョセフの改良版です。私はこれを追加しました: -dont show console (プロジェクトの「アプリケーション」の出力タイプを「Windows アプリケーション」に設定します。) - タイムアウト コマンド ライン引数を 0 に設定します (なぜそれが必要なのですか?) - 3 番目のコマンド ラインを追加しました。 arg url は、firefox で起動されますが、サイトがプログラム内で最初に内部的にロードされた後に限ります。これは、一部のサイト、特に dotnetnuke では、コンパイル後の読み込みに時間がかかるためです。したがって、この方法では、すべてのテストの準備が整った後にのみ、Firefox がフォアグラウンド Firefox ブラウザーに移動します。私のコンピューターでは最大 1 分かかります。その間に別の作業を行うことができます。PS。このスタック オーバーフロー エディターは少しばかげています。それが、このテキストがきれいにフォーマットされていない理由です。以下のリスト速報コードを追加すると、コードとして表示されません。

Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Net

Module modMain
    Function AttachToProcess(ByVal processName As String, _
                             ByVal Timeout As Integer) As Boolean
        Dim proc As EnvDTE.Process
        Dim attached As Boolean
        Dim DTE2 As EnvDTE80.DTE2

        Try
            DTE2 = _
            System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0")

            For Each proc In DTE2.Debugger.LocalProcesses
                If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
                    proc.Attach()
                    System.Threading.Thread.Sleep(Timeout)
                    attached = True
                    Exit For
                End If
            Next
        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try

        Return attached
    End Function

    Sub Main()
        'to call w/ Command Line arguments follow this syntax
        'AttachProcess <<ProcessName>> <<TimeOut>>
        'AttachProcess app.exe 2000
        Dim AppName As String = "w3wp.exe"
        Dim TimeOut As Integer = 20000 '20 Seconds
        Dim Url As String = "http://www.dnndev.me/"
        Try
            If Environment.GetCommandLineArgs().Length > 1 Then
                AppName = Environment.GetCommandLineArgs(1)
            End If

            If Environment.GetCommandLineArgs().Length > 2 Then
                If IsNumeric(Environment.GetCommandLineArgs(2)) Then
                    TimeOut = Environment.GetCommandLineArgs(2)
                End If
            End If

            If Environment.GetCommandLineArgs().Length > 3 Then
                Url = Environment.GetCommandLineArgs(3)
            End If

            Environment.GetCommandLineArgs()
            AttachToProcess(AppName, TimeOut)
            'Console.WriteLine("Attached!!")

            'load site for faster opening later
            Using client = New WebClient()
                Dim contents = client.DownloadString(Url)
            End Using

            'open site in firefox
            Dim ExternalProcess As New System.Diagnostics.Process()
            ExternalProcess.StartInfo.FileName = "c:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"
            ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
            ExternalProcess.StartInfo.Arguments = "-url " & Url
            ExternalProcess.Start()
            'ExternalProcess.WaitForExit()

        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try
    End Sub
End Module
于 2015-01-23T12:05:54.487 に答える