|
Хочется странного. Перехват вызова произвольного метода
|
|||
---|---|---|---|
#18+
Здравствуйте. Небольшая предыстория из разряда ненормальное программирование. Достался очень и очень крупный проект на Framework 3.5 для которого тестового окружения нет, скомпилить и запустить его, как обычно в дебаге в VS возможности тоже нет. Потому что даже просто сборка его это нетривиальный процесс. Качественной системы логирования нет. Оно вообще есть, но далеко не всегда и не везде, где надо. Плюс время до перезаписи логов на проде бывает недостаточно для того, чтобы исполнили заявку на получение логов с боевого сервера. При разборе какой-то проблемы добавить в потенциально проблемное место какой-то лог можно, но до выхода патча с этим дополнением могут пройти дни. В этой ситуации захотелось нечто странное, а именно попытаться каким-то образом перехватывать факт вызова произвольного метода в запущенной программе в условиях, когда изначально для этого ничего особенного не предпринималось. Идея в том, что, например, когда происходит какой-то эксепшен в произвольном месте, то в него же записывается весь стектрейс. Даже если это Release сборка, но есть PDB файл то будет номер строки исходного кода, где произошла ошибка. Т.е. у платформы явно есть информация откуда поток начал идти, куда он пошел дальше, где он находится сейчас, какие у него данные и т.д. Собственно было бы странно если бы этого не было, то как бы иначе вообще все работало. Вопрос в том, можно ли как-то вклинится в этот механизм что бы получить эти данные самому? Например, быть может есть где-то у какого-нибудь системного объекта типа ApplicationDomain или еще чего-то подобного событие типа CallMethod, которое возникало бы при вызове одного метода из другого. Тогда если подписаться на это события, можно было бы передав каким-либо образом запущенной программе сигнатуру нужного метода начать вылавливать его вызовы для того, чтобы записать значения переданных параметров. Или получить стектрейс что бы понять откуда пришел в него вызов. Или может быть можно как-то получать стектрейсы всех вызовов приложения: от самого начального метода до конечного и потом фильтровать их по наличию вызова интересующего метода. Что бы понять, как они проходили, какие данные поступили на вход, какие были эксепшены и т.д. и т.п. Подскажите хотя бы как это правильно называется и в какую сторону копать ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2018, 09:43 |
|
Хочется странного. Перехват вызова произвольного метода
|
|||
---|---|---|---|
#18+
Тройка, DebugDiag ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2018, 09:52 |
|
Хочется странного. Перехват вызова произвольного метода
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2018, 09:55 |
|
Хочется странного. Перехват вызова произвольного метода
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Спасибо, получилось в DebugDiag навешать брейкпоинт на метод и получить стектрейс. Но только в случае, если метод из основной сборки. А вот если создать в решении новый проект Sattelite, добавить на него Reference в основной и потом вызвать его метод то в логе пишет: Attempting to set managed breakpoint at Sattelite.exe!SateliteClass.ExceptionalMetod Script Error Error Code - 0x80004005 Error Source [Unavailable] Error Description [Unavailable] Line 170, Column 1 Выражение для указания метода основной программы MainProgram.exe!Form1.Internal и все работает. А как указать что мне нужен брейкпоинт на метод, который расположен в ссылочной сборке Sattelite.exe? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2018, 16:09 |
|
|
start [/forum/topic.php?fid=20&fpage=26&tid=1399204]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
1ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 138ms |
0 / 0 |