Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трейсить вирт. методы в Windows-Forms проекте, Моск. Сломаный на половину. 
:(
    Опции темы
Michael_Rybak
Дата 14.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 не знаю). 

Но это еще не всё. Моск только начинал плавиться, и я решил зарепродюсить проблему и запостить мини-проект, но не тут-то было. Объявил два минимальных класса по описаной выше схеме - нормально трейсит. Добавил конструкторы - тоже. Добавлял пока стало падать, потом менял оригинальные классы чтоб заработало - запутался дико. В конце концов заметил, что один и тот же код иногда трейсится, а иногда нет. Т.е. видимо что-то там случайно совпадает и таблица вирт. функций то кривая, то нет. Не знаю. Не разбираюсь я в этом.

Может кто сталкивался, помогите плиз. Я конечно дибаг аутпутами тоже могу (именно так и приходится), но это ж бред, студия ж для того и есть чтоб трейсить  smile 

В аттаче проект. На этой версии репродюсится все время вроде бы, у меня по крайней мере.

В файле ga.cpp, в строке 32 ставим брейкпоинт (return GetAnswer();). Сразу по запуску оно туда заходит. По F11 пишет There is no source code available и предлагает дизассембли. Причем если открыть эту дизассембли, то видно, что он, сволочь, там где надо как раз находится:

Код

Answer GABirdEye::GetAnswer()
{
00000000  push        ebp  
00000001  mov         ebp,esp 
00000003  sub         esp,30h 
00000006  push        edi  
00000007  push        esi  
00000008  push        ebx  
00000009  xor         eax,eax 
0000000b  mov         dword ptr [ebp-30h],eax 
0000000e  mov         dword ptr [ebp-2Ch],eax 
00000011  mov         dword ptr [ebp-28h],eax 
00000014  mov         dword ptr [ebp-24h],eax 
00000017  mov         dword ptr [ebp-8],0 
0000001e  mov         dword ptr [ebp-18h],ecx 
00000021  mov         dword ptr [ebp-1Ch],edx 
00000024  mov         dword ptr [ebp-20h],0 
0000002b  mov         dword ptr [ebp-20h],0 
  Answer a;
00000032  lea         ecx,[ebp-30h] 
00000035  call        dword ptr ds:[009768A0h] 
  a.way.push_back(startp);
0000003b  lea         ecx,[ebp-30h] 
0000003e  mov         edx,42F0F8h 
00000043  call        dword ptr ds:[009768B4h] 
  a.way.push_back(endp);
00000049  lea         ecx,[ebp-30h] 
0000004c  mov         edx,42F0E8h 
00000051  call        dword ptr ds:[009768B4h] 
  return a;
00000057  lea         edx,[ebp-30h] 
0000005a  mov         ecx,dword ptr [ebp-1Ch] 
0000005d  call        dword ptr ds:[00976820h] 
00000063  or          dword ptr [ebp-20h],1 
00000067  jmp         0000007B 
00000069  mov         ecx,dword ptr ds:[00421278h] 
0000006f  lea         edx,[ebp-30h] 
00000072  call        dword ptr ds:[0097690Ch] 
00000078  pop         eax  
00000079  jmp         eax  
0000007b  lea         ecx,[ebp-30h] 
0000007e  call        dword ptr ds:[0097671Ch] 
00000084  nop              
00000085  jmp         000000A6 
00000087  test        dword ptr [ebp-20h],1 
0000008e  je          000000A3 
00000090  and         dword ptr [ebp-20h],0FFFFFFFEh 
00000094  mov         ecx,dword ptr ds:[00421278h] 
0000009a  mov         edx,dword ptr [ebp-1Ch] 
0000009d  call        dword ptr ds:[0097690Ch] 
000000a3  pop         eax  
000000a4  jmp         eax  
}




Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Problem1.zip 15,91 Kb
PM MAIL   Вверх
Earnest
Дата 16.4.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: нет
Всего: 183



Про Forms ничего не знаю, т.к. не использую, но подобное поведение иногда встречается в С++, если "по пути" к своему методу надо пройти через библиотечные кишки (скажем, какие-нибудь особо-умные пойнтеры разыменовываются или что-то вроде). Но, правда, у меня это бывает стабильно. Т.е. если взять конкретный метод, либо всегда сразу попадаю в метод, либо всегда только через ассемблер. Как побороть - не знаю, но сама делаю так: если попадаю туда, где мне не надо, делаю Step Out (т.е. проскакиваю до выхода из функции), далее опять "внутрь" и так пока не дойду куда нужно. В этом месте файл дизасм просто закрываю и дальше (F10) уже хожу по сишному коду. Практически всегда получается. Если совсем далеко, просто ставлю точки прерывания по дороге. Конечно, путь не близкий. Зато обостряет интеллект, и заставляет за меньшее число итераций понять в чем проблема.
Может, это специально? smile  smile 


--------------------
...
PM   Вверх
dizzy1984
Дата 16.4.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Ееее, товарищи, а не лечится ли это указанием папки исходника в directories->source files?
PM MAIL   Вверх
Earnest
Дата 16.4.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: нет
Всего: 183



Обижаешь, начальник  smile 


--------------------
...
PM   Вверх
Michael_Rybak
Дата 16.4.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 30.12.2006

Репутация: нет
Всего: 1



Earnest, спасибо за ответ. В моем случае я попадаю всегда как раз туда, куда надо, но из дизассембли никакими манипуляциями StepIn'ов и StepOut'ов выйти не могу. Оно все время в дебрях всяких библиотек. Если в коллстеке кликнуть туда куда мне надо, и зайти в код, то зелененький треугольничег там появляется, а желтенькая стрелочка по Shift-F11 - нет.

dizzy1984, мне не удалось обнаружить directories->source files ни в главном меню, ни в опциях студии, ни в опция проекта. Т.е. даже если начальник обижаешь, я бы все равно попробовал, но не могу smile
PM MAIL   Вверх
v2v
Дата 16.4.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Таварищ, а то что функция GetAnswer() есть виртуальной никак не сказывается на результате работы?? ;)
вот я никак не могу понять с чего вы взяли что будет вызываться чайлд??? (анализируя ваш код , я бы не сказал что он должен вызываться...)

2. вам вобщето в раздел дотНЕТ... вы же управляемый С++  пользуете!

Это сообщение отредактировал(а) v2v - 16.4.2007, 19:08


--------------------
PM   Вверх
dizzy1984
Дата 16.4.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Цитата(Michael_Rybak @  16.4.2007,  18:10 Найти цитируемый пост)
 Т.е. даже если начальник обижаешь, я бы все равно попробовал, но не могу 

Ладно, на правах начальника я расшифрую то, что хотел сказать.
Моя теория сводится к тому, что если студия хочет ходить по файлу, включенному в качестве объектного файла (*.obj, *.lib, *.dll), то для его просмотра смотрит наличие файла с тем же именем (что и у *.h) в папках source files. В 6-ке это находится Tools->Options->Directories->Show Directores for : Source Files. В 8-ке должно быть аналогично, но точно не скажу.
Я отлаживал функции, подключенные как *.lib через #pragma, в то время как исходники в проекте не фигурировали, но были в списке source files.
PM MAIL   Вверх
Michael_Rybak
Дата 17.4.2007, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 30.12.2006

Репутация: нет
Всего: 1



Цитата

Таварищ, а то что функция GetAnswer() есть виртуальной никак не сказывается на результате работы?? ;)
вот я никак не могу понять с чего вы взяли что будет вызываться чайлд??? (анализируя ваш код , я бы не сказал что он должен вызываться...)


Функция pure virtual, и кроме чайлда вызываться, даже при желании, больше некому. В паренте virtual =0, в чайлде virtual. Всё правильно вроде. И работает.

Цитата

вам вобщето в раздел дотНЕТ... вы же управляемый С++  пользуете!


Сорри, проглядел - купился на "Visual studio". Пусть перенесут модеры если необходимо.

Цитата

В 6-ке это находится Tools->Options->Directories->Show Directores for : Source Files


Теперь нашел - Tools->Options->Projects->VC++ Directories->Show Directores for : Source Files

Не повлияло никак.



Только что вот такое наблюдал: дохожу до брейкпоинта, соглашаюсь на дизассембли. Нажимаю Shift-F11. В результате в одном из ~10 случаев оно выходит в код (и можно дебажить), в остальных остается в дизассембли. Эксперименты провожу подряд, без перезапуска студии и каких либо других изменений.

Это сообщение отредактировал(а) Michael_Rybak - 17.4.2007, 02:24
PM MAIL   Вверх
mr.DUDA
Дата 17.4.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Глядя в первый пост - вижу сие:

Цитата
00000000 push        ebp   
00000001  mov         ebp,esp 
00000003  sub         esp,30h 
00000006  push        edi  


Вы же вызываете метод по указателю на NULL. Ай-яй-яй, нехорашо получается...  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Michael_Rybak
Дата 17.4.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 30.12.2006

Репутация: нет
Всего: 1



Я тут не причем! Это всё она!

Не знаю почему такую фигню выдает, знаю только, что если убрать брейкпоинт, то соответствующий код нормально вызовется и нормально отработает.
PM MAIL   Вверх
mr.DUDA
Дата 17.4.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Michael_Rybak @  17.4.2007,  13:03 Найти цитируемый пост)
Не знаю почему такую фигню выдает, знаю только, что если убрать брейкпоинт, то соответствующий код нормально вызовется и нормально отработает.

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


--------------------
user posted image
PM MAIL WWW   Вверх
Michael_Rybak
Дата 17.4.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 30.12.2006

Репутация: нет
Всего: 1



Приложение еще не написано (не было написано, когда я его постил). В нем всё тупо и ничего практически оно не умеет. На пустой форме одна кнопка, по ее нажатию вызывается простой метод который толком ничего не делает. Всё в пределах стандартных функций + stl, никаких потоков или дополнительных библиотек.
PM MAIL   Вверх
mr.DUDA
Дата 17.4.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Michael_Rybak @  17.4.2007,  17:27 Найти цитируемый пост)
Всё в пределах стандартных функций + stl

Значит, STL используем... Всё-таки код смешанный (.NET + Native)


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1311 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.