“附加到进程”作为构建后事件

时间:2010-10-05 04:33:38

标签: visual-studio-2008 automation post-build

我有一个在“w3wp.exe”进程下运行的应用程序。

调试时,我经常发现自己遵循以下步骤:

1 - 做出一些改变

2 - 建立项目

3 - 使用“工具”菜单下的“附加到进程”对话框附加到“w3wp.exe”。

4 - 在应用程序中执行一些操作以使我的代码执行,因此我可以在调试器中逐步执行它

我想在后期构建脚本中自动执行第3步,以便IDE在构建完成后自动附加到进程。请注意,我已经将应用程序作为构建后过程的一部分启动,因此我可以指望此时存在的过程。

有没有人知道自动化“附加到进程”命令的方法?命令行中的某些内容会特别好,但宏也会这样做。

我在Windows 7,64位下使用Visual Studio 2008。

修改 @InSane基本上给了我正确的答案,但它不起作用,因为我需要调试托管代码,而不是本机代码。看来vsjitdebugger默认使用Native代码,因此我的断点没有被击中。在IDE内部,我可以指定“托管代码”,调试器按预期方式附加。那么有没有办法将vsjitdebugger指向托管代码?

4 个答案:

答案 0 :(得分: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 - 构建应用程序

答案 1 :(得分:2)

您可以从Windows命令行尝试以下命令。

如果它按预期工作,您可以将其作为构建后步骤的一部分。

ProcessID是您要启动的要附加的流程的ID。

vsjitdebugger.exe -p ProcessId 

从命令行使用此命令的其他选项包括: - alt text

答案 2 :(得分:1)

这是一个受@ JosephStyons的回答启发的PowerShell功能。适用于任何VS版本而无需更改。

struct Section {
    var name : String
    var objects : [String]
}

答案 3 :(得分:0)

这是Joseph的改进版本。我补充说: -dont show console(在&#34中设置项目;应用程序&#34;输出类型为&#34; Windows应用程序&#34;。) - 我将超时命令行参数设置为0(为什么需要它?) - 添加了第三个命令行arg url,它是用firefox启动的,但只有在站点首次在程序内部加载之后才会启动。这是因为有些网站,尤其是dotnetnuke,在编译后需要很长时间才能加载。因此,只有在所有内容都准备好测试后,firefox才会将您带入前台firefox浏览器,在我的计算机上最多需要1分钟。你可以在同一时间做其他事情。 PS。这个stackoverflow编辑器有点蠢。这就是为什么这个文本格式不漂亮。如果我添加下面的列表公告代码并不显示为代码。

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