2011-01-14 32 views
19

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ố SuspendThreadGetThreadContext, 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!

+0

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

+3

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" ... –

+9

CONTEXT được khai báo với "DECLSPEC_ALIGN (16)" trong WinNT.h, có thể đó là vấn đề liên kết? –

Trả lời

16

Nhìn vào GetThreadContext chức năng, nó đề cập đến rằng

The CONTEXT structure is highly processor specific. Refer to the WinNt.h header file for processor-specific definitions of this structures and any alignment requirements.

Và nhìn vào tập tin này, _CONTEXT được khai báo với

typedef struct DECLSPEC_ALIGN(16) _CONTEXT { 
... 

Vì vậy, nó có thể nó có thể là một vấn đề liên kết.

+0

Thực tế buồn cười ngu ngốc: bạn có thể gọi GetThreadContext() trên Windows 9x với cấu trúc CONTEXT không được gán cho 16, nhưng vì NT bạn cần căn chỉnh vị trí bộ nhớ của nó để GetThreadContext hoạt động tốt. –

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