08 April, 2011

Маленький трюк в XAML

Предположим, что вы, по идейным соображениям (имя сборки меняется от проекта к проекту), не хотите явно указывать имя некой assembly в своем XAML, но хотите использовать класс оттуда. Запись типа
xmlns:RRR="clr-namespace:NNN;assembly=AAA"
вам тут уже не годиться - имя сборки ведь нужно указать точно. Как быть спросите вы? А выход есть. В assembly AAA на которую вы хотите ссылаться нужно указать следующий атрибут
[assembly: XmlnsDefinition("http://UUU", "NNN")]
а в XAML использовать следуюший синтаксис
xmlns:RRR="http://UUU"
и проблема решена.

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 (этом флагом можно манипулировать в любое время). Собственно напоролся на это.