Tôi làm việc trên một ứng dụng lớn và thường xuyên sử dụng WinDbg để chẩn đoán các vấn đề dựa trên tệp DMP từ khách hàng. Tôi đã viết một vài phần mở rộng nhỏ cho WinDbg đã tỏ ra rất hữu ích cho việc kéo các bit thông tin ra khỏi các tệp DMP. Trong mã mở rộng của tôi, tôi thấy mình dereferencing C++ lớp đối tượng trong cùng một cách, hơn và hơn, bằng tay. Ví dụ:Làm cách nào để tạo các đối tượng dựa trên bộ nhớ tệp kết xuất trong phần mở rộng WinDbg?
Address = GetExpression("somemodule!somesymbol");
ReadMemory(Address, &addressOfPtr, sizeof(addressOfPtr), &cb);
// get the actual address
ReadMemory(addressOfObj, &addressOfObj, sizeof(addressOfObj), &cb);
ULONG offset;
ULONG addressOfField;
GetFieldOffset("somemodule!somesymbolclass", "somefield", &offset);
ReadMemory(addressOfObj+offset, &addressOfField, sizeof(addressOfField), &cb);
Đó hoạt động tốt, nhưng như tôi đã viết nhiều tiện ích, với chức năng lớn hơn (và tiếp cận đối tượng phức tạp hơn trong các ứng dụng của chúng tôi các file DMP), tôi đã mong muốn một giải pháp tốt hơn. Tôi có quyền truy cập vào nguồn của ứng dụng riêng của chúng tôi, vì vậy tôi phải có cách để sao chép một đối tượng ra khỏi tệp DMP và sử dụng bộ nhớ đó để tạo một đối tượng thực trong tiện ích mở rộng trình gỡ lỗi mà tôi có thể gọi hàm trên (bằng cách liên kết trong các dll từ ứng dụng của chúng tôi). Điều này sẽ giúp tôi tránh được rắc rối khi lôi kéo mọi thứ ra khỏi DMP bằng tay.
Điều này có thể thực hiện được không? Tôi đã thử những thứ hiển nhiên như tạo một đối tượng mới trong phần mở rộng, sau đó ghi đè nó bằng một ReadMemory lớn trực tiếp từ tệp DMP. Điều này dường như để đưa dữ liệu vào các trường bên phải, nhưng bị bối rối khi tôi cố gắng gọi một hàm. Tôi hình tôi thiếu một cái gì đó ... có lẽ c + + kéo một số vtable funky-ness mà tôi không biết về? Mã của tôi trông giống như sau:
SomeClass* thisClass = SomeClass::New();
ReadMemory(addressOfObj, &(*thisClass), sizeof(*thisClass), &cb);
SAU: Có vẻ như POSSIBLY ExtRemoteTyped từ EngExtCpp là những gì tôi muốn? Có ai đã sử dụng thành công điều này không? Tôi cần phải google lên một số mã ví dụ, nhưng tôi không có nhiều may mắn.
THEO D 2I 2: Tôi đang theo đuổi hai tuyến điều tra khác nhau về vấn đề này.
1) Tôi đang nhìn vào ExtRemoteTyped, nhưng nó xuất hiện lớp này thực sự chỉ là một trợ giúp cho các cuộc gọi ReadMemory/GetFieldOffset. Có, nó sẽ giúp tăng tốc độ những thứ lên ALOT, nhưng không thực sự giúp đỡ khi nói đến tái tạo một đối tượng từ một tập tin DMP. Mặc dù tài liệu rất mỏng, vì vậy tôi có thể hiểu nhầm điều gì đó. 2) Tôi cũng đang tìm cách sử dụng ReadMemory để ghi đè lên một đối tượng được tạo trong tiện ích mở rộng của tôi với dữ liệu từ tệp DMP. Tuy nhiên, thay vì sử dụng sizeof (* thisClass) như trên, tôi đã nghĩ rằng tôi sẽ chỉ chọn ra các yếu tố dữ liệu, và để lại vtables bị ảnh hưởng.
Câu hỏi tuyệt vời PJ! –