Tôi gặp phải sự cố kỳ lạ trên trình lấy mẫu trong Windows 7 (không có vấn đề AFAICT trên các hệ điều hành Windows trước đó, chúng là 32 hoặc 64 bit).GetThreadContext không thành công sau khi một SuspendThread thành công trong Windows 7
Trình hồ sơ hoạt động theo định kỳ tạm dừng một sợi với SuspendThread
, sau đó xem ngữ cảnh với GetThreadContext
, trước khi gọi ResumeThread
để khởi động lại quy trình. Tất cả điều này được thực hiện từ ngữ cảnh của một bộ hẹn giờ đa phương tiện (tính chính xác, vào khoảng 1kHZ, mà trên các hệ điều hành trước Windows 7 thường phải gánh chịu một hình phạt hiệu suất không đáng kể).
Dưới Windows 7, và Windows 7 chỉ, mặc dù các cuộc gọi đến SuspendThread
(và ResumeThread
) tất cả thành công, các cuộc gọi đến GetThreadContext
thất bại với lỗi:
ERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.
với một likeliness rất cao, mặc dù không phải tất cả thời gian. Do đó tôi có nghĩa là đối với một số chạy hồ sơ, mọi thứ sẽ hoạt động như trên các hệ điều hành khác (tất cả các cuộc gọi GetThreadContext
sẽ thành công), nhưng đối với các lần chạy khác, chúng hầu như sẽ thất bại (tiết kiệm một tá có thể, trong số đó) hàng chục nghìn). Nó xảy ra với cùng một tệp nhị phân, cùng các tham số.
Tôi đã thử đề xuất về các vấn đề tìm kiếm tương tự như mơ hồ để lặp lại cuộc gọi GetThreadContext
, không thành công hơn nữa. Tôi cũng đã thử thực hiện một số Sleep
giữa các số SuspendThread
và GetThreadContext
, sau đó số GetThreadContext
thành công thường xuyên hơn, mặc dù kết quả là sự sụt giảm mạnh. Tuy nhiên, nó gợi ý rằng hệ điều hành Windows 7 đang trở về từ SuspendThread
trong khi luồng có thể chưa bị đình chỉ - mặc dù, nếu trường hợp đó xảy ra, tôi không biết làm thế nào hoặc để chờ đợi đúng cách trong quá trình tạm ngưng, lặp lại trong chỉ và đập GetThreadContext
không làm điều đó.
Chỉnh sửa: 16 byte căn chỉnh địa chỉ của cấu trúc CONTEXT
cho GetThreadContext
theo đề xuất của Dan Bartlett dường như đang thực hiện thủ thuật!
Trông rất cụ thể. Có lẽ bạn nên tìm một bản dựng Windows đã kiểm tra để tìm ra vấn đề? Bạn có mô tả vấn đề này trong diễn đàn nhà phát triển MSDN không? Hoặc có thể nộp lỗi trực tiếp tại MS. – ChristianWimmer
Bạn có sử dụng thuộc tính THREAD_ALL_ACCESS khi tạo quy trình không? Xem http://msdn.microsoft.com/en-us/library/ms686769(v=vs.85).aspx tuyên bố rằng "Giá trị của cờ THREAD_ALL_ACCESS tăng trên Windows Server 2008 và Windows Vista" ... –
CONTEXT được khai báo với "DECLSPEC_ALIGN (16)" trong WinNT.h, có thể đó là vấn đề liên kết? –