Очень часто отладчик показывает 0x0000000 для this при отладке релиза.
Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
Может кто знает, как увидеть this?
Здравствуйте, P_YegreS_P, Вы писали:
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза. P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но... P_Y>Может кто знает, как увидеть this?
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза. P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но... P_Y>Может кто знает, как увидеть this?
Посмотреть в дизасме куда он девается
В классах не реализующих абстрактные классах с указанным declspec this при вызове обычно кладется в ecx, хотя оптимизатор может чего другого насочинять. Так что прежде всего надо смотреть что происходит с ecx в самом начале метода.
В классах, реализующих интерфейсы с указанным типом вызова this кладется на стек.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, P_YegreS_P, Вы писали:
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза. P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но... P_Y>Может кто знает, как увидеть this?
Распечатать в отладочный вывод — самое надёжное решение.
А то оптимизатор с отладчиком не шибко дружат, напоказывают всякую фигню.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, P_YegreS_P, Вы писали:
К>Распечатать в отладочный вывод — самое надёжное решение. К>А то оптимизатор с отладчиком не шибко дружат, напоказывают всякую фигню.
Всё бы хорошо, но мы крэш-дампы получаем, о вылетах в выпущенной программе.
P_YegreS_P wrote: > Похоже не угадали... DubugInfo есть. Отлаживаться можем. Но this не > видим, как и довольно много остальных вещей которые заоптимизировались.
Здравствуйте, P_YegreS_P, Вы писали:
P_Y>Здравствуйте, BogusCoder, Вы писали:
BC>>эм, собрать релиз с debug info?
P_Y>Похоже не угадали... DubugInfo есть. Отлаживаться можем. Но this не видим, как и довольно много остальных вещей которые заоптимизировались.
Это вполне нормальная ситуация. Воспроизводите ситуацию в дебаге(ну или с отключенными оптимизациями в релизе) и отлаживайте там.
Здравствуйте, P_YegreS_P, Вы писали:
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза. P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но... P_Y>Может кто знает, как увидеть this?
Приблема в том, что this лежит в ecx, который к моменту дампа может быть невалиден даже в совершенно нормальной ситуации(например, запушен в стек, но отладчик-то про это не знает)
Мы боролись путем принудительной установки __stdcall в настройках компиляции. Это способствует тому, что this передается через стек, а не через регистр. Но к сожалению, помогает далеко не всегда и с усовершенствованием оптимизаторов все хуже и хуже.
Месторасположение this можно часто увидеть при обращениям к полям / vtable / RTTI.
Особо подло, кстати, когда дебаггеру в дебаге крышу сносит. Если есть (возможно неявный через SEH) alloca на архитектурах без отдельного frame pointer register, то бывает худо.
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза. P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но... P_Y>Может кто знает, как увидеть this?
Есть один способ (в VS меня не раз выручал).
Надо в самом начале (перед самым первым оператором) того метода, где Вы хотите увидеть this поставить точку останова.
В этом месте чаще всего this будет актуален.
Запоминаете адрес его, и в Watch-окне отладчика указываете не "this", а адрес его.
Затем в этом же окне отладчика кастите этот указатель к типа того класса, this'ом которого он является.
должно получить например так:
(CTest*)(0x0012ff74)
И все. This будет теперь доступен для отладки отсюда.
Здравствуйте, P_YegreS_P, Вы писали:
P_Y>Здравствуйте, Кодт, Вы писали:
К>>Здравствуйте, P_YegreS_P, Вы писали:
К>>Распечатать в отладочный вывод — самое надёжное решение. К>>А то оптимизатор с отладчиком не шибко дружат, напоказывают всякую фигню.