Как обнаружить и отладить проблемы многопоточности?

У вас есть проблема с порядком обработки в IIS. Включения на стороне сервера выполняются до обработки сценария VBScript. Используйте другой метод для включения предпочтительного сценария на своей странице -

. Пример в этой ссылке: http://www.4guysfromrolla.com/webtech/022504-1.shtml [ 114]

Пример кода:

<%
Dim strInclude
Dim I_want_to_include_file_1
I_want_to_include_file_1 = True

If I_want_to_include_file_1 = True Then
  strInclude = getMappedFileAsString("include1.asp")
Else
  strInclude = getMappedFileAsString("include2.asp")
End If

Execute strInclude
%>

Поскольку этот метод не использует встроенное включение IIS, код будет запускаться при запуске страницы, но будет только один файл. включен. Код для функции getMappedFileAsString (filepath) показан ниже. По сути, он захватывает полное содержимое указанного пути к файлу, возвращая содержимое файла в виде строки.

blockquote>
Function getMappedFileAsString(byVal strFilename)
  Const ForReading = 1

  Dim fso
  Set fso = Server.CreateObject("Scripting.FilesystemObject")

  Dim ts
  Set ts = fso.OpenTextFile(Server.MapPath(strFilename), ForReading)

  getMappedFileAsString = ts.ReadAll
  ts.close

  Set ts = nothing
  Set fso = Nothing
End Function

65
задан Community 23 May 2017 в 11:33
поделиться

10 ответов

проблемы Поточной обработки/параллелизма известно трудно копировать - который является одной из причин, почему необходимо разработать, чтобы избежать или по крайней мере минимизировать вероятности. Это - причина, неизменные объекты так ценны. Попытайтесь изолировать изменяемые объекты к единственному потоку и затем тщательно управлять обменом изменяемыми объектами между потоками. Попытайтесь программировать с дизайном объектной передачи, а не "совместно использованными" объектами. Для последнего используйте полностью синхронизируемые объекты управления (которые легче обосновать о), и постарайтесь не иметь синхронизируемый объект, используют другие объекты, которые должны также синхронизироваться - то есть, попытаться сохранить их сам содержавшими. Ваша лучшая защита является хорошим дизайном.

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

Динамические взаимоблокировки более трудны - способность наблюдать систему, в то время как в состоянии ошибки Ваш лучший выбор там.

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

, Чем более сложно система, тем, тяжелее это находить параллелизм ошибки, и рассуждать, об это поведение. Используйте инструменты как JVisualVM и удаленные профилировщики подключения - они могут быть жизненным средством сохранения, если можно соединиться с системой в состоянии ошибки и осмотреть потоки и объекты.

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

Одна последняя вещь, попытайтесь использовать объекты параллелизма, распределенные с системными библиотеками - например, в Java java.util.concurrent Ваш друг. Запись Ваших собственных объектов управления совместным выполнением трудна и чревата опасностью; оставьте это экспертам, если у Вас есть выбор.

80
ответ дан Hearen 24 November 2019 в 15:27
поделиться

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

-9
ответ дан max 24 November 2019 в 15:27
поделиться

Разработайте код способ, которым Принцесса рекомендовала для Вашего другого вопроса (Неизменные объекты и передача сообщений Erlang-стиля). Будет легче обнаружить проблемы многопоточности, потому что взаимодействия между потоками будут четко определены.

0
ответ дан Community 24 November 2019 в 15:27
поделиться

утверждайте (), Ваш друг для обнаружения условий состязания. Каждый раз, когда Вы вводите критический раздел, утверждаете, что инвариант, связанный с ним, верен (это - то, что CS для). Хотя к сожалению, проверка могла бы быть дорогой и таким образом не подойти для использования в продуктивной среде.

1
ответ дан zvrba 24 November 2019 в 15:27
поделиться

Visual Studio позволяет Вам осматривать стек вызовов каждого потока, и можно переключиться между ними. Ни в коем случае не достаточно отследить все виды поточной обработки проблем, но это - запуск. Много улучшений для многопоточной отладки планируется предстоящий VS2010.

я использовал WinDbg + SoS для поточной обработки проблем в коде.NET. Можно осмотреть блокировки (синхронизируйте blokcs), распараллельте стеки вызовов и т.д.

1
ответ дан Brian Rasmussen 24 November 2019 в 15:27
поделиться

Кроме дампов катастрофического отказа, техника является обширным входом во время выполнения: где каждый поток регистрирует то, что он делает.

первый вопрос, когда об ошибке сообщают, затем, мог бы быть, "Где файл журнала?"

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

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

5
ответ дан ChrisW 24 November 2019 в 15:27
поделиться

блог Tess Ferrandez имеет хорошие примеры использования WinDbg для отладки мертвых блокировок в.NET.

1
ответ дан Sean 24 November 2019 в 15:27
поделиться

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

5
ответ дан mghie 24 November 2019 в 15:27
поделиться

Принятие у меня есть сообщения о проблемах, которые трудны воспроизвести меня всегда, находит их путем чтения кода, предпочтительно парное чтение кода, таким образом, можно обсудить потребности семантики/блокировки поточной обработки. Когда мы делаем это на основе проблема, о которой сообщают , я всегда нахожу нас гвоздем одна или несколько проблем справедливо быстро. Я думаю, что это - также довольно дешевая техника для решения тяжелых проблем.

Извините за неспособность сказать Вам нажимать ctrl+shift+f13, но я не думаю, существует что-либо как этот доступный. Но просто думая приблизительно , что проблема, о которой сообщают, на самом деле обычно, дают довольно строгое умение ориентироваться в коде, таким образом, Вы не должны запускать в основном ().

5
ответ дан krosenvold 24 November 2019 в 15:27
поделиться

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

Только изменяют общее состояние в критическом разделе (Взаимное исключение)

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

Использование предварительно создало абстракции каждый раз, когда возможный (Как материал в java.util.concurrent)

кроме того, некоторые аналитические инструменты могут обнаружить некоторые потенциальные проблемы. Например, FindBugs может найти некоторые проблемы поточной обработки в программах Java. Такие инструменты не могут найти все проблемы (они не серебряные пули), но они могут помочь.

Как vanslly указывает в комментарии на этот ответ, изучение хорошо помещенного вывода входа может также очень полезный, но остерегаться Heisenbugs.

7
ответ дан Community 24 November 2019 в 15:27
поделиться
Другие вопросы по тегам:

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