2009-04-17 1 views
5

Tôi có dịch vụ cửa sổ có hẹn giờ. Rất khó để gỡ lỗi nó. Bởi vì tôi bắt đầu dịch vụ và đặt điểm ngắt trong các phần khác nhau của mã. Khi tôi đính kèm quá trình, tôi hy vọng dịch vụ sẽ bắt đầu ngay từ đầu thay vì một số nơi rườm rà ở đoạn giữa, nơi tôi có điểm ngắt. Khó gỡ lỗi của nó như một ứng dụng bình thường nơi bạn biết điểm xuất phát. Dường như có các quy trình ở mặt sau chưa hoàn thành. Vì vậy, mỗi lần duy nhất, tôi bắt đầu gỡ lỗi, thay vì bắt đầu từ điểm phá vỡ đầu tiên, nó bắt đầu từ một số điểm ngắt ngẫu nhiên ở giữa ứng dụng.Làm cách nào để gỡ lỗi dịch vụ cửa sổ bằng các điểm ngắt?

Tôi muốn biết cách dịch vụ Windows hoạt động theo các quy trình, chủ đề, v.v ... và làm cách nào tôi có thể bắt đầu gỡ lỗi ngay từ đầu?

+0

Thách thức thực sự của tôi là ngăn dịch vụ nhảy xung quanh? Có chủ đề mà tôi không biết? –

Trả lời

0

đơn giản nhất cách tiếp cận ...

Đặt kinh doanh - phần chức năng của mã dịch vụ trong một lớp học riêng biệt, trong một hội thư viện riêng ... Sau đó, bạn có thể gỡ lỗi nó independantly sử dụng một ứng dụng giao diện điều khiển đơn giản ...

+0

đây là một ứng dụng sản xuất và tôi không thể thay đổi mã nguồn vào lúc này. –

9

Tôi cho rằng bạn đang nói về .Net tất nhiên. Tôi đã luôn sử dụng mã sau để gỡ lỗi các dịch vụ của mình. Tôi đặt nó vào nơi tôi muốn trình gỡ lỗi khởi chạy. Khởi động dịch vụ và nó sẽ tự động khởi chạy Visual Studio. Hoạt động tốt cho tôi.

System.Diagnostics.Debugger.Launch();

System.Diagnostics.Debugger.Debug();

+0

Cảm ơn phản hồi. Có, tôi đang nói về .net và tôi sẽ google hướng dẫn của bạn thiết lập để xem làm thế nào điều này sẽ làm việc. –

+0

Bạn có thể sử dụng mã này để gỡ lỗi. Nhưng đừng quên xóa nó sau khi bạn đã hoàn tất. Tất nhiên, bạn cần phải biên dịch lại dịch vụ sau khi bạn thực hiện bất kỳ thay đổi nào. –

+0

Tôi luôn sử dụng System.Diagnostics.Debugger.Debug() ;, tôi đặt một khóa boolean trong tập tin cấu hình "IsDebugging". Vì vậy, tôi bật hoặc tắt trình gỡ lỗi bất kỳ lúc nào – Costa

2

Chỉ cần nhấn F5. Bạn có thể chạy Windows Services thường xuyên giống như các ứng dụng.

Vì chúng tôi không có đối số dòng lệnh khác, chúng tôi chỉ sử dụng đối số bất kỳ đối số dòng lệnh nào làm tín hiệu để chạy dưới dạng ứng dụng cửa sổ thông thường. Bạn cũng có thể yêu cầu sự hiện diện của một đối số dòng lệnh cụ thể (tức là/debug).

If sArgs IsNot Nothing AndAlso sArgs.Length > 0 Then 
    ' If there are command-line args then run in non-service mode 
    Dim svc As ServiceMain = New ServiceMain(True) 
    svc.OnStart(Nothing) 
    System.Windows.Forms.Application.Run() 
    svc.OnStop() 
Else 
    ' If no command-line args then run normally 
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase 
    ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceMain(False)} 
    System.ServiceProcess.ServiceBase.Run(ServicesToRun) 
End If 
0

Nó không thuận tiện như điểm ngắt trong trình gỡ rối nhưng tôi thấy việc ghi đầu ra vào một tệp nhật ký đơn giản sẽ giúp. Chúng tôi có các dịch vụ sinh ra các luồng để thực hiện công việc và viết ra một tệp nhật ký đã giúp xác định các vấn đề.

1

Bạn có thể sử dụng "Image File Execution Options" và định cấu hình mỗi khi dịch vụ bắt đầu nó sẽ bắt đầu bên trong trình gỡ lỗi.
Trình gỡ lỗi đó có thể là WinDBG hoặc Visual Studio.