Size: a a a

2019 April 12

PZ

Pavel Zhdanovich in .NET CIL Chat
@zawodskoj души
источник

DB

Dmitry Babushkin in .NET CIL Chat
Ищу самое простое решение для элементарной задачи - получить содержимое определенного стек-фрейма и найти в нём NULL-указатели.

По какой-то причине, такая тривиальная задача не нашла быстрого решения. Подскажите - куда смотреть?

Наиболее реалистичный вариант на данный момент - это использовать ICorDebug::DebugActiveProcess. Но для этого потребуется запустить внешний процесс-отладчик, подключиться к текущему процессу, зарегистрировать кучу коллбеков, построить взимодействие между текущим процессом и внешним. В общем, как из пушки по воробьям.

Ищу более простое решение.

P.S. Задача - перечислить и распечатать все null-ptr при возникновении NullReferenceException. MS эту проблему как-то решили и в последних версиях .NET Framework стали писать имя параметра с null-значением. Хочу также, но под .NET 4.5.2. :)
источник

К

Карен in .NET CIL Chat
> По какой-то причине, такая тривиальная задача не нашла быстрого решения
источник

К

Карен in .NET CIL Chat
источник

К

Карен in .NET CIL Chat
Не думаю что это тривиальная задача. Но простых решений наверно нет.
источник

DB

Dmitry Babushkin in .NET CIL Chat
Ну блин, взять регистр ESP, перейти по указатлю в памяти, смапить на IL-опкоды. Даже в таком варианте это кажется просто. А тем более, когда под рукой есть вся мощь .NET Framework'а и куча бэкдоров, прорытых MS для своих нужд.
источник

К

Карен in .NET CIL Chat
чем дальше начинаешь читать твоё сообщение, тем дальше начинаются непонятки
источник

К

Карен in .NET CIL Chat
вот по смещению от регистра ESP так легко съориентироваться где в опкодах это значение?
источник

К

Карен in .NET CIL Chat
я думаю что нет, и JIT компилятор используемую переменную (которая будет в IL коде) может вообще в стэк не ложить, а в регистр помещать, если она не нужна где-то в другом месте
источник

К

Карен in .NET CIL Chat
Надо узнать как студия и райдер это делают. Возможно через какой-то инструмент для отладки управляемых приложений. А может всё своё.
источник

DB

Dmitry Babushkin in .NET CIL Chat
Как раз через ICorDebug и делают.
источник

DB

Dmitry Babushkin in .NET CIL Chat
Вот только для аттача нам нужен отдельный процесс.
источник

DB

Dmitry Babushkin in .NET CIL Chat
Но повторюсь - NullReferenceException теперь содержит имя параметра, для которого выброшен null. Значит эта информация где-то хранится.
источник

DB

Dmitry Babushkin in .NET CIL Chat
Если это какой-то патч CLR - окей. А если нет, я хочу себе такой же.
источник

К

Карен in .NET CIL Chat
ну конечно же это патч CLR
источник

DB

Dmitry Babushkin in .NET CIL Chat
Ты меня расстраиваешь. :(
источник

К

Карен in .NET CIL Chat
она же проверяет объекты на NULL насколько я знаю, перед вызовом методов
источник

н

невидимка in .NET CIL Chat
Dmitry Babushkin
Ищу самое простое решение для элементарной задачи - получить содержимое определенного стек-фрейма и найти в нём NULL-указатели.

По какой-то причине, такая тривиальная задача не нашла быстрого решения. Подскажите - куда смотреть?

Наиболее реалистичный вариант на данный момент - это использовать ICorDebug::DebugActiveProcess. Но для этого потребуется запустить внешний процесс-отладчик, подключиться к текущему процессу, зарегистрировать кучу коллбеков, построить взимодействие между текущим процессом и внешним. В общем, как из пушки по воробьям.

Ищу более простое решение.

P.S. Задача - перечислить и распечатать все null-ptr при возникновении NullReferenceException. MS эту проблему как-то решили и в последних версиях .NET Framework стали писать имя параметра с null-значением. Хочу также, но под .NET 4.5.2. :)
на тот момент, когда ты поймал эксепшен, стекфрейма у тебя уже нет и ничего ты не найдешь
источник

DB

Dmitry Babushkin in .NET CIL Chat
невидимка
на тот момент, когда ты поймал эксепшен, стекфрейма у тебя уже нет и ничего ты не найдешь
А ты подпишись на AppDomain.FirstChanceException  и проверь. :)
источник

н

невидимка in .NET CIL Chat
а причем тут first chance эксепшоны
источник