04 January, 2011

Проблемы с личными сертификатами под Windows 7 и IE8

Суть проблемы в том, что ваши сертификаты видны через менэджер сертификатов, а вот IE8 чихал на это и всегда показывает пустой список. Соответственно ничего не работает. Оказывается это известная проблема и для нее есть хотфикс, но он особо не офишируется и не доступен через центр обновления. Имя ему - KB977222.

P.S. Проблема актуальна и для Windows Server 2008.

P.P.S. Напоролся на это при настройке КриптоПро CSP.

01 January, 2011

О культуре работы с реестром (Продолжение)

И снова проблемы у наших пользователей (слава богу хоть не массовые), и снова проклятые переменные окружения, которые не чистятся конкурентами. На этот раз все упирается только в IIS 7.x. Оказывается доблестные конкуренты модифицируют переменные окружения для аккаунтов под которыми запускаются пулы приложений. Пара часиков и все готово - версия dotTrace Performance 4.0.2 будет содержать фикс.

Предыдущая серия...

08 December, 2010

Восстановление списка активных тредов во время attach

Список ThreadID для работающих managed тредов нельзя получить через CLR v4 profiling API в чистом виде. Для sampling профайлера это очень серьезная неприятность, так как профайлер не сможет узнать о уже существующих тредах. Он их попросту не увидит.

Но есть не плохой выход - установить флажок COR_PRF_MONITOR_JIT_COMPILATION. Таким образом профайлер сможет получать events о JIT компиляции. Компиляция же происходит достаточно часто и профайлер легко сможет получить ThreadID при помощи вызова GetCurrentThreadID.

P.S. В следующей версии dotTrace, ну той что после 4.0.1, наконец-то будет attach.

26 November, 2010

Определение разрядности работающего процесса

Периодически тредуется код который сможет определить разрядность процесса по его id. Вот пример такого кода:

[DllImport("kernel32.dll", PreserveSig = true, SetLastError = true, ExactSpelling = true)]
private static extern unsafe bool _IsWow64Process(void* hProcess, out bool wow64Process);

private static bool IsWow64Process(Process process)
{
  if (process == null)
    throw new ArgumentNullException("process");
  if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6)
    unsafe
    {
      bool retVal;
      if (_IsWow64Process(process.Handle.ToPointer(), out retVal))
        return retVal;
    }
  return false;
}

public static string GetPointerSize(int processId)
{
  using (Process p = Process.GetProcessById(processId))
    if (IsWow64Process(p))
      return 4;
  switch (IntPtr.Size)
  {
  case 4:
    return IsWow64Process(Process.GetCurrentProcess()) ? 8 : 4;
  case 8:
    return 8;
  default:
    throw new ApplicationException("Unknown pointer size");
  }
}

Attach особенности реализации

Неприятной особенностью интерфейса ICLRMetaHost является то, что поодерживаются только процессы с той же разрядностью, что и у вашего приложения. Другими словами если ваше приложение 64 бита, то и работать вы сможете только с 64-х битными процессами, а если 32 бита, то - только с 32-я битными.

12 November, 2010

О важности default значений

Забавная ситуация происходит, пользователи нам пишут что dotTrace Performance 4.0 работает медленно. С другой стороны многие ли позователь имеют ясное и четкое представление о том чем отличается sampling профиляция от tracing? Понимают ли пользователи, что один вид профиляции принципиально сильно быстрее или медленнее другого и почему это так?

10 November, 2010

Смена семантики COR_PRF_ENABLE_STACK_SNAPSHOT

В .NET Framework v2.0 флаг COR_PRF_ENABLE_STACK_SNAPSHOT входил в группу COR_PRF_MONITOR_IMMUTABLE (флаг можно устанавливать один раз и только во время вызова ICorProfilerCallback::Initialize), а в .NET Framework v4.0 уже входит в группу COR_PRF_ALLOWABLE_AFTER_ATTACH (этом флагом можно манипулировать в любое время). Собственно напоролся на это.

06 November, 2010

Несколько слов о пищеварении профайлеров

Получилось так, что главным заказчиком dotTrace стал ReSharper. А все потому что ReSharper очень серьезное и тяжелое приложение и не каждый профайлер способен проглотить в tracing/line-by-line режимах такой кусок мяса кода и в добавок выжить после такого издевательства.

На сегодня нашим классическим тестом на выносливость является: профиляция процесса загрузки солюшена ReSharper 5.1/6.0 под Visual Studio 2008/2010 с установленным релизным ReSharper 5.1. Перед началом теста все кэши стираются. Расширенный тест предполагает, что после загрузки солюшена запускается анализ солюшена на всю ночь (желателен пустой 500Gb HDD для нашего снапшота).