понедельник, 29 ноября 2010 г.

Как завершает свою работу Outlook 2007

   Оказывается, что для этого он использует TerminateProcess, а не ExitProcess...

воскресенье, 14 ноября 2010 г.

Зависание на Shutdown-е (AVer Quick)

   Иногда при завершении работы системы система мне показывает диалог "Ожидание" со временем переходящее в "Зависание" ([1], Windows XP) с жалобой "Приложение AVer Quick не отвечает".
   AVer Quick (AVerQuick.exe) - это часть ПО от TV-тюнера AverMedia.

вторник, 2 ноября 2010 г.

Анализ дампов Delphi-приложений. CPU spike (Episode #2)

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

воскресенье, 24 октября 2010 г.

Анализ дампов Delphi-приложений. Hang (Episode #2)

   История о зависании плагина для Internet Explorer-a.
   С чего началась история - было замечено, что в определенный момент этот BHO (Browser Helper Object)ля IE прекращал подавать признаки жизни (то бишь - внешние проявление активности). А может даже зависал браузер (детали, к сожалению, уже не помню)...

вторник, 19 октября 2010 г.

Анализ дампов Delphi-приложений. CPU spike (Episode #1)

   Бывают такие моменты, когда приложение вдруг ни с того ни сего начинает проявлять гиперактивность - активно загружает процессор (CPU usage spike). Как правило в такой ситуации "особо старается" один их потоков процесса. На одноядерных (однопроцессорных) машинах это не трудно заметить по ухудшению комфортности работы за машиной.
   В особо тяжелых случаях загружать процессор могут сразу несколько потоков.

четверг, 14 октября 2010 г.

Autoruns

   В операционных системах Microsoft Windows XP, Windows Vista и Windows 7 разделы автозапуска обрабатываются в таком порядке:
  1. <Запрос на вход>
  2. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx]
  3. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]
  4. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
  5. [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
  6. Папка «Автозагрузка»
  7. [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]

четверг, 7 октября 2010 г.

Анализ дампов Delphi-приложений. Hang (Episode #1)

   Преамбула
   Прибегает значит на днях сотрудник тестлаба с криками "Шеф, все пропало, все пропало! Гипс снимают, клиент уезжает!" (с). Тьфу ты - "Все зависло. Ничего не работает".

понедельник, 20 сентября 2010 г.

Delphi WinDbg Extension Dll

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

четверг, 16 сентября 2010 г.

MAPI, Exchange и Shutdown

   Недавно столкнулся с интересным случаем, когда при завершении работы системы отображалось окно "Программа завершается... Пожалуйста подождите" со временем переходящее в "Программа не отвечает". Ситуация воспроизводилась не каждый раз, но более-менее стабильно.
   Т.о. цикл историй о "зависаниях" при завершении работы системы продолжается :).

среда, 1 сентября 2010 г.

Анализ дампов приложений, написанных на Delphi

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

среда, 25 августа 2010 г.

Как создать дамп процесса

   Несколько утилит, с помощью которых можно создать дамп памяти процесса (пользовательский дамп).

вторник, 17 августа 2010 г.

вторник, 27 июля 2010 г.

Простой пример зависшего на shutdown-е приложения

   Небольшой тестовый пример, демонстрирующий методику поиска причины завичания приложения при завершении работы системы [1].

   Практическая часть, так сказать :)

Методика диагностики зависания приложения при shutdown-е

   Исходная позиция: есть некое приложение app.exe (Проблемное приложение), которое "подвисает" при завершении работы системы, в результате чего отображается окно "Программа не отвечает" (либо "Завершение программы").
   Задача: найти отчет на вопрос "почему".
   Цель: решить проблему (в идеале - навсегда).

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

вторник, 1 июня 2010 г.

Запись строк в реестр и Delphi

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

четверг, 20 мая 2010 г.

История о том, как поток заблокировал самого себя

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

   Но обо всем по-порядку...

вторник, 11 мая 2010 г.

Обработка ошибок и GetLastError()

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

среда, 5 мая 2010 г.

WM_QUERYENDSESSION и WM_ENDSESSION (Windows Shutdown)

   Завершение работы Windows или как система завершает пользовательские приложения при Shutdown-e.

понедельник, 3 мая 2010 г.

Маленькая особенность OutputDebugString

   Начиная с Windows 2000, все операционные системы Microsoft линейки NT целиком и полностью построены на Unicode. Все ключевые функции для создания окон, вывода текста, операций со строками и т.д. требуют Unicode-строк. Если какой-то функции Windows передается ANSI-строка, она сначала преобразуется в Unicode и лишь потом передается операционной системе.
   В реализации это выглядит так: для функции доступной через API может существовать две версии: Ansi (принимает строки ANSI) и Wide (принимает строки Unicode) - например CreateProcessA и CreateProcessW. И Ansi-версия является оболочкой (шлюзом) к Wide.

   Но оказывается есть и исключения...

пятница, 16 апреля 2010 г.

Вывод диагностической информации в Process Monitor

   Начиная с версии 2.9 очень полезный инструмент от Марка Руссиновича (Mark Russinovich) и Брюса Когсвелла (Bryce Cogswell) Process Monitor поддерживает новую функциональность - возможность вывода своих диагностических (отладочных) сообщений в Process Monitor, для того чтобы можно было лучше коррелировать выполняемые приложением операции с другими событиями. Аналог OutputDebugString, но вывод показывается Process Monitor-ом (оригинал новости - [1]).

четверг, 15 апреля 2010 г.

SHFileOperation и двойной бэкслеш в MS Vista+

   Код Windows Vista был значительно переработан по сравнению с XP. Я думаю, это хорошо - внутренние ошибки исправляются (а на их место приходят другие - но это уже совсем другая история :)).
   И внешние проявление внутренних переработок могут быть весьма многообразны и совершенно не очевидны.

   Здесь я расскажу об одной особенности функции SHFileOperation, которая проявляется на Висте и выше.

понедельник, 12 апреля 2010 г.

Deadlock при вызове CoRegisterClassObject в DllMain

   В процессе разработки одного плагина для браузера Chrome было замечено, вызов CoRegisterClassObject (ole32.dll) в точке входа динамической библиотеки (DLLMain) в Microsoft Windows Vista/7 приводит к зависанию потока.

   Эксперимент показал, что эта проблема может возникнуть не только с хромом.

воскресенье, 11 апреля 2010 г.

Особенность InitCommonControlsEx в Windows XP

   В Windows XP вызов функции DialogBoxParamW может сразу возвращать управление вместо отображения диалогового окна, при выполнении следующих условий:
  1. у исполняемого файла есть манифест с name="Microsoft.Windows.Common-Controls" в <assemblyIdentity>
  2. в таблице импорта нет ссылок на comctl32.dll

суббота, 10 апреля 2010 г.

CreateToolhelp32Snapshot и многопоточность

   В процессе поиска причины, по который программа аварийно завершается с ошибкой (другими словами просто вылетает), возникло предположение, что функция CreateToolhelp32Snapshot потоко-небезопасна.

пятница, 9 апреля 2010 г.

Первое сообщение

   Здравствуйте.

   Создал блог.
   По первоначальному замыслу, буду писать здесь разные технические вещи. А там посмотрим - может "география" будет расширена :)