Есть определенная библиотека с большим количеством классов, которая используется в большом проекте в большом числе многих разных мест. Исходного кода библиотеки нет, а для проекта есть.
Задача: отловить все вызовы всех методов этой библиотеки, которые совершаются из любых тредов кроме главного.
Как это сделать с минимальным количеством гемора, есть идеи?
Здравствуйте, Codealot, Вы писали:
C>Есть определенная библиотека с большим количеством классов, которая используется в большом проекте в большом числе многих разных мест. Исходного кода библиотеки нет, а для проекта есть. C>Задача: отловить все вызовы всех методов этой библиотеки, которые совершаются из любых тредов кроме главного. C>Как это сделать с минимальным количеством гемора, есть идеи?
С минимальным — не знаю, но есть геморрный путь.
Главный поток и только его пометить ThreadStatic меткой. В каждом методе, обращающимся к коду библиотеки, на входе сделать проверку метки. И за каждым await, если он есть. Task.ContinueWith аналогично.
Здравствуйте, Codealot, Вы писали:
C>Есть определенная библиотека с большим количеством классов, которая используется в большом проекте в большом числе многих разных мест. Исходного кода библиотеки нет, а для проекта есть. C>Задача: отловить все вызовы всех методов этой библиотеки, которые совершаются из любых тредов кроме главного.
C>Как это сделать с минимальным количеством гемора, есть идеи?
Создаешь conditional breakpoints на все методы API, в качестве условия пишешь что-то типа Threading.CurrentThread.ID != MainThreadID (непомню как там это точно в .NET'e)
Здравствуйте, Muxa, Вы писали:
M>Создаешь conditional breakpoints на все методы API, в качестве условия пишешь что-то типа Threading.CurrentThread.ID != MainThreadID (непомню как там это точно в .NET'e)
Примерно то же самое, что вручную искать все вызовы и писать там проверки. Только еще и тормозить будет адово.
Здравствуйте, Codealot, Вы писали:
C>Примерно то же самое, что вручную искать все вызовы и писать там проверки. Только еще и тормозить будет адово.
зачем вручную? Удаляешь рефку на либу и компилятор сам подскажет. Останется только кликать в строчку с багом и Ctrl+V проверку.
C>Примерно то же самое, что вручную искать все вызовы и писать там проверки.
Брэйкпоинты не на вызовы, а на сами методы API, я имел в виду.
C>Только еще и тормозить будет адово.
это да
Здравствуйте, Codealot, Вы писали:
C>А PostSharp умееть инжектить в каждый метод в сборке? Пока нашел только для тех, которые помечены атрибутом.
Конечно умеет. https://doc.postsharp.net/xml-multicasting
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Codealot, Вы писали:
C>Там написано, как применить ко всем методам в типе. А надо — ко всем методам всех типов в сборке, которых очень много. https://doc.postsharp.net/iaspectprovider
???
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, romangr, Вы писали:
C>А PostSharp умееть инжектить в каждый метод в сборке? Пока нашел только для тех, которые помечены атрибутом.
Умеет.
1. Делаете свой атрибут — MyCustomAspect, наследуете его от MethodInterceptionAspect
2. Применяете его к своей сборке, и в AttributeTargetAssemblies указываете внешнюю сборку
Здравствуйте, Codealot, Вы писали:
C>Как это сделать с минимальным количеством гемора, есть идеи?
Если подойдет в рантайме, то:
1. взять профилятор и запустить приложение, потом в снепшоте найти все вызовы, собрать их вместе и посмотреть откуда звалось (dotTrace так умеет)
2. написать метод, который оборачивает вызов искомого метода и проверяет тред, потом с помощью какого-нибудь тула заменить все вызовы (в ReSharper-e фича Search with Pattern заменит все вызовы без проблем), возможно, в студии тоже есть что-то подобное. В крайнем случае можно регекспами.
Если читая код, то можно взять ReSharper, позвать Incoming calls — получится дерево вызовов. Дальше походить по нему руками, но это намного удобнее, чем по коду. Если при этом еще и помечать места, про которые точно известно, из какого треда они зовутся, то так можно все вычистить.