Здравствуйте, asofronov, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
A>Это можно сделать при помощи Profiling API. В частности, есть метод ICorProfilerInfo::SetILFunctionBody который позволяет подменить тело метода во время выполнения. Также Unmanaged Metadata API понадобится скорее всего. Ну и писать по-видимому придется не на .NET, а на каком-нибудь нативном языке.
совершенно верно — на нативном, поскольку этот com должен создаваться до запуска виртуальной машины.
как пример можно посмотреть на исходики NCover и PartCover, которые это делают — меняют тело методов вставляя туда свои интсрукции
Здравствуйте, asofronov, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>я вот побрадил и накнулся на это: Modifying IL at runtime А>>думаю надо копать где то тут рядом.
А>>а вы как считаете?
A>Да, это оно.
скачал я от туда проект Modifying IL at runtime
собрал его, запустил bat файл который регистрирует собранную библиотеку, затем запускаю hello.exe а метод ICorProfilerCallback.JITCompilationStarted почему то не вызывается. как только не бился
кто что может сказать про библиотеки для профайлинга ?
Здравствуйте, <Аноним>, Вы писали:
А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
если менять код который уже откомпилирован JIT'ом то это приведет к непредсказуемым последствиям, во первых Windows не предполагает такого поведения программы и на какихнибудь ОС может вылезти исключение вроде "Access denied", т.к. сегменты памяти где располагается код могут быть защищены от записи.
Сам дотнет таких никаких средств для модификации машинного кода не предоставляет, т.к. машинный код создается только когда ты запускаешь программу. В самом EXE файле его еще нету.
Модифицировать память можно используя unsafe код, но проблема в том что на разных компах код наверняка будет совершенно разный и ты просто не сможешь угадать что где лежит и что на что нужно заменять. А даже если и угадаешь, то JIT может в любой момент перекомпилировать какойнить метод и это наверняка приведет к серьезным ошибкам.
С другой стороны дотнет предоставляет возможность генерировать или компилировать новый код в рантайме, старый при этом остается без изменений.
Здравствуйте, achmed, Вы писали:
А>>>>а если не штатными то это возможно ?
A>>>Если тело метода, то предположительно это можно сделать следующим образом: A>>>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос) A>>>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно A>>>в рантайме не предусмотрена защита.
А>>а можно пример кода?
A>Нет, слишком долго ...
Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Осака Вестингауз, Вы писали:
ОВ>>Здравствуйте, Аноним, Вы писали:
ОВ>>А что насчёт Edit and continue в студийном отладчике?
А>к сожалению это не приемлимо А>хотя может я не совем понял на что вы намекаете?
Так и есть. Он намекает, на то что студийный отладчик меняет код во время выполнения и отладки
_M_>Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
Зависит от конечной цели ведь, в каких то случаях такой подход может быть даст результат (например в самое начало метода с пустым списком аргументов нужно вставить вызов своего метода) ....
Re[8]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 11:45
Оценка:
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, _Morpheus_, Вы писали:
_M_>>Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
A>Зависит от конечной цели ведь, в каких то случаях такой подход может быть даст результат (например в самое начало метода с пустым списком аргументов нужно вставить вызов своего метода) ....
совершенно верно
именно это я и хотел сделать для организации логирования.
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 11:52
Оценка:
Здравствуйте, _Morpheus_, Вы писали:
_M_>Здравствуйте, <Аноним>, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
_M_>если менять код который уже откомпилирован JIT'ом то это приведет к непредсказуемым последствиям, во первых Windows не предполагает такого поведения программы и на какихнибудь ОС может вылезти исключение вроде "Access denied", т.к. сегменты памяти где располагается код могут быть защищены от записи. _M_>Сам дотнет таких никаких средств для модификации машинного кода не предоставляет, т.к. машинный код создается только когда ты запускаешь программу. В самом EXE файле его еще нету. _M_>Модифицировать память можно используя unsafe код, но проблема в том что на разных компах код наверняка будет совершенно разный и ты просто не сможешь угадать что где лежит и что на что нужно заменять. А даже если и угадаешь, то JIT может в любой момент перекомпилировать какойнить метод и это наверняка приведет к серьезным ошибкам.
_M_>С другой стороны дотнет предоставляет возможность генерировать или компилировать новый код в рантайме, старый при этом остается без изменений.
мне надо было уточнить что я имел ввиду модификацию байт-кода (IL). Я понимаю что после JIT компиляции средствами .NET уже почти невозможно что либо сделать.
Re[9]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 11:59
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, achmed, Вы писали:
A>>Здравствуйте, _Morpheus_, Вы писали:
_M_>>>Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
A>>Зависит от конечной цели ведь, в каких то случаях такой подход может быть даст результат (например в самое начало метода с пустым списком аргументов нужно вставить вызов своего метода) ....
А>совершенно верно А>именно это я и хотел сделать для организации логирования.
наконец то я это сделал, но появилась другая проблема:
трасировка отлично работает для консольных и winforms приложений, но для веб приложений в упор не хочет работать. В event лог добавляется следующая запись при старте веб приложения
Event Type: Error
Event Source: CLR
Event Category: None
Event ID: 0
Date: 05.06.2007
Time: 13:34:58
User: N/A
Computer: xxx
Description:
The description for Event ID ( 0 ) in Source ( CLR ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: Failed to CoCreate profiler..
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 13:02
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, <Аноним>, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
L>Штатных средств для этого нет.