Làm cách nào để đính kèm Visual Studio vào một quy trình chưa bắt đầu?


89

Tôi có chương trình .NET không thể chạy từ Visual Studio vì một số lý do (tệp Excel được tạo từ dự án mẫu Excel 2010) mà tôi cần gỡ lỗi các sự kiện khởi động.

Nếu tôi muốn gỡ lỗi các sự kiện xảy ra sau khi khởi chạy chương trình thì không có vấn đề gì. Tôi chạy chương trình từ trình thám hiểm, đính kèm quy trình vào Visual Studio và thêm một số điểm ngắt trong mã. Nhưng ở đây, tôi cần đặt các điểm ngắt vào các sự kiện khởi động. Tôi cần có thể đính kèm các quy trình vào Visual Studio, không phụ thuộc vào PID, mà là vào một tên quy trình cụ thể hoặc bất kỳ giải pháp nào khác sẽ hoạt động.

Tất nhiên, thêm một Thread.Sleep(1000)trong các sự kiện khởi động của tôi để cho tôi một khoảng thời gian để đính kèm quy trình trong Visual Studio là điều không thể tránh khỏi!

Câu trả lời:


97

Trên thực tế bạn có thể; bạn không gắn vào nó, bạn bắt đầu nó. Trên các thuộc tính của dự án của bạn, trên tab Gỡ lỗi, hãy chỉ định đường dẫn của chương trình bạn muốn đính kèm trong hộp văn bản "Lệnh".

Bạn cũng có thể nhập bất kỳ đối số dòng lệnh nào cho chương trình trong hộp "Đối số Lệnh":

nhập mô tả hình ảnh ở đây

Đảm bảo rằng "Đính kèm" được đặt thành "Không".


6
Giải pháp tốt, nhưng chỉ cần lưu ý rằng nhấn F5 không hoạt động trong trường hợp này. Thay vào đó, hãy nhấp chuột phải vào dự án liên quan và nhấp vào 'Gỡ lỗi> Bắt đầu phiên bản mới' từ menu ngữ cảnh.
Herman Cordes

1
Để F5 hoạt động, dự án của bạn phải là Dự án bắt đầu trong giải pháp. Để làm điều đó, trong trình khám phá giải pháp, hãy nhấp chuột phải vào dự án và chọn "Đặt làm dự án khởi động".
Tibi,

1
Ngoài ra, nếu chương trình của bạn có một số phụ thuộc bên ngoài, bạn cũng cần thay đổi "Thư mục làm việc".
Priyank

Có thể được yêu cầu kiểm tra "Bật gỡ lỗi mã gốc" (thuộc tính dự án → Gỡ lỗiBật trình gỡ lỗi ).
Peter Mortensen

Và làm thế nào để bạn thực hiện điều này cho toàn bộ giải pháp với 40 dự án?
Tony Tannous

23

Tôi đang gỡ lỗi một plugin C ++ trong một quy trình được tạo bên ngoài đã bị lỗi bằng cách ném một ngoại lệ khi khởi động và điều này hoạt động hoàn hảo đối với tôi:

Thêm Tiện ích mở rộng gắn lại miễn phí cho Visual Studio . Yêu cầu nó gắn lại với tên tiến trình trước khi nó được khởi chạy. Nó sẽ bật ra một hộp thoại phương thức cho biết nó đang đợi tên tiến trình khởi chạy.

Bây giờ khởi chạy quy trình và trình gỡ lỗi Visual Studio sẽ đính kèm ngay lập tức, bắt các ngoại lệ và nhấn các điểm ngắt.


Một ngàn lần vâng!
itlittlejohn

Tôi gặp bế tắc. Nó yêu cầu xác thực quản trị viên khi mục tiêu của tôi được khởi chạy và sau khi nhập pwd và khởi động lại vs, Reattach đã biến mất. Chỉ vs không có ủy quyền quản trị chứa Reattach.
Eric

2
Không hiệu quả với tôi. Nó vẫn gắn quá muộn, sau khi vụ tai nạn đã xảy ra. Nó dường như kiểm tra các quy trình hiện có mỗi giây một lần, điều này hoàn toàn vô nghĩa đối với ứng dụng này.
riv

20

Làm theo các bước sau nếu bạn có Visual Studio 2017-2019:

  1. Tệp> Mở> Dự án / Giải pháp
  2. Chọn .exe của bạn
  3. Gỡ lỗi> Bắt đầu gỡ lỗi

Dễ dàng hơn nhiều so với các đề xuất khác: bạn không phải làm rối với các thuộc tính của dự án và không cần phần mở rộng.


Nhưng bạn sẽ phải nói với Visual Studio nơi biểu tượng gỡ lỗi là, nếu nó không tìm thấy chúng tự động
Matt Thomas

1
nhanh chóng dễ dàng có thể thực hiện trong 5 giây, tôi thích nó. Cảm ơn
Đồng chíJoecool

1
Exe của tôi đã được khởi chạy, nhưng không thể đặt điểm ngắt. Tôi nên làm gì?
Eric

2
@Eric Nếu nhận xét của tôi ở trên không giải quyết được vấn đề đó thì tôi khuyên bạn nên đặt câu hỏi đó như một câu hỏi SO thay vì nhận xét. Vấn đề của bạn sẽ được hiển thị nhiều hơn và bạn sẽ có cơ hội giải thích tình huống cụ thể của mình. Sau đó, hãy cho chúng tôi biết những gì bạn tìm thấy!
Matt Thomas,

11

Tôi đã tìm thấy câu trả lời này khi tôi đang tìm kiếm thứ gì đó tương tự. Trong trường hợp của tôi, tôi không thể đơn giản sử dụng tệp thực thi làm chương trình khởi động dự án của mình vì nó cần phải được khởi động trong một môi trường rất cụ thể mà tôi không thể tái tạo dễ dàng (tên gọi: bắt đầu từ cygwin).

Tôi đã xem xét Tiện ích mở rộng gắn lại theo đề xuất của mrstrange và cũng là tiện ích mở rộng Đính kèm với Mọi thứ rất tương tự ... nhưng tệp thực thi của tôi dường như đóng quá nhanh để các tiện ích mở rộng thông báo và đính kèm.

Điều cuối cùng đã giúp tôi là: https://stackoverflow.com/a/4042545/1560865 , tham khảo bài viết MSDN Cách: Khởi chạy Trình gỡ lỗi Tự động , lần lượt liệt kê các bước sau:

  1. Khởi động Registry Editor (regedit).
  2. Trong Registry Editor, mở thư mục HKEY_LOCAL_MACHINE.
  3. Điều hướng đến HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ tùy chọn thực thi tệp hình ảnh.
  4. Trong thư mục Tùy chọn Thực thi Tệp Hình ảnh , hãy tìm tên của ứng dụng bạn muốn gỡ lỗi, chẳng hạn như myapp.exe . Nếu bạn không thể tìm thấy ứng dụng bạn muốn gỡ lỗi:
    a. Bấm chuột phải vào thư mục Tuỳ chọn Thực thi Tệp Hình ảnh và trên menu lối tắt, bấm Khoá Mới .
    b. Bấm chuột phải vào phím mới và trên menu lối tắt, bấm Đổi tên . c. Chỉnh sửa tên khóa thành tên ứng dụng của bạn; myapp.exe , trong ví dụ này.
  5. Bấm chuột phải vào thư mục myapp.exe và trên menu lối tắt, bấm Giá trị chuỗi mới .
  6. Bấm chuột phải vào giá trị chuỗi mới và trên menu lối tắt, bấm Đổi tên.
  7. Thay đổi tên thành debugger.
  8. Bấm chuột phải vào giá trị chuỗi mới và trên menu lối tắt, bấm Sửa đổi . Các Edit String hộp thoại xuất hiện.
  9. Trong hộp Dữ liệu giá trị , hãy nhập vsjitdebugger.exe.
  10. Bấm OK .
  11. Từ menu Đăng ký , nhấp vào Thoát .
  12. Thư mục chứa vsjitdebugger.exe phải nằm trong đường dẫn hệ thống của bạn. Để thêm nó vào đường dẫn hệ thống, hãy làm theo các bước sau:
    a. Mở Bảng điều khiển ở dạng xem Cổ điển và bấm đúp vào Hệ thống .
    b. Nhấp vào Cài đặt Hệ thống Nâng cao .
    c. Trong Thuộc tính Hệ thống , bấm vào tab Nâng cao .
    d. Trên tab Nâng cao , bấm Biến Môi trường .
    e. Trong hộp thoại Biến môi trường , bên dưới Biến hệ thống , hãy chọn Đường dẫn , sau đó bấm vào nút Chỉnh sửa .
    f. Trong biến hệ thống chỉnh sửahộp thoại, thêm thư mục vào hộp Giá trị biến . Sử dụng dấu chấm phẩy để tách nó khỏi các mục nhập khác trong danh sách.
    g. Bấm OK để đóng hộp thoại Chỉnh sửa Biến Hệ thống .
    h. Bấm OK để đóng hộp thoại Biến Môi trường .
    Tôi. Bấm OK để đóng hộp thoại Thuộc tính Hệ thống .
  13. Bây giờ, sử dụng bất kỳ phương pháp nào để khởi động ứng dụng của bạn. Visual Studio sẽ khởi động và tải ứng dụng.

Hy vọng rằng điều này sẽ giúp bất kỳ ai khác trong tương lai!


3
Dưới đây là hướng dẫn cho quy trình tương tự với các phiên bản VS mới hơn (lên đến 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins

3

Nếu không có quy trình thì Visual Studio không thể đính kèm vào nó.

Tuy nhiên, bạn có thể đặt chương trình khởi động của dự án của mình là một thứ khác với đầu ra của dự án.


Tôi đã điều tra xem điều tôi muốn làm có đúng không, và thực tế là như vậy. Tình huống của tôi không phải là trường hợp gỡ lỗi Visual Studio thông thường. Tôi có một dự án mẫu Excel 2010 được phát triển trong Visual Studio và các trang mẫu có các sự kiện khởi động. Tôi chạy mẫu này từ Visual Studio, thêm một số dữ liệu trong trang tính Excel của mình và lưu tệp trên đĩa. Sau đó, cách duy nhất tôi có thể mở tệp này cũng dựa vào lắp ráp mẫu, là mở nó từ trình thám hiểm, do đó tôi không thể gỡ lỗi các sự kiện khởi động trong trường hợp này và tất nhiên tôi có một số xử lý dữ liệu khi khởi động như databinding.
Ucodia

Có thể được yêu cầu kiểm tra "Bật gỡ lỗi mã gốc" (thuộc tính dự án → Gỡ lỗiBật trình gỡ lỗi ).
Peter Mortensen

3

Bạn có thể hiển thị một MessageBox, điều này sẽ chặn ứng dụng, sau đó bạn đính kèm hoặc gắn lại trình gỡ lỗi vào quy trình và nhấp vào ok để tiếp tục:

MessageBox.Show("Attach process to debugger and click ok!");

bạn có thể thêm nó vào phương thức khởi tạo Biểu mẫu (nếu bạn sử dụng winforms), vì vậy điều này sẽ được thực thi trước bất kỳ thứ gì khác, ngoại trừ việc khởi tạo các thành phần:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

Khi bạn hoàn thành việc gỡ lỗi của mình, hãy bình luận dòng đó.


3

Bạn có thể khởi động trình gỡ lỗi từ mã của mình qua

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

Nhưng đừng xóa dòng này trước khi gửi đơn đăng ký của bạn. Có thể bạn muốn sử dụng cờ trình biên dịch để đảm bảo:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }

2
Đây phải là câu trả lời được chấp nhận cho tất cả các trường hợp bạn đang đợi một số quy trình bên ngoài khởi chạy ứng dụng của mình.
TravelingFox

2

Một giải pháp nhỏ có thể phù hợp với nhiều người.

  • trong dòng mã đầu tiên mà exe sẽ chạy, hãy thêm lệnh này

    System.Threading.Thread.Sleep (20000)

Điều đó sẽ làm cho exe ngủ trong 20 giây trước khi nó bắt đầu xử lý bất cứ thứ gì. Sau đó, bạn có 20 giây để đính kèm vào quy trình, có thể thực hiện nhanh chóng bằng ctrl + alt + p, sau đó tìm quy trình, sau đó nhập để đính kèm.

Không có nhiều câu trả lời nhưng có tác dụng đối với tôi: -)


Tôi đã phải gỡ lỗi một CGI được viết bằng "C" mà tôi có mã nguồn. Tôi là một giải pháp đơn giản và dễ dàng để có thời gian gắn vào quy trình nền.
Joël Hecht
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.