Dumps thu được từ Báo cáo lỗi Windows thường có ngữ cảnh hiện tại vô dụng được đặt trên chuỗi lỗi, với ngăn xếp sâu trong WerpReportFault
. Ngữ cảnh thực tế tại thời điểm ngoại lệ có thể được truy xuất với .ecxr
- cũng đặt bối cảnh theo cách mà các lệnh tiếp theo trên cùng một luồng (chẳng hạn như k
) trả lại thông tin "chính xác".Lấy dấu vết ngăn xếp từ ngữ cảnh ngoại lệ được lưu trữ trong một minidump (tương tự như .ecxr; k)
Tôi đang xây dựng một công cụ để phân tích kết xuất tự động, sử dụng IDebugControl::GetStackTrace
để lấy ngăn xếp của chuỗi bị lỗi. Tôi có thể truy xuất ngữ cảnh ngoại lệ được lưu trữ bằng cách sử dụng IDebugControl4::GetStoredEventInformation
. Nếu tôi sử dụng các giá trị EBP/RBP, ESP/RSP, EIP/RIP từ ngữ cảnh được lưu trữ với GetStackTrace
, tôi sẽ có được ngăn xếp chính xác. Tuy nhiên, tôi sẽ nhân rộng hơn những gì lệnh .ecxr
làm, thiết lập trạng thái "đúng" cho đến khi chủ đề được chuyển đổi. Tôi đã thử sử dụng IDebugAdvanced::SetThreadContext
, nhưng nó có vẻ là một hoạt động bất hợp pháp cho các mục tiêu đổ và không thành công với 0x8000FFFF.
Tôi đã cố gắng tìm ra những gì .ecxr
thực hiện bằng cách gỡ lỗi một cá thể WinDbg và có vẻ như .ecxr
được triển khai trong dbgeng!DotEcxr
. Tuy nhiên, từ truy tìm nó (với wt
) tôi đã không thể hiểu cách nó đặt lại bối cảnh của luồng hiện tại. Nó dường như không gọi bất kỳ phương thức giao diện gỡ lỗi COM-client nào, dù sao, và không sử dụng IDebugAdvanced::SetThreadContext
.
Bất kỳ đề xuất nào về cách đặt ngữ cảnh luồng trong tệp kết xuất sẽ được đánh giá cao. Như một phương sách cuối cùng, tôi luôn có thể sử dụng IDebugControl::Execute
và chỉ cần gọi lệnh .ecxr
, nhưng tôi muốn có cách tiếp cận có lập trình hơn.
Tuyệt vời. Âm thanh như chính xác những gì tôi cần. –