30 September, 2011

Чем опасен managed DllMain или история одного deadlock'а

Собственно этот пост возник из-за проблемы с dotTrace. При профиляции приложения пользователя программа намертво зависала. Отладка показала, что зависание происходило точно в момент загрузки Microsoft.DirectX.Direct3D.dll внутри профайлерного эвента ModuleLoadFinished(). Другими словами виноват однозначно dotTrace.

07 May, 2011

Коммандная строка и что вы о ней знаете

Каждый разработчик сталкивался с коммандной строкой тем или иным образом. Многие даже писали батнички. Другими словами вам кажется, что вы все знаете о командной строке все. Так? Тогда скажите что будет в массиве argv для вот такой коммандной строки: 1.exe "D:\" C:\\"Program Files\"MyApp

Чтобы получить правильный ответ нужно читать тут.

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-я битными.