2011-02-09 3 views
0

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

У меня есть VS C# решение с тремя проектами в нем. Существует проект библиотеки классов, а затем два приложения, которые зависят от этой библиотеки классов. Библиотека классов в свою очередь зависит от нескольких других DLL, включая avalonedit dll от проекта sharpdevelop.

Одним из приложений является создание и работа в порядке, в том числе использование моего собственного элемента управления, который обертывает элемент управления avalonedit. Другое приложение не работает, и оно, кажется, терпит неудачу в момент, когда элемент управления avalonedit инициализируется через XAML в моем элементе управления оберткой.

Проблема в том, что я вообще не вижу ошибок в отладочном выходе, все, что я вижу, - это сообщение, загруженное dll, а затем ничего. Если я вхожу в конструктор моего контроля, шаг никогда не завершается. Отладчик говорит, что приложение работает, но оно, по-видимому, вращается где-то в dll avalonedit, когда базовый элемент управления редактированием создается стороной XAML.

Я должен предположить, что есть какая-то проблема с разницей в окружающей среде между двумя проектами, но я немного зациклен на том, как продолжить отслеживание проблемы. Должен ли я как-то уладить вопросы, чтобы я мог переломить источник avalonedit?

Редактировать: Если я приостанавливаю/прерываю все, это просто возвращается к строке, вызывающей мой конструктор управления.

+0

Что произойдет, если вы приостановите отладчик во время зависания? – SLaks

+0

Здесь [Reflector] (http://www.red-gate.com/products/dotnet-development/reflector/) пригодится! – Mayank

+1

Я предлагаю выбрать источник (и/или PDB) AvalonEdit, а затем нажать паузу в отладчике, чтобы увидеть проблему. Другим подходом было бы проверить источник конструктора avalonedit с использованием Reflector (по предложению Майанка), чтобы увидеть потенциальную причину цикла. – VinayC

ответ

1

Звучит как тупик. Внимательно посмотрите на все потоки, их трассировки стека и примитивы синхронизации (блокировки, семафоры и т. Д.). Имейте в виду: рекомендуемые ресурсы могут быть неактивными (например, когда вы находитесь внутри статического конструктора, ожидающего чего-то, что пытается получить доступ к статическому полю создаваемого типа, вы получаете тупик).

Существует множество способов введения тупика, но нет простых советов по его устранению. Вы также можете включить перерыв во всех исключениях в Visual Studio (Debug -> Exceptions ... and tick CLR Exceptions).

Если это не поможет вам обнаружить следы стека здесь, и, возможно, кто-то может обнаружить проблему.