![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Michael_Rybak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 30.12.2006 Репутация: нет Всего: 1 |
Товарищи. Не дайте окончательно сломаться моску трудоспособного гражданина.
Мда. Сорри за флуд, моск действительно подплавлен слегка. Пытаюсь дебажить код. Проект Windows Forms Application, MS VS .NET 2003 Есть два класса, GA и GABirdEye. Второй наследуется от первого, перекрывая виртуальный метод GetAnswer. По вызову у GA* x метода x->GetAnswer() вызывается то, что нужно, т.е. метод child-класса. Но я не могу зайти туда, оно мне предлагает disassembly. Если это выдрать и создать чистый Console Application, то тот же вызов нормально трейсится. Очевидно, проблема в настройках проекта. Сравнивал, открыв рядом два окошка. Всё, что как-то похоже на правду (/ZI, /RTC1 и что-то еще) конфликтует с /clr, а /clr я, видимо, для WF не отключу, не нашел в опциях (нуб, что такое /clr не знаю). Но это еще не всё. Моск только начинал плавиться, и я решил зарепродюсить проблему и запостить мини-проект, но не тут-то было. Объявил два минимальных класса по описаной выше схеме - нормально трейсит. Добавил конструкторы - тоже. Добавлял пока стало падать, потом менял оригинальные классы чтоб заработало - запутался дико. В конце концов заметил, что один и тот же код иногда трейсится, а иногда нет. Т.е. видимо что-то там случайно совпадает и таблица вирт. функций то кривая, то нет. Не знаю. Не разбираюсь я в этом. Может кто сталкивался, помогите плиз. Я конечно дибаг аутпутами тоже могу (именно так и приходится), но это ж бред, студия ж для того и есть чтоб трейсить ![]() В аттаче проект. На этой версии репродюсится все время вроде бы, у меня по крайней мере. В файле ga.cpp, в строке 32 ставим брейкпоинт (return GetAnswer();). Сразу по запуску оно туда заходит. По F11 пишет There is no source code available и предлагает дизассембли. Причем если открыть эту дизассембли, то видно, что он, сволочь, там где надо как раз находится:
Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: нет Всего: 183 |
Про Forms ничего не знаю, т.к. не использую, но подобное поведение иногда встречается в С++, если "по пути" к своему методу надо пройти через библиотечные кишки (скажем, какие-нибудь особо-умные пойнтеры разыменовываются или что-то вроде). Но, правда, у меня это бывает стабильно. Т.е. если взять конкретный метод, либо всегда сразу попадаю в метод, либо всегда только через ассемблер. Как побороть - не знаю, но сама делаю так: если попадаю туда, где мне не надо, делаю Step Out (т.е. проскакиваю до выхода из функции), далее опять "внутрь" и так пока не дойду куда нужно. В этом месте файл дизасм просто закрываю и дальше (F10) уже хожу по сишному коду. Практически всегда получается. Если совсем далеко, просто ставлю точки прерывания по дороге. Конечно, путь не близкий. Зато обостряет интеллект, и заставляет за меньшее число итераций понять в чем проблема.
Может, это специально? ![]() ![]() -------------------- ... |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: нет Всего: 25 |
Ееее, товарищи, а не лечится ли это указанием папки исходника в directories->source files?
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: нет Всего: 183 |
Обижаешь, начальник
![]() -------------------- ... |
|||
|
||||
Michael_Rybak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 30.12.2006 Репутация: нет Всего: 1 |
Earnest, спасибо за ответ. В моем случае я попадаю всегда как раз туда, куда надо, но из дизассембли никакими манипуляциями StepIn'ов и StepOut'ов выйти не могу. Оно все время в дебрях всяких библиотек. Если в коллстеке кликнуть туда куда мне надо, и зайти в код, то зелененький треугольничег там появляется, а желтенькая стрелочка по Shift-F11 - нет.
dizzy1984, мне не удалось обнаружить directories->source files ни в главном меню, ни в опциях студии, ни в опция проекта. Т.е. даже если начальник обижаешь, я бы все равно попробовал, но не могу ![]() |
|||
|
||||
v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: нет Всего: 56 |
Таварищ, а то что функция GetAnswer() есть виртуальной никак не сказывается на результате работы?? ;)
вот я никак не могу понять с чего вы взяли что будет вызываться чайлд??? (анализируя ваш код , я бы не сказал что он должен вызываться...) 2. вам вобщето в раздел дотНЕТ... вы же управляемый С++ пользуете! Это сообщение отредактировал(а) v2v - 16.4.2007, 19:08 |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: нет Всего: 25 |
Ладно, на правах начальника я расшифрую то, что хотел сказать. Моя теория сводится к тому, что если студия хочет ходить по файлу, включенному в качестве объектного файла (*.obj, *.lib, *.dll), то для его просмотра смотрит наличие файла с тем же именем (что и у *.h) в папках source files. В 6-ке это находится Tools->Options->Directories->Show Directores for : Source Files. В 8-ке должно быть аналогично, но точно не скажу. Я отлаживал функции, подключенные как *.lib через #pragma, в то время как исходники в проекте не фигурировали, но были в списке source files. |
|||
|
||||
Michael_Rybak |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 30.12.2006 Репутация: нет Всего: 1 |
Функция pure virtual, и кроме чайлда вызываться, даже при желании, больше некому. В паренте virtual =0, в чайлде virtual. Всё правильно вроде. И работает.
Сорри, проглядел - купился на "Visual studio". Пусть перенесут модеры если необходимо.
Теперь нашел - Tools->Options->Projects->VC++ Directories->Show Directores for : Source Files Не повлияло никак. Только что вот такое наблюдал: дохожу до брейкпоинта, соглашаюсь на дизассембли. Нажимаю Shift-F11. В результате в одном из ~10 случаев оно выходит в код (и можно дебажить), в остальных остается в дизассембли. Эксперименты провожу подряд, без перезапуска студии и каких либо других изменений. Это сообщение отредактировал(а) Michael_Rybak - 17.4.2007, 02:24 |
||||||
|
|||||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Глядя в первый пост - вижу сие:
Вы же вызываете метод по указателю на NULL. Ай-яй-яй, нехорашо получается... ![]() -------------------- ![]() |
|||
|
||||
Michael_Rybak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 30.12.2006 Репутация: нет Всего: 1 |
Я тут не причем! Это всё она!
Не знаю почему такую фигню выдает, знаю только, что если убрать брейкпоинт, то соответствующий код нормально вызовется и нормально отработает. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Возможно, дело в том с какой скоростью отрабатывает код - в случае наличия брейкпоинта в отладке работает медленнее, чем без брейкпоинта. Приложение многопоточное ? Обрабатывает сетевой трафик ? Реагирует на действия пользователя ? -------------------- ![]() |
|||
|
||||
Michael_Rybak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 30.12.2006 Репутация: нет Всего: 1 |
Приложение еще не написано (не было написано, когда я его постил). В нем всё тупо и ничего практически оно не умеет. На пустой форме одна кнопка, по ее нажатию вызывается простой метод который толком ничего не делает. Всё в пределах стандартных функций + stl, никаких потоков или дополнительных библиотек.
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Значит, STL используем... Всё-таки код смешанный (.NET + Native) -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |