Когда выпуск dlls не работает, но отлаживает dlls, делают

Ярлык называется «Связанный символ» в ключевой карте. На Mac по умолчанию используется Ctrl + Cmd + Up, в Windows / Linux - в Ctrl + Alt + Home.

16
задан Torbjørn 15 December 2008 в 13:40
поделиться

9 ответов

По причинам... хорошо, некоторая подсказка признака помогла бы. Одна возможность состоит в том, что у Вас есть код к методу как Debug.WriteLine, который имеет побочные эффекты (т.е. заставляет его работать). Вызовы к методам, отмеченным с [Conditional(...)], не компилируются, если Вам не определили правильные символы - таким образом, что-либо отметило [Conditional("DEBUG")], будет тихо отброшен.

Это могла также быть ошибка компилятора, но это немного маловероятно (но не невозможно).

, Каков признак? Как это повреждается?

Как пример вышеупомянутого:

    static string Bar { get; set; }
    static void Main()
    {
        Bar = "I'm broken";
        Debug.WriteLine(Foo());
        Console.WriteLine(Bar);
    }
    // note Foo only called in DEBUG builds
    static string Foo()
    {
        Bar = "I'm working";
        return "mwahahah";
    }

Скомпилированный в Режиме отладки это печатает, "я работаю"; скомпилированный в режиме RELEASE это печатает, "я повреждаюсь". Это звучит подобным? Проверьте, что Вы не называете методов отладки непосредственно с вещами, которые имеют побочные эффекты. В большинстве случаев можно зафиксировать косвенно:

string foo = Foo();
Debug.WriteLine(foo);

Теперь это называют в любом режиме.

12
ответ дан 30 November 2019 в 16:37
поделиться

Это могло бы быть своего рода состояние состязания, которое Вы имеете, если Вы не работаете в однопоточном коде. Например, если некоторая часть Вашей программы должна выполнить некоторые действия, прежде чем другие части смогут получить доступ к нему, это могло бы перестать работать в режиме выпуска просто, потому что к коду получают доступ слишком рано. У нас когда-то была подобная проблема с некоторым кодом для мобильных телефонов, которые хорошо работали в эмуляторе, но по телефону который был медленнее, sitution не был тем же вообще.

3
ответ дан 30 November 2019 в 16:37
поделиться
Debug.Assert(ImportantMethod());
4
ответ дан 30 November 2019 в 16:37
поделиться

Я видел синхронизацию, которые вызывают проблемы между Отладочной сборкой и Сборкой конечных версий. Вообще Отладочная сборка работает медленнее, чем Сборка конечных версий. Вы могли бы хотеть проверить строго ограниченный во времени раздел своего кода.

4
ответ дан 30 November 2019 в 16:37
поделиться

Вы попробовали включая файлы отладки? (pdbs)

, Если Вы co идете свои настройки проекта и затем компиляция 'вкладка', выбирают Вашу сборку конечных версий в выпадающей близости вершина, затем выбирают усовершенствованные опции компиляции около нижней части, удостоверьтесь, что установили его для создания ПОЛНОЙ отладочной информации, затем повторно развернитесь, необходимо теперь получить более подробную информацию о причине катастрофического отказа.

4
ответ дан 30 November 2019 в 16:37
поделиться

Можно попытаться выключить, Оптимизируют Код в Настройках Сборки. Что является фактической ошибкой, Вы добираетесь.

Другая вещь, которую можно сделать, скомпилировать в режиме выпуска, но включить #Debug условное выражение. Это обработает случай если Ваша Диагностика использования. Отладка и код там производят Ваше приложение.

5
ответ дан 30 November 2019 в 16:37
поделиться

У меня была аналогичная проблема. Моя ситуация такая: Я определил некоторые функции отражения в библиотеке классов A. Затем я определил библиотеку пользовательских элементов управления WPF B, которая использует функции из библиотеки A. Затем я закодировал приложение, которое использует пользовательский элемент управления из библиотеки B и функции в библиотеке A. Когда я использовал отладочную версию библиотеки B, работает нормально. Но когда я использовал релизную версию библиотеки B, функции отражения не работали. Я также определил другие функции в библиотеке A. Кажется, проблемы вызывают только функции отражения. Не могу понять причину. В конце концов, я сдался и переместил функции отражения из библиотеки A в библиотеку B. И это сработало.

0
ответ дан 30 November 2019 в 16:37
поделиться

В какой-то момент у меня была проблема с финализаторами, срабатывающими раньше, чем ожидалось, потому что я не полностью понимал взаимодействие между финализаторами, сборщиком мусора и тем, когда локальный объект считается собираемым ( подсказка: дело не в закрывающей фигурной скобке блока). Если в вашем коде используются финализаторы, вы можете изучить GC.KeepAlive (). В следующем блоке:

void MyFunction() 
{ 
  Foo f = new Foo();
  SomeFunction(f.SomeProp);
}

f становится подходящим для завершения до того, как SomeFunction () даже запустится! Если финализатор сделает что-то вроде удаления всего, что SomeProp выдал, у вас могут возникнуть проблемы. Добавление вызова GC.KeepAlive (f) после вызова SomeFunction гарантирует, что f не подлежит завершению до завершения вызова KeepAlive () .

Редактировать: После всего этого я забыл указать, что эта проблема была гораздо более выраженной при работе в режиме Release. Я не знаю, помещает ли сборка Debug неявные KeepAlives для локальных пользователей в конце функции для удобства отладчика, или сборка мусора просто менее агрессивна, или что-то еще, но в моем случае режим Release значительно усугубил эту проблему.

1
ответ дан 30 November 2019 в 16:37
поделиться

Вы, наверное, знаете это, но, переменные иногда инициализируются по-разному в сборках отладки и выпуска. Например Я думаю, что переменные автоматически инициализируются в отладочных сборках VC6, это может скрыть проблемы, если вы что-то не инициализировали. Я также думаю, что массивы отладки могут использовать сторожевые байты в попытке указать на переполнение. Это тоже может привести к другому поведению.

0
ответ дан 30 November 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: