2012-02-21 24 views
11

Trong khi cố gắng trả lời this question Tôi quyết định tôi cần phải bước qua quá trình marshalling bằng tay, trong giao diện trình gỡ lỗi.Bước qua "quản lý để chuyển đổi bản địa" trong Visual Studio?

Thật không may, Visual Studio dường như nhảy ngay trên tất cả mã thú vị này. Dưới đây là P/Gọi cuộc gọi đến GetProfilesDirectory (một hàm WinAPI):

enter image description here

nhưng sau khi bước vào cuộc gọi này (F11), tôi không thấy mình ở FFF9BFD8; đúng hơn, tôi hạ cánh ngay trong mã GetProfilesDirectory:

enter image description here

Ngoài ra còn có các [Managed to Native Transition] entry trên stack, gián tiếp tại một thực tế rằng Visual Studio vừa nhảy qua một bó toàn bộ mã.

Làm cách nào để tôi có thể thực hiện bước chuyển tiếp này?

+5

Vâng, tôi đã phát hiện vấn đề: bạn đang sử dụng phông chữ có chiều rộng biến trong trình chỉnh sửa mã! Đó chỉ là điên rồ. –

+1

Sự thiêng liêng! Tốt hơn hãy hỏi tiềm năng thuê những gì họ sử dụng phông chữ, để đảm bảo rằng tôi không trượt với sự điên rồ của tôi! –

Trả lời

3

Tôi ngạc nhiên rằng không ai đề xuất rằng bạn hiển thị mã bên ngoài trong cửa sổ gỡ lỗi. Nếu bạn nhấp chuột phải vào dòng [Native to Managed Transition] và đánh dấu vào tùy chọn Show External Code, bạn sẽ thấy chính xác những phương thức nào đang được gọi trong quá trình chuyển đổi. Điều này có thể cung cấp cho bạn một ý tưởng tốt hơn. Dưới đây là một ví dụ:

Display Native to Managed Transition

Sau đó bạn sẽ có thể nhấp đúp chuột vào bất kỳ (màu xám) dòng và một Disassembly trang sẽ mở ra với các mã. Một ví dụ khác:

enter image description here

1

Trong Visual Studio, bạn không thể thực hiện điều đó, tức là không có cách nào để chuyển trình gỡ rối VS sang chế độ để xem điều gì đang diễn ra trong quá trình chuyển đổi Được quản lý thành Gốc.

Bạn có thể thử WinDbg + SOS/SOSEX thay vì WinDBG không ẩn các loại chi tiết này từ bạn. Tuy nhiên, phần đó là .NET hoặc Windows trừu tượng bên trong, vì vậy ngay cả khi bạn có thể nhìn thấy nó, bạn có thể không nhận được nhiều, như để xem những gì đang diễn ra ở đó (bên cạnh assembly), bạn sẽ cần ký hiệu riêng cho mscorlib, mscoreei , hoặc clr dlls (tệp pdb).