2009-09-26 61 views
16

Tôi muốn gỡ lỗi ứng dụng .NET không khởi động ngay lập tức (và tồn tại mà không có thông báo lỗi hoặc nhật ký), nhưng tôi không thể đính kèm trình gỡ rối vào nó vì quá trình này tồn tại gần như ngay sau khi tôi chạy nó. Tôi không có mã nguồn cho ứng dụng, vì vậy tôi không thể thực hiện "Bắt đầu gỡ lỗi". Tôi đã cố gắng sử dụng một Studio vĩ mô trực quan để bắt đầu một quá trình, gắn vào nó, sau đó phá vỡ, nhưng vĩ mô là quá chậm và vào thời điểm mà nó tìm thấy quá trình này, quá trình này đã thoát:Cách đính kèm trình gỡ lỗi khi tạo quy trình?

Imports System 
Imports EnvDTE80 
Imports EnvDTE90 
Imports System.Diagnostics 

Public Module Module1 
    Sub RunAndAttach() 
     Try 
      Dim dbg As Debugger3 = DTE.Debugger 
      Dim trans As Transport = dbg.Transports.Item("Default") 
      Dim sysProc As Process = System.Diagnostics.Process.Start(New ProcessStartInfo("C:\Temp\CrashingApp.exe") With {.WorkingDirectory = "C:\Temp"}) 
      Dim proc As EnvDTE90.Process3 = dbg.GetProcesses(trans, "ALLON-PC").Item("CrashingApp.exe") 
      If (Not sysProc.HasExited) Then 
       proc.Attach() 
       proc.Break(False) 
      Else 
       MsgBox("Process " + proc.Name + " has already has exited.") 
      End If 
     Catch ex As System.Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

End Module 

Có cách để đính kèm trình gỡ rối vào một quy trình mới được tạo ra, như F5 làm gì?

Cảm ơn!

Trả lời

20
  1. Tạo dự án mới (dự án bảng điều khiển là tốt).
  2. Nhấp chuột phải vào dự án và chọn "Thuộc tính".
  3. Nhấp vào tab "Gỡ lỗi".
  4. Chọn "Bắt đầu chương trình bên ngoài:"
  5. Chọn chương trình.
  6. Lượt F5.
+1

Mẹo gọn gàng! Chỉ trong trường hợp của tôi, nhấn F5 sẽ chạy chương trình và sau đó nó sẽ thoát ngay lập tức. Thay vào đó, sử dụng Step Into gây ra trình gỡ lỗi ngắt ở đầu Main(). Cảm ơn! –

1
  1. Bạn có thể sử dụng windbg từ đó bạn có thể bắt đầu quá trình.
  2. Bạn có thể sử dụng reflector để dịch ngược và lấy nguồn và tiếp tục từ đó.

Một ý tưởng khác là sử dụng process monitor để xem quy trình đang cố gắng làm gì. Thất bại có lẽ là do sự phụ thuộc vào một số thứ bên ngoài. Và quá trình giám sát có thể giúp bạn xác định vị trí của nó.

Cập nhật: Bạn có thể sử dụng trình phản xạ FileDisassembler bổ trợ để tạo giải pháp đầy đủ và gỡ lỗi từ đó.

+0

Trình theo dõi quy trình: Đã thử điều đó. Không có thất bại, một số logic bên trong làm cho quyết định bỏ thuốc lá. Ví dụ. ProcMon sẽ không giúp đỡ nếu các ứng dụng lúc khởi động bỏ nếu nó là một thứ bảy. Reflector: ứng dụng P/Invokes vào các DLL không được quản lý, và lưu trữ kết quả trong một biến cục bộ mà tôi không thể xem nội dung của nó do không thể đính kèm một trình gỡ lỗi được quản lý. –

+0

Cũng về phản xạ - nếu tôi muốn tạo lại giải pháp từ các disassemblies, làm thế nào tôi có thể làm cho nó để dịch ngược toàn bộ lắp ráp và lưu tất cả các tập tin nguồn vào đĩa? Hoặc tôi có cần phải sao chép/dán từng lớp và phương pháp theo cách thủ công không? –

+0

Plugin FileDisassembler Reflector khá hữu ích, cảm ơn vì điều đó! Trong khi tôi đang ở trong thư mục plugnis, tôi nhận thấy Deblector, một plugin gỡ lỗi mà không may là không hữu ích, và Reflexil, cho phép bạn tiêm lệnh MSIL.Tôi vừa tiêm một MessageBox.Show ("Attach now.") Như là câu lệnh đầu tiên trong Main(), cung cấp cho bạn nhiều thời gian khi bạn cần đính kèm trình gỡ lỗi (cho đến khi bạn nhấn OK), nhưng tất nhiên phương thức của John là tốt hơn . –

3

Trình gỡ lỗi yêu cầu một số lượng xử lý nhất định xảy ra trước khi có thể đính kèm. Ví dụ trong ASP.Net, thật khó để gỡ lỗi các sự kiện "Application_Start" trên IIS, bởi vì nó quá sớm - ứng dụng phải được bắt đầu trước khi một trình gỡ rối có thể được đính kèm.

Bạn có thể thực thi chương trình của mình trong Windbg và nhận được ngắt ngay lập tức hoặc kết xuất bộ nhớ. Có một great tutorial on setting up windbg here và trong một số nhận xét trên bài đăng có hướng dẫn về cách chạy .exe của bạn từ bên trong windbg và tải ngay lập tức.

+4

Bạn có thể gỡ lỗi Application_Start bằng cách khởi động ứng dụng web từ trong Visual Studio bằng cách đặt nó làm dự án khởi động hoặc bằng cách đặt Debugger.Break() bên trong Application_Start và sau đó đính kèm khi nó chạm vào hộp thoại gỡ lỗi. – adrianbanks

+0

Điểm tốt trên Debugger.Break(). – womp

+0

Cả hai đều không phải là tùy chọn vì tôi không có mã nguồn. Tôi sẽ thử windbg. Tôi có thể sử dụng VS để gỡ lỗi một quá trình mà windbg được gắn vào? Nếu không, làm thế nào có ích là windbg trong gỡ lỗi một hội đồng quản lý (đồng hồ biến địa phương, gọi stack, vv)? –

0

Tôi nghĩ bạn chỉ có thể thực hiện "File \ Open \ Project/Solution", chọn .exe làm "giải pháp" rồi nhấn F5.

+0

Đã thử điều đó. Mở> Dự án/Giải pháp không cho phép bạn mở EXE và Mở> Tệp chỉ hiển thị các tài nguyên bên trong tệp đó, nhưng không cho phép bạn gỡ lỗi. –

+0

Nó hoạt động cho tôi, hm. – Brian

+0

Với phiên bản Visual Studio nào? –

Các vấn đề liên quan