Техника для перебора переменных и поиска экземпляров определенного типа

я хочу перебирать переменные в памяти в моем процессе (динамически загружаемый через плагин) и искать экземпляры определенного типа.

Ранее я мог найти конкретные типы (или все типы в памяти). Я могу создавать экземпляры типов, я мог бы получать экземпляры, которые содержались в виде полей другого типа, но я все равно не знаю, просто "искать" для экземпляров определенного типа.

 klumsy11 апр. 2012 г., 02:43
сейчас я делаю это только для обнаружения, так что я могу подключить отладчик, но в основном я хочу получить ссылку на них все, чтобы я мог вызывать методы для них.
 Kenneth Ito10 апр. 2012 г., 23:17
Если присоединение к процессу не является опцией, методы windbg / sos также отработают дамп памяти процесса. Просто убедитесь, что вы правильно поняли архитектуруblogs.msdn.com/b/tess/archive/2010/09/29/…
 Alois Kraus10 апр. 2012 г., 22:15
Как показывают ответы, вам необходимо подключить отладчик к вашему приложению. Если это не вариант, вам нужно немного проработать проблему, чтобы дать вам, возможно, более простое решение (например, требуется, чтобы объекты регистрировались в центральной коллекции, ...)
 Alois Kraus10 апр. 2012 г., 21:56
Вы можете автоматизировать Windbg, проанализировав вывод команды! DumpHeap, а затем приведя указатели к управляемым типам в вашем приложении.
 Alois Kraus11 апр. 2012 г., 10:21
Это опасно (но возможно). Вам необходимо привести указатель на управляемый объект обратно к ссылке на объект. Но имейте в виду, что вы можете получить случайные исключения ExecutionEngineExceptions, потому что если за это время GC действительно запустил, указатели объектов были изменены.

Ответы на вопрос(1)

Решение Вопроса

Одним из способов было бы использовать windbg и sos. Вы можете! Dumpheap с флагом -type.

 10 апр. 2012 г., 22:05
Эта статья, хотя и предназначена для поиска утечек, демонстрирует все команды sos, которые вам понадобятся. Автор использует CDB. Вы можете использовать либо cdb, либо windbg, это не имеет значения, пока вы загружаете sos.simple-talk.com/dotnet/.net-framework/…

Ваш ответ на вопрос