2009-10-26 35 views
11

Tôi đang xây dựng một công cụ dev nội bộ để quản lý các quy trình khác nhau thường được sử dụng trong môi trường phát triển của chúng tôi. Công cụ hiển thị danh sách các quy trình được giám sát, cho biết trạng thái đang chạy của chúng và cho phép bắt đầu hoặc dừng từng quá trình.Cách đính kèm trình gỡ lỗi động vào một quy trình cụ thể

Tôi muốn thêm chức năng đính kèm trình gỡ lỗi vào quy trình được giám sát từ công cụ của tôi thay vì đi vào 'Debug-> Đính kèm quy trình' trong studio trực quan và tìm quy trình.

Mục tiêu của tôi là có một cái gì đó như Debugger.Launch() sẽ hiển thị danh sách studio trực quan có sẵn. Tôi không thể sử dụng Debugger.Launch() vì nó xoá bỏ trình gỡ lỗi trong quá trình thực hiện cuộc gọi. Tôi sẽ cần một cái gì đó như Debugger.Launch (processId).

Có ai biết cách đạt được chức năng này không?

Một giải pháp có thể là thực hiện lệnh trong mỗi quá trình được giám sát để gọi Debugger.Launch() khi lệnh được nhận từ công cụ giám sát, nhưng tôi muốn điều gì đó không yêu cầu sửa đổi mã của quy trình được giám sát .

Câu hỏi phụ: Khi sử dụng Debugger.Launch(), các trường hợp của Visual Studio đã được đính kèm trình gỡ lỗi không được liệt kê. Visual Studio không giới hạn một trình gỡ rối đính kèm, bạn có thể đính kèm nhiều quá trình khi sử dụng 'Debug -> Attach to process'.

Bất kỳ ai biết cách bỏ qua giới hạn này khi sử dụng Debugger.Launch() hoặc phương án thay thế?

Trả lời

14

Một đồng nghiệp đã kết thúc với một giải pháp sử dụng DTE, tôi đã đăng mã trên PasteBin.

Các phương pháp quan tâm là AttachVisualStudioToProcessTryGetVsInstance

Source Code

public static void AttachVisualStudioToProcess(Process visualStudioProcess, Process applicationProcess) 
{ 
    _DTE visualStudioInstance; 

    if (TryGetVsInstance(visualStudioProcess.Id, out visualStudioInstance)) 
    { 
     //Find the process you want the VS instance to attach to... 
     DTEProcess processToAttachTo = visualStudioInstance.Debugger.LocalProcesses.Cast<DTEProcess>().FirstOrDefault(process => process.ProcessID == applicationProcess.Id); 

     //Attach to the process. 
     if (processToAttachTo != null) 
     { 
      processToAttachTo.Attach(); 

      ShowWindow((int)visualStudioProcess.MainWindowHandle, 3); 
      SetForegroundWindow(visualStudioProcess.MainWindowHandle); 
     } 
     else 
     { 
      throw new InvalidOperationException("Visual Studio process cannot find specified application '" + applicationProcess.Id + "'"); 
     } 
    } 
} 

private static bool TryGetVsInstance(int processId, out _DTE instance) 
{ 
    IntPtr numFetched = IntPtr.Zero; 
    IRunningObjectTable runningObjectTable; 
    IEnumMoniker monikerEnumerator; 
    IMoniker[] monikers = new IMoniker[1]; 

    GetRunningObjectTable(0, out runningObjectTable); 
    runningObjectTable.EnumRunning(out monikerEnumerator); 
    monikerEnumerator.Reset(); 

    while (monikerEnumerator.Next(1, monikers, numFetched) == 0) 
    { 
     IBindCtx ctx; 
     CreateBindCtx(0, out ctx); 

     string runningObjectName; 
     monikers[0].GetDisplayName(ctx, null, out runningObjectName); 

     object runningObjectVal; 
     runningObjectTable.GetObject(monikers[0], out runningObjectVal); 

     if (runningObjectVal is _DTE && runningObjectName.StartsWith("!VisualStudio")) 
     { 
      int currentProcessId = int.Parse(runningObjectName.Split(':')[1]); 

      if (currentProcessId == processId) 
      { 
       instance = (_DTE)runningObjectVal; 
       return true; 
      } 
     } 
    } 

    instance = null; 
    return false; 
} 
+0

Bạn đã tạo một plugin VS tùy chỉnh cho điều này chưa? Hoặc làm thế nào bạn "dây nó lên"? Tôi có nhu cầu tương tự. Tôi đang nhìn chằm chằm vào mã của bạn ở đây, nhưng tìm cách bạn kết nối nó trong giải pháp cuối cùng của bạn. Cảm ơn. – granadaCoder

+0

Chúng tôi đã không tạo một plugin VS, chúng tôi đã sử dụng mã đó trong một công cụ tùy chỉnh đang theo dõi các quy trình sản phẩm của chúng tôi. –

+0

Ok. Tôi đã có thể sử dụng nó. Tôi sẽ trả lời ... 3 "Upvotes" nếu tôi có thể. – granadaCoder

12

Windbg thực hiện gỡ lỗi chuỗi cho mã gốc theo mặc định. Nếu bạn muốn khởi động một phiên bản khác của Visual Studio, hãy kiểm tra Launch the Debugger Automatically trên MSDN:

Để tự động hoá trình gỡ rối hiện tại, hãy sử dụng Marshal.GetActiveObject để lấy EnvDTE.Debugger hiện tại rồi để nó đính kèm vào quá trình bạn vừa tạo.

Đôi khi, bạn có thể cần gỡ lỗi mã khởi động cho ứng dụng được khởi chạy bởi một quy trình khác. Ví dụ bao gồm dịch vụ và hành động thiết lập tùy chỉnh. Trong các trường hợp này, bạn có thể khởi chạy trình gỡ lỗi và tự động đính kèm khi ứng dụng của bạn khởi động.

Để thiết lập một ứng dụng để khởi động các chương trình gỡ rối tự động

  1. Khởi động Registry Editor (regedit).

  2. Trong Registry Editor, mở thư mục HKEY_LOCAL_MACHINE.

  3. Điều hướng đến tùy chọn thực thi tệp HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image.

  4. Trong Tùy chọn thực thi tệp hình ảnh thư mục, định vị 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 mà bạn muốn gỡ lỗi:

    a. Nhấp chuột phải vào thư mục Tệp thực thi hình ảnh và trên menu lối tắt, nhấp Khóa mới.

    b.Nhấp chuột phải vào khóa mới và trên menu lối tắt, nhấp vào Đổ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. Kích chuột phải vào thư mục MyApp.exe, và trên menu chuột phải, nhấp New String Value.

  6. Nhấp chuột phải vào giá trị chuỗi mới và trên menu lối tắt, nhấp Đổi tên.

  7. Thay đổi tên thành debugger.

  8. Nhấp chuột phải vào giá trị chuỗi mới và trên menu lối tắt, nhấp Sửa đổi.
    Hộp thoại Chỉnh sửa chuỗi xuất hiện.

  9. Trong hộp Giá trị dữ liệu, nhập vsjitdebugger.exe.

  10. Bấm OK.

  11. Từ Registry trình đơn, nhấp 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 trong chế độ xem Cổ điển và nhấp đú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, hãy nhấp vào tab Nâng cao.

    d. Trên tab Nâng cao, hãy nhấp vào Biến môi trường.

    e. Trong hộp thoại Biến môi trường, dưới Biến hệ thống, chọn Đường dẫn, sau đó nhấp vào nút Chỉnh sửa.

    f. Trong hộp thoại Chỉnh sửa Biến hệ thống, hãy thêm thư mục vào hộp Biến giá trị. 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. Nhấp vào OK để đóng hộp thoại Chỉnh sửa Biến hệ thống.

    h. Bấm OK để đóng các ô Biến môi trường.

    i. Nhấp vào OK để đóng các Thuộc tính hệ thống hộp thoại.

Bây giờ, hãy 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ẽ bắt đầu và tải ứng dụng.

+0

Các liên kết mà bạn cung cấp cho thấy làm thế nào để bắt đầu một quá trình với các chương trình gỡ rối kèm theo. Tôi muốn đính kèm trình gỡ rối vào một quá trình khi nó đang chạy. Sau khi đọc bài viết tôi đã kiểm tra tài liệu về vsjitdebugger và những gì tôi chính xác những gì tôi cần: vsjitdebugger -p ProcessId. Cảm ơn đã chỉ cho tôi theo hướng đó. Bất kỳ ý tưởng nào về cách đính kèm vào một studio trực quan đang ở chế độ gỡ lỗi? Danh sách Visual Studio được hiển thị trong "Trình gỡ lỗi chỉ trong Visual Studio" không hiển thị chúng. –

+0

Ý của bạn là gì? đính kèm một trình sửa lỗi vào Visual Studio đang gỡ lỗi cái gì khác? Điều đó tốt cho điều gì? –

+0

Tôi muốn gỡ lỗi nhiều quy trình chỉ bằng một phiên bản studio trực quan. Có thể thực hiện nó từ "Debug -> Attach to process", nhưng hộp thoại Debugger JIT không hiển thị các cá thể của Visual Studio đang ở chế độ gỡ lỗi. –

6

tôi nghi ngờ bạn vẫn đang tìm kiếm này, nhưng đây là một số thông tin về cách bạn programatically thể đính kèm các trình gỡ lỗi để nhiều quy trình:

Attach to locally running processes

Attach to remotely running processes

+0

Đây không phải là câu trả lời hoặc là –

+0

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. – Kev

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