2009-08-28 45 views
5

Tôi có một cửa sổ rất đơn giản Dịch vụ được phát triển trong vb.net 2008. Khi tôi cố gắng gỡ lỗi bằng cách vào công cụ-> Đính kèm vào quá trình mặc dù tôi thấy dịch vụ của tôi bị vô hiệu hóa và Loại Quản lý và tôi không thể chọn quy trình.Không thể đính kèm cửa sổ Quy trình dịch vụ

Làm cách nào để gỡ lỗi dịch vụ của tôi?

Cảm ơn

+0

Tôi đã cập nhật phản hồi dựa trên câu hỏi của bạn. –

Trả lời

10

Việc đính kèm dịch vụ nên hoạt động, vì vậy tôi không chắc chắn lý do tại sao bạn không thể. Thay vào đó, chèn dòng sau vào điểm nhập ứng dụng cho dịch vụ Windows của bạn (hoặc phương thức OnStart()), biên dịch trong chế độ gỡ lỗi và khởi động dịch vụ.

System.Diagnostics.Debugger.Break(); 

Khi khởi động dịch vụ, bạn sẽ được nhắc gỡ lỗi quy trình. Chọn trình gỡ lỗi Visual Studio 2008 và quá trình sẽ tải và dừng lại tại điểm ngắt có lập trình của bạn. Nhấn F5 để bắt đầu chạy lại.

EDIT:

Hãy nói rằng bạn đã xây dựng các dịch vụ (chế độ phát hành hoặc debug mode - nó không quan trọng) và sử dụng installutil để cài đặt các dịch vụ, nhưng bạn chưa bắt đầu nó được nêu ra. Miễn là dịch vụ là không phải đang chạy, bạn có thể tiếp tục thực hiện thay đổi mã và biên dịch lại. Khi bạn bắt đầu dịch vụ, dịch vụ của bạn sẽ phản ánh những thay đổi mã mới nhất của bạn. Nếu dịch vụ đang chạy, bạn sẽ không thể biên dịch hoàn toàn dịch vụ vì (các) tệp exe đang được sử dụng và không thể thay thế được. Rõ ràng, chỉ cần dừng dịch vụ, biên dịch lại và sau đó khởi động lại dịch vụ. Vấn đề là: Bạn không phải gỡ cài đặt dịch vụ để sửa đổi mã. Chỉ cần dừng lại, thay đổi mã, biên dịch lại và bắt đầu lại.

Để gỡ lỗi trong chế độ gỡ lỗi so với chế độ phát hành, tôi không biết nếu đó là lý do bạn không thể đính kèm vào quy trình.Tôi biết rằng có thể gỡ lỗi các phiên bản phát hành, nhưng tôi sẽ không khuyên bạn nên điều này đơn giản chỉ vì nếu tối ưu hóa được bật, bạn có thể gặp sự cố khi duyệt mã. Chúng tôi chỉ sử dụng gỡ lỗi chế độ phát hành như một phương sách cuối cùng.

Theo mặc định, khi bạn xây dựng một ứng dụng Visual Studio trong chế độ gỡ lỗi, nó được đặt trong thư mục con bin \ Debug của dự án của bạn. Khi bạn xây dựng trong chế độ phát hành, tệp thực thi được đặt trong thư mục con bin \ Release. Khi bạn sử dụng installutil để cài đặt dịch vụ của bạn, điều duy nhất quan trọng là nơi dịch vụ cư trú. Trong trường hợp của bạn, tôi khuyên bạn nên bỏ cài đặt phiên bản chế độ phát hành dịch vụ của bạn (installutil /u c:\myapp\myapp\bin\release\myapp.exe), đặt điểm ngắt có lập trình trong, xây dựng phiên bản gỡ lỗi và sau đó sử dụng installutil để cài đặt phiên bản gỡ lỗi (từ thư mục bin \ Debug) .

Rất tiếc, điều này đã có từ lâu. Tôi hy vọng điều đó rõ ràng.

+0

Cảm ơn Matt. Tôi có một câu hỏi. Đây là những gì tôi đã làm. Tôi xây dựng ứng dụng ở chế độ phát hành. đã đi để cài đặt util và cài đặt nó với một cái gì đó như installutil c: \ myapp \ myapp \ bin \ release \ myapp.exe Bạn có nghĩa là tôi nên đã xây dựng nó trong chế độ gỡ lỗi và sau đó sử dụng installutil c: \ myapp \ myapp \ bin \ debug \ myapp.exe và sau đó cố gắng đính kèm vào quá trình này? –

+0

Có, bạn nên xây dựng trong chế độ gỡ lỗi và cài đặt từ thư mục bin \ debug. –

0

Một dịch vụ là gì khác hơn là một ứng dụng giao diện điều khiển, do đó bạn sẽ có thể chạy exe từ dòng lệnh miễn là nó được biên soạn trong chế độ gỡ lỗi. Một khi quá trình đang chạy từ dòng lệnh, bạn sẽ đi đến Debug => đính kèm vào quá trình trong studio trực quan và đính kèm vào exe bạn chỉ cần bắn lên từ dòng lệnh. Bạn cũng có thể chạy trong Visual Studio IDE trực tiếp với F5.

Nếu dịch vụ của bạn đang chạy dưới tài khoản người dùng đặc biệt, bạn sẽ cần sử dụng lệnh runas/user để kích hoạt studio trực quan nếu bạn đang gỡ lỗi trong studio trực quan hoặc từ dòng lệnh nếu bạn đang chạy nó từ lệnh hàng.

Nếu điều này không hoạt động .... hãy cho tôi biết.

Best Regards, Michael

3

Bạn có chắc bạn đang nhìn vào quá trình dịch vụ thực tế của bạn? Kiểm tra tên dịch vụ - nó có giống như servicename.vshost.exe không? Nếu vậy, thì đó không phải là dịch vụ của bạn mà là một quá trình lưu trữ phòng thu trực quan được sử dụng để gỡ lỗi F5 (trong số những thứ khác).

Để gỡ lỗi dịch vụ, hãy chọn hộp kiểm "hiển thị quy trình từ tất cả người dùng". Bạn sẽ thấy quá trình dịch vụ thực tế, servicename.exe, trong danh sách tiến trình. Nếu nó có thể nhìn thấy sau đó chỉ cần đính kèm vào quá trình đó.

+0

Có Tuzo Tôi chỉ thấy servicename.vshost.exe chứ không phải vshost.exe. bạn nghĩ đâu là vấn đề –

+0

Bỏ qua bất kỳ quá trình nào với vshost.exe trong đó vì bạn không thể gỡ lỗi các quy trình đó. Bạn đã kiểm tra "hiển thị quy trình từ tất cả người dùng" chưa? Nếu bạn đã làm bạn sẽ thấy quá trình dịch vụ của bạn như là servicename.exe. Nếu bạn không thấy nó ở đó, thì có thể dịch vụ của bạn chưa được bắt đầu. Hãy thử bắt đầu dịch vụ. –

15

Nếu bạn làm theo hướng dẫn tạo "Dịch vụ Windows cơ bản" trong MSDN, bạn sẽ chạy vào đây. Bạn sẽ thấy MyNewService.vshost.exe trong hộp thoại Đính kèm để xử lý, nhưng nó sẽ bị tắt. Để xem dịch vụ của bạn, bạn phải kiểm tra BOTH "Hiển thị quy trình từ tất cả người dùng" VÀ "Hiển thị quy trình trong tất cả phiên" để xem dịch vụ của bạn. Dịch vụ đang chạy dưới tên người dùng "SYSTEM", nếu bạn làm theo hướng dẫn trong hướng dẫn và các dịch vụ thường chạy trong một phiên khác.

Khi bạn kiểm tra cả hai hộp đó (và bỏ qua MyNewService.vshost.exe), bạn sẽ thấy MyNewService.exe, bạn sẽ có thể chọn và gỡ lỗi.

Tất nhiên, không có gì sẽ xảy ra cho đến khi dịch vụ đạt đến điểm ngắt. Bạn có thể tạo OnPause (như OnContinue), nhưng để có thể tạm dừng dịch vụ của bạn, bạn sẽ cần đặt cờ CanPauseAndContinue trên dịch vụ của bạn (cùng một đối tượng với cờ AutoLog).

Ngoài ra, trong thử nghiệm trên máy 64 bit của tôi, chỉ cần biên dịch lại dự án đã không cho phép gỡ lỗi thành công. Ngay cả khi biên dịch và cài đặt lại không hoạt động. Tôi đã phải biên dịch lại dự án, sau đó biên dịch lại dự án thiết lập và sau đó cài đặt lại thiết lập để có thể gỡ lỗi dịch vụ.

Cuối cùng, Nhật ký sự kiện có thể được xem qua Trình xem sự kiện, trong Công cụ quản trị trong Pa-nen điều khiển. "MyNewLog" nằm trong Nhật ký ứng dụng và dịch vụ, khi được tạo như được mô tả trong hướng dẫn MSDN.

+0

"Khi bạn kiểm tra cả hai hộp đó (và bỏ qua MyNewService.vshost.exe), bạn sẽ thấy MyNewService.exe" - thực sự đã lưu ngày của tôi! – user979189

1

Tôi không chỉ phải chọn các hộp kiểm show processes from all usersshow processes in all sessions; Tôi cũng phải bấm vào nút Select và sau đó chọn mã Managed.

enter image description here

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