6

Tôi có một phần mở rộng Visual Studio móc vào các sự kiện gỡ lỗi. Khi trình gỡ lỗi dừng lại ở một dòng mã, số gọi lại IDebugEventCallback2 của tôi được gọi và tôi có thể tìm ra tên tệp và số dòng nơi trình gỡ lỗi đã dừng qua IDebugThread2::EnumFrameInfo.Trong một Visual Studio Extension, có được phạm vi dòng của chức năng mà trong đó trình gỡ lỗi được dừng lại

Tôi muốn biết phạm vi của các dòng mã nguồn mà chức năng hiện tại kéo dài.

Tôi hy vọng có thể lấy được thông tin tôi cần từ giao diện trình gỡ lỗi - trình gỡ lỗi phải biết phạm vi chức năng của dòng. Nếu điều đó là không thể, tôi sẽ mở cho bất kỳ phương pháp nào khác. Trong một thế giới lý tưởng, giải pháp sẽ hoạt động mà không có hệ thống dự án - nhiều người, bao gồm cả bản thân tôi, sử dụng Visual Studio như một trình gỡ lỗi độc lập mà không cần sử dụng hệ thống dự án. (Ngoài ra, tôi không thể dựa vào Roslyn - nó cần phải làm việc trong các phiên bản hiện tại của Visual Studio.)

Chỉnh sửa: Phương pháp sử dụng Carlos FileCodeModel hoạt động tốt, miễn là tệp là một phần của dự án. Tôi vẫn muốn biết liệu có một phương pháp không yêu cầu hệ thống dự án hay không.

Trả lời

0

Cho một FRAMEINFO lấy với IEnumDebugFrameInfo2.Next, bạn có thể sử dụng đoạn mã sau để có được tên tập tin, dòng đầu tiên của mã của khung hiện tại và dòng hiện tại của mã:

IDebugStackFrame2 stackFrame = frmInfo.m_pFrame; 
if (stackFrame != null) 
{ 
    TEXT_POSITION[] begin = new TEXT_POSITION[1]; 
    TEXT_POSITION[] end = new TEXT_POSITION[1]; 
    IDebugDocumentContext2 debugDocumentContext2; 
    stackFrame.GetDocumentContext(out debugDocumentContext2); 
    if (debugDocumentContext2 != null) 
    { 
     string fileName; 
     debugDocumentContext2.GetName((uint)enum_GETNAME_TYPE.GN_FILENAME, out fileName); 
     debugDocumentContext2.GetSourceRange(begin, end); 
    } 
} 

FWIW, các IDebugDocumentContext2 giao diện có phương thức Seek cho phép bạn nâng cấp các dòng hoặc câu lệnh mã trong khung ngăn xếp. Tôi đoán bạn có thể tạm ứng cho đến khi không nhận được dòng kết thúc mã của khung ngăn xếp.

Để nhận thông tin về các phần tử mã và điểm bắt đầu/kết thúc bằng cách sử dụng hệ thống dự án (và không có Roslyn), bạn phải sử dụng mô hình tự động hóa (EnvDTE.ProjectItem.FileCodeModel). Với một EnvDTE.ProjectItem và một dòng mã, bạn có thể sử dụng ví dụ: HOWTO: Get the code element at the cursor from a Visual Studio .NET macro or add-in

+0

Cảm ơn, nhưng điều đó không hoàn toàn phù hợp với tôi. 'GetSourceRange()' trả về phạm vi của câu lệnh hiện tại, không phải toàn bộ khung và 'Seek()' trả về 0x80004001 "Không được triển khai" từ trình gỡ lỗi C++. (Không phải của tôi downvote, BTW.) (Và cảm ơn cho con trỏ đến bài viết CodeModel tuyệt vời của bạn, mà tôi đã nhìn vào. :-)) – RichieHindle

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