This при отладке release в MS VC
От: P_YegreS_P Беларусь www.orienteering.bsu.by
Дата: 22.07.10 07:03
Оценка:
Очень часто отладчик показывает 0x0000000 для this при отладке релиза.
Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
Может кто знает, как увидеть this?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re: This при отладке release в MS VC
От: BogusCoder Швеция  
Дата: 22.07.10 07:48
Оценка:
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза.

P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
P_Y>Может кто знает, как увидеть this?

эм, собрать релиз с debug info?
Re: This при отладке release в MS VC
От: ononim  
Дата: 22.07.10 08:07
Оценка: 3 (2) +1
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза.
P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
P_Y>Может кто знает, как увидеть this?
Посмотреть в дизасме куда он девается
В классах не реализующих абстрактные классах с указанным declspec this при вызове обычно кладется в ecx, хотя оптимизатор может чего другого насочинять. Так что прежде всего надо смотреть что происходит с ecx в самом начале метода.
В классах, реализующих интерфейсы с указанным типом вызова this кладется на стек.
Как много веселых ребят, и все делают велосипед...
Re: This при отладке release в MS VC
От: Кодт Россия  
Дата: 22.07.10 09:05
Оценка: 1 (1) +1
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза.

P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
P_Y>Может кто знает, как увидеть this?

Распечатать в отладочный вывод — самое надёжное решение.
А то оптимизатор с отладчиком не шибко дружат, напоказывают всякую фигню.
Перекуём баги на фичи!
Re[2]: This при отладке release в MS VC
От: P_YegreS_P Беларусь www.orienteering.bsu.by
Дата: 22.07.10 11:10
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, P_YegreS_P, Вы писали:


К>Распечатать в отладочный вывод — самое надёжное решение.

К>А то оптимизатор с отладчиком не шибко дружат, напоказывают всякую фигню.

Всё бы хорошо, но мы крэш-дампы получаем, о вылетах в выпущенной программе.

Так, что не подходит...
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[2]: This при отладке release в MS VC
От: P_YegreS_P Беларусь www.orienteering.bsu.by
Дата: 22.07.10 11:10
Оценка:
Здравствуйте, BogusCoder, Вы писали:

BC>эм, собрать релиз с debug info?


Похоже не угадали... DubugInfo есть. Отлаживаться можем. Но this не видим, как и довольно много остальных вещей которые заоптимизировались.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[3]: This при отладке release в MS VC
От: rus blood Россия  
Дата: 22.07.10 11:36
Оценка: +2
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Всё бы хорошо, но мы крэш-дампы получаем, о вылетах в выпущенной программе.


Может, отладчик не врет...
Имею скафандр — готов путешествовать!
Re[3]: This при отладке release в MS VC
От: Кодт Россия  
Дата: 22.07.10 12:55
Оценка:
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Всё бы хорошо, но мы крэш-дампы получаем, о вылетах в выпущенной программе.


Написать
if(!_CrtIsValidPointer(this))
  DebugBreak();

и запускать релиз под отладчиком.

Почему не просто if(this==0) — потому что могут быть фокусы со смещённой базой, 0x00000004 или 0xFFFFFFFC всякие.
Перекуём баги на фичи!
Re[3]: This при отладке release в MS VC
От: MasterZiv СССР  
Дата: 23.07.10 06:58
Оценка:
P_YegreS_P wrote:
> Похоже не угадали... DubugInfo есть. Отлаживаться можем. Но this не
> видим, как и довольно много остальных вещей которые заоптимизировались.

ОТлаживаться можно и вообще без debug info.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: This при отладке release в MS VC
От: Guard_h4s Россия  
Дата: 23.07.10 07:37
Оценка:
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Здравствуйте, BogusCoder, Вы писали:


BC>>эм, собрать релиз с debug info?


P_Y>Похоже не угадали... DubugInfo есть. Отлаживаться можем. Но this не видим, как и довольно много остальных вещей которые заоптимизировались.


Это вполне нормальная ситуация. Воспроизводите ситуацию в дебаге(ну или с отключенными оптимизациями в релизе) и отлаживайте там.
Re: This при отладке release в MS VC
От: Sergey Chadov Россия  
Дата: 23.07.10 18:24
Оценка:
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза.

P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
P_Y>Может кто знает, как увидеть this?

Приблема в том, что this лежит в ecx, который к моменту дампа может быть невалиден даже в совершенно нормальной ситуации(например, запушен в стек, но отладчик-то про это не знает)
Мы боролись путем принудительной установки __stdcall в настройках компиляции. Это способствует тому, что this передается через стек, а не через регистр. Но к сожалению, помогает далеко не всегда и с усовершенствованием оптимизаторов все хуже и хуже.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: This при отладке release в MS VC
От: superlexx  
Дата: 23.07.10 19:43
Оценка:
Месторасположение this можно часто увидеть при обращениям к полям / vtable / RTTI.

Особо подло, кстати, когда дебаггеру в дебаге крышу сносит. Если есть (возможно неявный через SEH) alloca на архитектурах без отдельного frame pointer register, то бывает худо.
Re: This при отладке release в MS VC
От: Alpenstock  
Дата: 23.07.10 20:05
Оценка:
P_Y>Очень часто отладчик показывает 0x0000000 для this при отладке релиза.
P_Y>Наверняка это проделки оптимизатора кода, и отладчик как бы ни при чем. Но...
P_Y>Может кто знает, как увидеть this?

Есть один способ (в VS меня не раз выручал).
Надо в самом начале (перед самым первым оператором) того метода, где Вы хотите увидеть this поставить точку останова.
В этом месте чаще всего this будет актуален.
Запоминаете адрес его, и в Watch-окне отладчика указываете не "this", а адрес его.
Затем в этом же окне отладчика кастите этот указатель к типа того класса, this'ом которого он является.

должно получить например так:


(CTest*)(0x0012ff74)



И все. This будет теперь доступен для отладки отсюда.
отладка
Re[3]: This при отладке release в MS VC
От: пыщьх http://rsdn_user.livejournal.com
Дата: 25.07.10 09:11
Оценка:
Здравствуйте, P_YegreS_P, Вы писали:

P_Y>Здравствуйте, Кодт, Вы писали:


К>>Здравствуйте, P_YegreS_P, Вы писали:


К>>Распечатать в отладочный вывод — самое надёжное решение.

К>>А то оптимизатор с отладчиком не шибко дружат, напоказывают всякую фигню.


volatile MyClass *g_pTestClass;

void MyClass::OptimizedMethod()
{
    g_pTestClass = this;
}


в отладчике смотрим g_pTestClass, его оптимизатор не выкинет, т.к. он volatile.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[4]: This при отладке release в MS VC
От: rus blood Россия  
Дата: 25.07.10 09:26
Оценка:
Здравствуйте, пыщьх, Вы писали:

П>
П>volatile MyClass *g_pTestClass;
П>


П>в отладчике смотрим g_pTestClass, его оптимизатор не выкинет, т.к. он volatile.


MyClass* volatile g_pTestClass;
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.