почему приложение будет действовать по-другому после подключения отладчика VS?

StackOverflow https://stackoverflow.com/questions/120556

Вопрос

Существует настольное приложение, написанное на С#, которое пытается управлять соединением сокета и терпит неудачу, но добивается успеха после того, как то же приложение подключено к Visual Studio.

как это можно отладить?

Это было полезно?

Решение

Это классический пример тайминга.

Если это работает в отладчике, это означает, что вам придется немного переработать код, чтобы справиться с этим.

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

Другие советы

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

Чтобы отладить его, попробуйте добавить в свое приложение код регистрации, лично я использую log4net

У вас не должно возникнуть проблем с malloc и тому подобным, поскольку вы пишете код на C#.

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

Обычно проблемы со временем.Задействованы ли нити?Если C/C++, то причин может быть много из-за того, как могут вести себя ошибки управления памятью.

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

Если вы выделяете ОЗУ через malloc или new, убедитесь, что память инициализирована правильно, прежде чем использовать ее.

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

При программировании сокетов кажется, что отладка с помощью VisualStudio.Net аналогична выполнению дополнительных вызовов Application.DoEvents().Мы обнаружили, что у нас есть вещи, которые не будут работать (без отладки), если мы не позволим компоненту «дышать» (например,обрабатывать свои собственные события), вызвав Application.DoEvents().

Когда Visual Studio подключается к вашему приложению, CLR и JIT имеют небольшие различия во время выполнения, позволяющие осуществлять отладку.Например, сбор мусора происходит по-другому.

http://stupiddumbguy.blogspot.com/2008/05/net-garbage-collection-behavior-for.html

Возможно, это связано с тем, что вы просматриваете в отладчике свойства с побочными эффектами.Хотя другие ответы здесь более вероятны...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top