воскресенье, 20 марта 2011 г.

Макросы с переменным количеством аргументов

Проблема

Есть набор макросов:
#define DBGPRINT(Level, Prefix, Fmt)  \
{                                     \
    if ((Level) >= gDbgLevel)    \
    {                                 \
        DbgPrint(DBGPRINT_PREFIX": %s", Prefix); \
        DbgPrint Fmt;                 \
    }                                 \
}

#define TERSE_FN(Fmt) DBGPRINT(DBG_LEVEL_TERSE, __FUNCTION__"(): ", Fmt)
Данные макросы позволяют выводить отладочную информацию в формате:
MyPrefix: FunctionName(): FormattedMessage
На первый взгляд всё нормально. Но если TERSE_FN вызывается из двух потоков:
Thread 1: TERSE_FN(("Important message with status: %x\n", status));
Thread 2: TERSE_FN(("Another important message with status: %x\n", status));
вывод может быть неконсистентным из за асинхронного использования DbgPrint:
MyPrefix: MyPrefix: Function2(): Another important message with status: 00000000
Function1(): Important message with status: 00000000
Решение

суббота, 19 марта 2011 г.

Установка pykd (Python WinDbg extension)

Данный пост посвящён установке pykd. Что такое pykd и как им пользоваться можно узнать на домашней странице проекта а так же из блога разработчиков.

Начиная с версии 0.0.17 был обновлён инсталлятор, актуальное описание процесса установки здесь.

Инсталлятор присутствует для 2-х платформ: x86 и x64. Разрядность pykd и инсталлятора должна соответствовать разрядности WinDbg. В качестве примера будет рассмотрена установка 64-х битной версии pykd.