Я работаю с большим приложением и часто использую WinDbg для диагностики проблем на основе файла DMP от клиента. Я написал несколько небольших расширений для WinDbg, которые оказались очень полезными для извлечения битов информации из файлов DMP. В моем коде расширения я обнаруживаю, что разыскиваю объекты класса C ++ одним и тем же способом, снова и снова, вручную. Например:
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);
Это хорошо работает, но, поскольку я написал больше расширений, с большей функциональностью (и доступом к более сложным объектам в файлах DMP наших приложений), я жаждал лучшего решения. Конечно, у меня есть доступ к источнику нашего собственного приложения, поэтому я считаю, что должен быть способ скопировать объект из файла DMP и использовать эту память для создания фактического объекта в расширении отладчика, для которого я могу вызывать функции ( связав в dll из нашего приложения). Это избавило бы меня от необходимости вытаскивать вещи из DMP вручную.
Это вообще возможно? Я попробовал очевидные вещи, такие как создание нового объекта в расширении, а затем перезаписать его большой ReadMemory прямо из файла DMP. Это, казалось, поместило данные в правильные поля, но взбесилось, когда я попытался вызвать функцию. Я полагаю, что я что-то упускаю ... может быть, C ++ тянет некоторые vtable фанки, о которых я не знаю? Мой код выглядит примерно так:
SomeClass* thisClass = SomeClass::New();
ReadMemory(addressOfObj, &(*thisClass), sizeof(*thisClass), &cb);
FOLLOWUP: похоже, что возможно ExtRemoteTyped из EngExtCpp - это то, что я хочу? Кто-нибудь успешно использовал это? Мне нужно набрать пример кода, но мне не везет.
СЛЕДУЮЩАЯ 2: Я преследую два разных пути расследования этого вопроса.
1) Я смотрю в ExtRemoteTyped, но, похоже, этот класс действительно просто помощник для вызовов ReadMemory / GetFieldOffset. Да, это помогло бы ускорить процесс ALOT, но на самом деле не помогает, когда дело доходит до воссоздания объекта из файла DMP. Хотя документация скудная, я могу что-то неправильно понять.
2) Я также пытаюсь использовать ReadMemory для перезаписи объекта, созданного в моем расширении, данными из файла DMP. Однако вместо того, чтобы использовать sizeof (* thisClass), как описано выше, я подумал, что я бы выбрал только элементы данных и оставил vtables без изменений.