Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.01.08 10:31
Оценка: 2 (1)
Я начал переводить Интеграцию на VS 2008. Сейчас в SVN лежат исходники которые компилируются под VS 2008 и новым SDK (к ней). Однако при попытке создать или открыть проект студия валится "без объявления войны", т.е. без разумной информации.

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

Отлов подобные баги крайне трудно ловить. Нужно ставить брэйкпоинты в коде интеграции и искать код который приводит к зацикливанию. Делать это можно только перебором.

По сему прошу все у кого есть время и силы помочь в поиске этого вылета.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Переход на VS 2008
От: _pk_sly  
Дата: 22.01.08 12:57
Оценка:
VD>Я начал переводить Интеграцию на VS 2008. Сейчас в SVN лежат исходники которые компилируются под VS 2008 и новым SDK (к ней). Однако при попытке создать или открыть проект студия валится "без объявления войны", т.е. без разумной информации.

даже окошко с исключением не вываливается?
а если запустить под дебаггером?
Re[2]: Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.01.08 12:20
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>даже окошко с исключением не вываливается?


Если бы вываливалось, то ошибку нечего было бы искать.

__>а если запустить под дебаггером?


Никак. Просто вылезает окошко с надписью, что приложение будет закрыто. Ни тебе стэкрэса, ни возможности запустить отладку.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Переход на VS 2008
От: _pk_sly  
Дата: 23.01.08 12:30
Оценка:
__>>а если запустить под дебаггером?
VD>Никак. Просто вылезает окошко с надписью, что приложение будет закрыто. Ни тебе стэкрэса, ни возможности запустить отладку.

не понял.
я имею ввиду, запустить дебаггер, а из него уже запустить то, что падает. не наоборот.
в худшем случае, дебаггер остановится на функции TerminateProcess.
Re[3]: Переход на VS 2008
От: Блудов Павел Россия  
Дата: 23.01.08 12:31
Оценка: 99 (1)
Здравствуйте, VladD2, Вы писали:

VD>Никак. Просто вылезает окошко с надписью, что приложение будет закрыто. Ни тебе стэкрэса, ни возможности запустить отладку.

Я так делал: запускал две студии, из одной делал attach to process, явно указывал native+managed, потом в отлаживаемой загружал немерлёвый проект.
Явное указание native+managed позволяет видеть оба стека — и управляемый и обычный.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[4]: Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.01.08 12:58
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>я имею ввиду, запустить дебаггер, а из него уже запустить то, что падает. не наоборот.


Так и делаю. В общем, можешь сам попробовать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Переход на VS 2008
От: hi_octane Беларусь  
Дата: 25.01.08 09:19
Оценка:
Сами проекты открываются, редактируются и компилируются без проблем и отладчик тоже работает (проверено на довольно больших проектах). Куда-то ушла менюшка Nemerle и AST Tool Window...

Валится код заполнения комбов в Navigation Bar. Абсолютно та же проблема была и в моей завечернаколенкеделанной интеграции с VS2008 (я даже про это писал), но запарка сейчас такая что я и в выходные нормально позаниматься немерлом не могу

Перешёл на твою версию интеграции, для работы просто отключил Navigation Bar. Надеюсь за субботу смогу выложить патч который исправит ситуацию, т.к. у меня в студии стактрэйс с переполнением стека почему-то видно.

Да, в некоторых проектах пришлось удалить и заново поставить рефернсы на Nemerle.dll и Nemerle.Macros.dll, при том что я и NGen'ом прошёлся и в GAC поставил, раньше при обновлениях версии компилятора такого делать не надо было, х-з почему...
Re: Utils.cs нехватает в SVN
От: hi_octane Беларусь  
Дата: 25.01.08 09:29
Оценка:
Забыл написать в предыдущем посте. Версия из SVN не компилируется -- в SVN нехватает файла Nemerle.VsIntegration\Utils.cs и проперти VSRegistry_RegistryRoot в нём. Для компиляции я взял код этой проперти из своей версии интеграции но выкладывать файл целиком не стал -- вдруг ты ещё что-то менял в нём. Выложи плиз.

Если кто-то будет собирать до того как Влад обновит файл — код этой проперти, который работал у меня:

public static RegistryKey VSRegistry_RegistryRoot
{
    get
    {
        Microsoft.VisualStudio.Shell.Interop.ILocalRegistry3 ILocalRegistry3 =
            Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.Shell.Interop.SLocalRegistry))
            as Microsoft.VisualStudio.Shell.Interop.ILocalRegistry3;
        string root = null;
        ILocalRegistry3.GetLocalRegistryRoot(out root);

        if(root == null)
            return null;

        return Registry.LocalMachine.OpenSubKey(root);
    }
}
Re[4]: Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.08 09:57
Оценка: 28 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>Я так делал: запускал две студии, из одной делал attach to process, явно указывал native+managed, потом в отлаживаемой загружал немерлёвый проект.

БП>Явное указание native+managed позволяет видеть оба стека — и управляемый и обычный.

Помогло! Правда, на моей рабочей машине почему-то на запускается языковый пакет (открывается C#-пный редактор вместо Немерлового). Но дома я поймал ошибку. Оказалось циклит (т.е. как я и предпологал, переполнение стека) код в комбах (МС-ный):

// Omitting any of the following operator overloads
// violates FxCop rule: IComparableImplementationsOverrideOperators.
/// <include file='doc\CodeWindowManager.uex' path='docs/doc[@for="DropDownMember.Operator=="]/*' />
public static bool operator ==(DropDownMember m1, DropDownMember m2) {
    if (null == m1) {
        return (null == m2);
    }
    return m1.Equals(m2);
}

В общем, душить надо этих индусов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.08 13:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>
VD>// Omitting any of the following operator overloads
VD>// violates FxCop rule: IComparableImplementationsOverrideOperators.
VD>/// <include file='doc\CodeWindowManager.uex' path='docs/doc[@for="DropDownMember.Operator=="]/*' />
VD>public static bool operator ==(DropDownMember m1, DropDownMember m2) {
VD>    if (null == m1) {
VD>        return (null == m2);
VD>    }
VD>    return m1.Equals(m2);
VD>}

VD>

VD>В общем, душить надо этих индусов.

Открылись странные осбтоятельства. Этот код содержится в сборке Microsoft.VisualStudio.Package.LanguageService.dll, но к проекту подключена сборка Microsoft.VisualStudio.Package.LanguageService.9.0.dll (обе из каталога %VisualStudioIntegration%\Common\Assemblies\).

Так вот, почему подцепляется не та сборка я пока понять не могу. Но если зацепить правишьную версию, то все должно заработать как надо.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.08 13:54
Оценка: +1
Здравствуйте, VladD2, Вы писали:

Возникают проблемы при наличии на машине VS 2005.

Дома, где у меня стоит только 2008-ая студия регистрация и запуск проходят нормально.

А, вот на работе, где стоят обе студии (2005 и 2008) работать интеграция не хочет. Причем не ясно куда копать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Кстати
От: Блудов Павел Россия  
Дата: 27.01.08 03:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>
VD>// Omitting any of the following operator overloads
VD>// violates FxCop rule: IComparableImplementationsOverrideOperators.
VD>/// <include file='doc\CodeWindowManager.uex' path='docs/doc[@for="DropDownMember.Operator=="]/*' />
VD>public static bool operator ==(DropDownMember m1, DropDownMember m2)
VD>

Я тут вдруг вспомнил, что знал об этой проблеме. И тупо заменил у себя на машине на
// Omitting any of the following operator overloads
// violates FxCop rule: IComparableImplementationsOverrideOperators.
/// <include file='doc\CodeWindowManager.uex' path='docs/doc[@for="DropDownMember.Operator=="]/*' />
public static bool operator ==(DropDownMember m1, DropDownMember m2) {
        return Equals(m1, m2);
}

После чего NavigationBar перестал вылетать с NullReferenceException если m1 == null.
Индусам я об ошибке отписал, они добавили проверку на null. Но похоже и этого мало.
Слушай, может тупо выкинуть все эти операторы?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.08 07:45
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Слушай, может тупо выкинуть все эти операторы?


Прочти это сообщение: http://rsdn.ru/forum/message/2811823.1.aspx
Автор: VladD2
Дата: 25.01.08

Они их выкинули. Вот только... ну, да там все описано.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Переход на VS 2008
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.01.08 08:41
Оценка: 12 (3) +2
Здравствуйте, VladD2, Вы писали:

VD>Открылись странные осбтоятельства. Этот код содержится в сборке Microsoft.VisualStudio.Package.LanguageService.dll, но к проекту подключена сборка Microsoft.VisualStudio.Package.LanguageService.9.0.dll (обе из каталога %VisualStudioIntegration%\Common\Assemblies\).


VD>Так вот, почему подцепляется не та сборка я пока понять не могу. Но если зацепить правишьную версию, то все должно заработать как надо.


Обманулся я.

На самом деле дебильный код "рекурсивной проверки на null" находится таки в Microsoft.VisualStudio.Package.LanguageService.9.0.dll, а в Microsoft.VisualStudio.Package.LanguageService.dll вообще проверок нет.

В общем, принял решение полностью заменить реализацию TypeAndMemberDropdownBars и DropDownMember воспроизведя их кишки в NemerleTypeAndMemberDropdownBars и NemerleDropDownMember соответственно. Надеюсь — это поможет.

ЗЫ

Вообще держать столь тупорылых программистов и при это не тестировать все и вся — это очень чревато. Я не понимаю на что там в МС надеятся. Это же надо было "исправить" ошибку так, что вместо нервирующих, но не смертельных исключений NullReferenceException начать получат переполнение стека. Ну, хоть 5 грам мозга ведь должно было быть у того кто это сделал? Неужели трудно протестировать исправления? Я уже не говорю о напряжении головного мозга.

А вообще, это от части ошибка которая появилась вследствии бездарного дизайна перегрузки операторов в дотнете и бердового правила, что при переопределении bool Equals(Object obj) надо переопределять и операторы сравнения. В результате с частотой достойной лучшего применения получаются вот такие перлы.

Повбывалбы! (с)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.01.08 11:14
Оценка: 28 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>После чего NavigationBar перестал вылетать с NullReferenceException если m1 == null.

БП>Индусам я об ошибке отписал, они добавили проверку на null. Но похоже и этого мало.
БП>Слушай, может тупо выкинуть все эти операторы?

Код то в .VisualStudio.Package.LanguageService.9.0.dll. Так что или отказываться от ее использования или ничего не поправишь.
Я сделал проще. Переопределил все виртуальные методы и заменил всю раелизацию на собственную Сейчас в СВН лежт версиях где оба класса переопределены и в них все сдублировано.
Вылеты я вроде обошал, но пока комбы как следует не работают (не заполняются). Ну, да это уже мелочи. Будет время — доведу до работоспособности.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.