6

Tôi thường phát triển các ứng dụng web và một lượng lớn thời gian làm việc đáng kinh ngạc của tôi được dành cho "Ctrl + Alt + P", sắp xếp theo Tên quy trình và chọn w3wp.exe để đính kèm trình gỡ lỗi của tôi.Làm cách nào để tôi có thể tạo Visual Studio Macro để đính kèm trình gỡ lỗi vào tất cả các phiên bản của w3wp.exe?

Để làm cho vấn đề tồi tệ hơn, tôi đang làm việc trên một ứng dụng mở rộng một số hồ bơi ứng dụng, vì vậy tôi thường có 2 hoặc 3 phiên bản w3wp.exe và không thể biết nên đính kèm cái nào, vì vậy tôi thường kết thúc up gắn liền với tất cả chúng, đó là quá mức cần thiết nhưng hoạt động.

Tất cả trong tất cả, đây là khá khó chịu ...

Đồng nghiệp của tôi đã tìm ra một cách để có một VS Macro để tự động gắn vào W3Wp.Exe (ông về cơ bản ghi này):

Sub AttachMacro()  
    Try  
    Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger  
    Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")  
    Dim dbgeng(3) As EnvDTE80.Engine  
    dbgeng(0) = trans.Engines.Item("T-SQL")  
    dbgeng(1) = trans.Engines.Item("T-SQL")  
    dbgeng(2) = trans.Engines.Item("Managed")  
    Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "ENIAC").Item("w3wp.exe")  
    proc2.Attach2(dbgeng)  
    Catch ex As System.Exception  
    MsgBox(ex.Message)  
    End Try  
End Sub 

Tôi không thực sự chắc chắn cho dù tất cả những gì là cần thiết, hoặc bất cứ điều gì, tôi chưa bao giờ thực hiện một vĩ mô cho VS, tôi không thực sự biết bắt đầu từ đâu.

Nên có một cách để sửa đổi macro này để thay vì gắn bản thân để một thể hiện của w3wp.exe, nó sẽ đính kèm bản thân để tất cả các trường hợp của w3wp.exe?

+0

tính năng này thực sự phải là một phần của Visual Studio. bất kỳ ai muốn tạo sự cố Kết nối - hoặc kiểm tra sự cố hiện có? –

Trả lời

8
Sub MacroAttachToAllProcesses() 

    Try 

     Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 
     Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 
     Dim dbgeng(3) As EnvDTE80.Engine 

     dbgeng(0) = trans.Engines.Item("T-SQL") 
     dbgeng(1) = trans.Engines.Item("T-SQL") 
     dbgeng(2) = trans.Engines.Item("Managed") 

     For Each theProcess As EnvDTE80.Process2 In dbg2.GetProcesses(trans, "COMPUTERNAME") 
      If theProcess.Name.Contains("w3wp.exe") Then 
       theProcess.Attach2(dbgeng) 
      End If 

     Next 

    Catch ex As System.Exception 
     MsgBox(ex.Message) 
    End Try 

End Sub 
+0

Mang nó hơn nữa và gán nó vào thanh công cụ ... cuộn xuống dưới cùng của bài đăng này: http://www.milkcarton.com/blog/2007/05/20/Using+Visual+Studio+Macros+To+Increase+Productivity.aspx –

+0

Dường như url của blog này đã thay đổi nên suy nghĩ rất đáng giá cập nhật để bạn không phải tìm nó như tôi. http://www.milkcarton.com/blog/default,month,2007-05.aspx – Cragly

+2

Sử dụng 'System.Environment.MachineName' thay vì ComputerName – Jeremy

0

Bạn có thể muốn xem gflags.exe. Một trong các tùy chọn của nó là một trình gỡ lỗi để chạy kèm theo mọi lời gọi của một tệp thực thi cụ thể.

+0

Tôi không thực sự chắc chắn rằng nó sẽ làm việc ... Điều đó sẽ làm gì? Mở một trường hợp mới của Visual Studio mỗi khi w3wp.exe chạy? Tôi cần một số quy trình w3wp.exe được đính kèm với cùng một cá thể VS và tôi cần nó là trường hợp mà tôi đã tải dự án của mình ... –

1

Tôi biết rằng bạn đang tìm kiếm Macro cho tác vụ này và tôi có macro tương tự. Tuy nhiên tôi muốn giải thích một cách để đính kèm trình gỡ lỗi cho các dự án trong giải pháp của bạn khi bạn bắt đầu gỡ lỗi.

Đó là một tính năng ít được biết đến - nếu bạn nhấp chuột phải vào tệp giải pháp của mình trong trình duyệt giải pháp, Chọn thuộc tính, sau đó bạn có thể xác định nhiều dự án khởi động và hành động của chúng. Trình gỡ lỗi của bạn sẽ đính kèm vào các dự án được liệt kê khi bạn chạy nó.

Lưu ý: Nếu bạn có dịch vụ web, cửa sổ trình duyệt sẽ mở cửa sổ trình duyệt, tuy nhiên bạn có thể tắt tính năng đó trong thuộc tính của dự án bằng cách yêu cầu không mở cửa sổ.

1

Đây là cách tôi đính kèm với quy trình w3wp từ xa. Nó chạy nhanh hơn một chút so với giải pháp của DanC và có một số xử lý lỗi bổ sung.

Private Sub AttachToW3wp(ByVal machineName As String) 
    ' In order for this to work, you have to be running the Visual Studio 2010 Remote Debugging Monitor 
    ' as your (domain) user. 
    ' It won't work if the remote debugger is running as a service. I've tried every permutation of 
    ' domain and username in the the transport qualifier, tried the obvious local system username, 
    ' even tried looking at the network traffic 
    ' in WireShark, I can't figure it out how to make it work if you are running as a service. 
    ' If you are running the debugger as a service, even running the macro that gets created by VS's 
    ' macro recorder when you attach to a process doesn't work. 
    Dim transportQualifier = machineName 
    Try 
     Dim processToAttachTo As String = "w3wp.exe" 
     Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 
     Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 
     Dim dbgeng(2) As EnvDTE80.Engine 
     dbgeng(0) = trans.Engines.Item("T-SQL") 
     dbgeng(1) = trans.Engines.Item("Managed (v2.0, v1.1, v1.0)") 
     Dim processesRemote = dbg2.GetProcesses(trans, transportQualifier) 
     Dim attached As Boolean = False 
     Dim processRemote As EnvDTE80.Process2 
     For Each processRemote In processesRemote 
      ' For some reason it takes a much longer time to get the remote process names then it 
      ' does the user name, so let's skip over all the processes that have the wrong UserName. 
      If processRemote.UserName = "NETWORK SERVICE" AndAlso _ 
       (Right(processRemote.Name, Len(processToAttachTo)) = processToAttachTo) Then 
       If processRemote.IsBeingDebugged Then 
        MsgBox(processToAttachTo & " on " & machineName & " is already being debugged") 
       Else 
        processRemote.Attach2(dbgeng) 
       End If 
       attached = True 
      End If 
     Next 
     If Not attached Then 
      MsgBox(processToAttachTo & " is not running on " & machineName & ".") 
     End If 
    Catch ex As System.Exception 
     MsgBox("Exception attempting to attach to " & transportQualifier & ": " & ex.Message) 
    End Try 
End Sub