Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
9.61 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

Александр «herfleisch» Перечнев (perechnev.com)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

КРОССПЛАТФОРМЕННЫЙ КОДИНГ ДЛЯ МОБИЛЬНЫХ ПЛАТФОРМ

Покоряем iOS, Android, Bada, Symbian и WM с помощью AirPlaySDK

Ни для кого не секрет, что кодинг для мобильников — дело интересное, прибыльное и перспективное. Я всегда запускаю на КПК какую-нибудь игру, когда спускаюсь в метро, то же самое делают и окружающие меня люди. Но, к сожалению, нынешнее разнообразие платформ часто заставляет нас ограничить круг поддерживаемых устройств.

Чтомыимеем?

КомпанияIdeaworks Labs позаботиласьонасисоздалаAirPlaySDK. ДанныйинструментарийпозволяетнаписатькоднаC++ одинрази компилироватьеговнативныеприложениядляплатформiPhone OS, Android, Samsung Bada, Symbian, Windows Mobile, BREW, Palm/ HP WebOS иMaemo. Нукак, впечатляет? Крометого, AirPlaySDK

имеетотличнуюдокументацию(правда, наанглийскомязыке) и позволяетиспользоватьуникальныеособенноститойилииной платформы. ТыможешьбесплатноскачатьAirPlaySDK ссайта airplaysdk.com ипопробовать, a можешьикупитьIndie-лицензию всеголишьза99$.

Созданиепроекта

AirPlaySDK позволяетписатьприложениявWindows иливMac OS,

атакжехорошоинтегрируетсясVisual Studio (начинаясверсии6.0)

иXCode соответственно. ЯбудуориентироватьсянаVisual Studio, но уверен, чтодляXCode всебудетвыглядетьничутьнесложнее. Итак, тыскачалиустановилAirPlaySDK иVisual Studio. Создайпапку"HelloWorld" вкаком-нибудьместесвоегодиска. Именновэтой папкебудетразмещатьсянашпервыйпроект.

ГлавнымфайломвсегорешенияявляетсяHelloWorld.mkb впапке HelloWorld, создадимегоиоткроемдляредактирования, азатем впишемтудаследующеесодержимое:

110

XÀÊÅÐ 05 /148/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

DVD

dvd

Откомментированный и оформленный исходный код ты можешь найти на диске.

 

HTTP://WWW

 

 

 

 

links

 

• На сайте проекта

 

AirPlaySDK можно

 

скачать весь инстру-

 

ментарий, а также

 

найти качествен-

 

ную документацию:

Окно со списком поддерживаемых платформ

airplaysdk.com.

HelloWorld.mkb options { s3e-data-dir="data"

}

files { (source)

HelloWorld.cpp

HelloWorld.h

HelloWorldMain.cpp

}

subprojects { iw2d

}

Здесьпараметрs3e-data-dir секцииoptions определяет папку, вкоторойбудутнаходитьсяресурсыбудущего приложения. Этомогутбытьизображения, музыкаили что-нибудьеще. Создайобъявленнуюнамипапкуdata в папкеHelloWorld. Секцияfiles содержитсписокфайлов проекта. Вскобкахмыуказалипапкуsource, которую тожеследуетсоздать. Внеемыпоместимтри файла: HelloWorld.cpp, HelloWorld.h иHelloWorldMain.cpp. В

секцииsubprojects находятсяназваниябиблиотек, которыемыхотимиспользоватьвсвоемпроекте.

Кроссплатформенный «HelloWorld!»

Итак, подготовкапроектазакончена, имыможемприступитькпрограммированию. Дляэтогощелкнидва разанафайлеHelloWorld.mkb инасладисьлоготипом AirPlaySDK. Насладился? Этоещеневсе, ведьзатемпередтвоимиглазамиоткроетсяпроектвVisual Studio. Вбей вфайлHelloWorldMain.cpp код, приведенныйвоврезке

«HelloWorldMain.cpp», аяпокапоясню, чтотуткчему.

HelloWorldMain.cpp

#include "s3e.h"

#include "HelloWorld.h"

int main() { GameInit(); while (true)

{

s3eDeviceYield(0); s3eKeyboardUpdate();

bool result = GameUpdate(); if ((result == false) ||

(s3eKeyboardGetState(s3eKeyEsc) &

S3E_KEY_STATE_DOWN) || s3eKeyboardGetState(s3eKeyLSK) & S3E_KEY_STATE_DOWN) || (s3eDeviceCheckQuitRequest()))

break; GameRender();

}

GameShutdown();

}

С помощью директивы #include s3e.h мы подключаем стандартный заголовочный файл AirPlaySDK, который дает нам возможность работать с мобильным устройством. Функцию GameInit() мы напишем сами. Она будет инициализировать нужные нам переменные, создавать объекты, загружать ресурсы и выполнять прочие действия сразу же при старте программы. Функция s3eDeviceYield(..) останавливает работу устройства на указанное в параметре время и дает операционной системе возможность выполнить какиенибудь действия. В качестве параметра этой функции мы передали ноль, и потому получим минимально возможную задержку, разрешенную операционной системой. s3eKeyboardUpdate() обновляет информацию о текущем состоянии клавиш мобильника и проверяет, не нажимал ли пользователь какие-либо клавиши во время прохода цикла. Функцию GetUpdate() мы тоже напишем сами. В ней обычно размещается вся логика работы приложения. Если ты пишешь игру — то в этой

• Есть такой сайт, где мелкомягкие бесплатно раздают Visual Studio студентам: dreamspark.com.

INFO

info

Кроме двухмерной графики AirPlaySDK

дает возможность создавать трехмерные игры, работать с GPS, звуками, списками контактов, сетью, видео и кучей других штучек.

WARNING

warning

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

XÀÊÅÐ 05 /148/ 2011

111

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Окно симулятора с нашим HelloWorld-приложением

функции следует проверять, не умер ли очередной монстр после выстрела пользователя. Функция возвращает true, если приложение продолжает свою работу, и false, если, например, пользователь нажал «Выйти из игры». Далее следует проверка, не захотел ли пользователь выйти из приложения, нажав соответствующий пункт меню или клавишу телефона, и не просит ли операционная система наше приложение завершиться (в случае положительного результата завершается главный цикл). Если же приложение должно продолжить работу — идем дальше. В GameRender(), которую мы опять же создадим самостоятельно, идет отрисовка всего и вся на экран. И, наконец, GameShutdown() (уже четвертая пока что несуществующая функция) завершает работу нашего приложения, сохраняя результаты, освобождая память и совершая прочие необходимые операции.

Нучтоже, главнуюфункциюприложениямыразобрали. Стоитотметить, чтофайлHelloWorldMain.cpp — этошаблон. Такойфайлспрактическитемжесодержаниембудетприсутствоватьвовсехпроектах, которыетыбудешьсоздаватьприпомощиAirPlaySDK.

Описываемлогикуприложения

Теперьсамоевремязанятьсяфункциями, которыебудутопределятьнепосредственнологикуприложения. Дляэтогооткройфайл

HelloWorld.cpp ивбейтудакодизврезки«HelloWorld.cpp»:

HelloWorld.cpp

#include "Iw2D.h" void GameInit() { Iw2DInit();

}

bool GameUpdate() { return true;

}

void GameRender() { Iw2DSetColour(0xFF000000); Iw2DFillRect(

CIwSVec2(0, 0), CIwSVec2(Iw2DGetSurfaceWidth(),

Iw2DGetSurfaceHeight()) );

Iw2DSetColour(0xFF00FF00); Iw2DFillArc(

CIwSVec2(Iw2DGetSurfaceWidth()/2, Iw2DGetSurfaceHeight()/2), CIwSVec2(30, 30),

0, 0x800 * 2 );

Iw2DSurfaceShow();

}

void GameShutdown() { Iw2DTerminate();

}

Пример трехмерного приложения в AirPlaySDK

Кактыужезаметил, кодфайлаHelloWorld.cpp содержиттефункции, которыеяобещалописать. Ничегосложноговэтомлистингенет. Он всеголишьзакрашиваетэкранчернымцветомивыводитпосередине зеленыйкруг.

Теперьстоитописатьпрототипыэтихфункцийвзаголовочномфайле HelloWorld.h, чтобыиметьвозможностьихвызоваизглавнойфункции main(). Выглядетьэтобудетследующимобразом:

HelloWorld.h

#ifndef HELLOWORLD_H #define HELLOWORLD_H

void GameInit(); bool GameUpdate(); void GameRender(); void GameShutdown();

#endif

Листингвкомментарияхненуждается. Коднашегоприложенияготов, итыможешьзапуститьегонаисполнение, нажавклавишуF5 вVisual Studio. Передтобойоткроетсяокноэмулятора, котороепродемонстрируетнашепервоетворениенаAirPlaySDK.

Сборкапроекта

Нучтоже, насталовремяпродемонстрироватьглавноепреимуществоAirPlaySDK — переносимостьприложенийсоднойплатформынадругую. Выбери«GCC (ARM) Release» вкачествеактивной конфигурациипроектаинажмиF5. Передтобойпоявитсяокно

Airplay System Deployment Tool. Отметьпункт«ARM GCC Release»

инажми«Next». Следующийшагпокачтонепредставляетдлянас ничегоинтересного, поэтомунажми«Next» ещеразок. Воттут-тои требуетсяотметитьтомногообразиеплатформ, подкотороемыхотим скомпилироватьнашеприложение. ДавайотметимОСBada, нажмем «Deploy All» иподождемокончаниякомпиляциинашегопроекта. НаэтомсозданиепервогоприложениянаосновеAirPlaySDK окончено. Теперьсамоевремяпочитатьдокументациюпоэтомуинструментарию, ведьонподдерживаетогромноеколичествофункций мобильныхустройств, которыетыможешьиспользоватьвсвоих приложениях! z

112

XÀÊÅÐ 05 /148/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Реклама

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

deeonis (deeonis@gmail.com)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Программерские

типсыитриксы

Ловим memory leaks

Локальное

хранилище

потока, или что такое TLS

В «Диспетчере задач» очень часто можно увидеть, что некоторые программы занимают совершенно неприличное количество памяти. Особенно это свойственно интернет-браузерам. Рано или поздно перед каждым разработчиком встает задача отлова утечек памяти. Сегодня мы узнаем, как это сделать в языке C++ на MSVC.

Искать утечки памяти мы будем в ОС Windows, а для сборки кода использовать компилятор от Microsoft. Существует множество способов избежать мемори ликов, но основное правило этой борьбы можно сформулировать как «класть на место все, что взяли». К сожалению, в «боевом кодинге» такое не всегда возможно. Банальный человеческий фактор или сработавший exception запросто может отменить выполнение оператора delete.

В этой статье мы не будем рассматривать, что нужно делать, а что не стоит, чтобы память не утекала. Мы будем действовать в контексте уже имеющейся проблемы: утечка есть и нам надо ее перекрыть.

Для решения этой задачки многие программисты используют сторонние библиотеки (а самые крутые пишут собственные менеджеры памяти), но мы начнем с чего-нибудь попроще — например, воспользуемся средствами Debug CRT.

Debug CRT

Для использования Debug CRT надо подключить соответствующий хидер и включить использование Debug Heap Alloc Map. Делается это всего несколькими строками кода:

ПодключениеDebug CRT

#ifdef _DEBUG #include <crtdbg.h>

#define _CRTDBG_MAP_ALLOC #endif

После этих действий при выделении памяти через new и malloc() данные будут оборачиваться в специальную структуру _CrtMemBlockHeader. С помощью этой обертки мы сможем узнать имя файла и строку, в которой резервировалась ликнутая память, ее объем и сами данные. Все записи объединены в двусвязный список, поэтому по нему можно легко пробежаться и найти проблемные участки.

Структура_CrtMemBlockHeader typedef struct _CrtMemBlockHeader

{

struct _CrtMemBlockHeader * pBlockHeaderNext; struct _CrtMemBlockHeader * pBlockHeaderPrev; char* szFileName;

int nLine;

size_t nDataSize; int nBlackUse; long lRequest;

unsigned char gap[nNoMansLandSize]; unsigned char data[nDataSize];

unsigned char anotherGap[nNoMansLandSize]; } _CrtMemBlockHeader;

Чтобы пройтись по этому списку, нужно воспользоваться функцией _CrtDumpMemoryLeaks(). Она не принимает никаких параметров, а просто выводит список утекших блоков памяти. Но, к сожалению, она ничего не говорит нам о файле и строке, в которых выделялась память. Результат работы этой функции выглядит примерно так:

Вывод_CrtDumpMemoryLeaks()

Detected memory leaks! Dumping objects ->

{163} normal block at 0x00128788, 4 bytes long. Data: < > 00 00 00 00

{162} normal block at 0x00128748, 4 bytes long. Data: < > 00 00 00 00

Object dump complete.

Вот оно как: в Microsoft Visual C++ 6.0 в файле crtdbg.h имело место переопределение функции new, которое должно было точно показать файл и строку, в котором происходило выделение памяти. Но оно не давало желаемого результата — __FILE__:__LINE__ всегда разворачивались в crtdbg.h file line 512. В следующих версиях Microsoft вообще убрали эту фичу, и весь груз ответственности лег на программистов. Сделать нормальный вывод можно с помощью следующего переопределения:

Переопределениеnew

#define new new( _NORMAL_BLOCK, __FILE__, __LINE__)

114

XÀÊÅÐ 05 /148/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Visual Leak Detector

Эту строчку желательно вынести в какой-нибудь общий заголовочный файл и подключать его после crtdbg.h. Теперь перед нами стоит задача записать все это в какой-нибудь лог или хотя бы выводить в консоль. Для перенаправления вывода нам потребуются две функции: _CrtSetReportMode и _CrtSetReportFile. Вторым па-

раметром _CrtSetReportFile может быть хендл нашего лог-файла или флаг вывода в stdout.

Перенаправлениевывода

_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );

// выводим все в stdout

_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );

У этого метода есть еще одна проблемка — он выводит информацию о памяти, которая не утекла, а просто не успела вернуться. Это, например, может быть какая-нибудь глобальная переменная или объект. Нам нужно как-то удалить эти куски памяти из вывода _CrtDumpMemoryLeaks(). Делается это следующим образом:

Ограничениезоныдействия_CrtDumpMemoryLeaks() int _tmain(int argc, _TCHAR* argv[])

{

_CrtMemState _ms; _CrtMemCheckpoint(&_ms);

// some logic goes here...

_CrtMemDumpAllObjectsSince(&_ms); return 0;

}

Мы записываем начальное состояние памяти в специальную структуру с помощью функции _CrtMemCheckpoint(), а в конце, ис-

пользуя _CrtMemDumpAllObjectsSince(), выводим все, что утекло после того, как мы сделали слепок памяти.

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

VisualLeakDetector

Visual Leak Detector — это уже сторонняя библиотека, но по сути она является надстройкой над Debug CRT, которую мы рассмотрели чуть раньше. Пользоваться ей достаточно просто — надо всего лишь включить заголовочный файл vld.h в любой файл проекта. Но с двумя оговорками.

Во-первых, если у нас в проекте есть несколько бинарных модулей (DLL или EXE), то include для vld.h надо делать как минимум в одном исходном файле для каждого модуля. То есть, если у нас после компиляции на выходе получается module_1.dll и

module_2.dll, то нам нужно сделать #include <vld.h> как минимум в module_1.h и в module_2.h.

Во-вторых, включение заголовочного файла Visual Leak Detector должно происходить после включения прекомпилед хидера. То есть, после stdafx.h и других подобных файлов. После выполнения этих условий достаточно запустить программу в дебаг-сборке, и библиотека сразу начнет работать.

Visual Leak Detector можно настроить под свои нужды. Конфиг хранится в файле vld.ini, который, в свою очередь, лежит в директории с установленным VLD. Файл с настройками можно скопировать в папку с проектом, и тогда библиотека будет использовать эту

XÀÊÅÐ 05 /148/ 2011

115

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

CODING

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Официальный сайт Valgrind

копию с индивидуальными настройками для каждого проекта. Параметров для тюнинга Visual Leak Detector предостаточно. Например, можно настроить тот же вывод в файл или в дебаг консоль студии. Делается это ключом ReportTo. По умолчанию там стоит «debugger», но можно заменить это значение на «file» или «both». Надеюсь, их смысл пояснять не нужно.

Если мы включим вывод в файл, то надо указать путь к этому файлу с помощью параметра ReportFile. Также можно выбрать кодировку файла с помощью ReportEncoding: unicode или ASCII.

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

ERROR: Visual Leak Detector: Detected a memory leak

internal to Visual Leak Detector.

Еще VLD позволяет ограничить размер дампа памяти, выводимого в лог, или вообще подавить этот вывод, настроить глубину и метод проходки по стеку и так далее. Но это уже специфичные вещи, которые некоторым могут пригодиться, а некоторым и нет. В общем и целом Visual Leak Detector прост, удобен и не требует много кода для включения режима поиска утечек.

Valgrind

Все, что мы рассмотрели выше, было актуально для Windows и MS Visual Studio. Но есть и другие ОС. Valgrind как раз для них. Он работает в Linux и Mac OS X и используется не только для отлова мемори ликов, но и для отладки памяти и профилирования (сбор

116

характеристик работы программы). По сути, Valgrind является виртуальной машиной, использующей методы JIT-компиляции. Ее усилиями программа не выполняется непосредственно на процессоре компьютера, а транслируется в так называемое «промежуточное представление». С этим представлением и работает Valgrind. Точнее, работают его инструменты, но об этом чуть позже.

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

Как я говорил выше, Valgrind предоставляет несколько инструментов. Самый популярный из них — Memcheck. Он заменяет стандартное выделение памяти языка C собственной реализацией. Memcheck обнаруживает попытки использования неинициализированной памяти, чтение/запись после её освобождения и с конца выделенного блока, а также утечки памяти.

Есть и другие инструменты, например Addrcheck — более легкая, но менее функциональная версия Memcheck. Инструменты Helgrind и DRD используются для поиска ошибок в многопоточном коде. Иначе говоря, Valgrind гораздо более мощная штука, чем просто библиотека по поиску мемори ликов.

Заключение

Утечки памяти — одна из самых распространенных проблем в программировании. Даже самые опытные из нас могут заиметь парочку ликов. Инструментов для их отлова великое множество, и эти несколько страниц должны помочь тебе начать борьбу с memory leaks. z

XÀÊÅÐ 05 /148/ 2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

ПОДПИСКА

ГОДОВАЯ ЭКОНОМИЯ 500 ðóá.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

1.Разборчиво заполни подписной купон и квитанцию, вырезав их из журнала, сделав ксерокопию или распечатав с сайта shop. glc.ru.

2.Оплати подписку через любой банк.

3.Вышли в редакцию копию подписных документов — купона и квитанции — любым из нижеперечисленных способов:

на e-mail: subscribe@glc.ru;

по факсу: (495) 545-09-06;

почтой по адресу: 115280, Москва,

ул. Ленинская Слобода, 19, Омега плаза, 5 эт., офис № 21,

ООО «Гейм Лэнд», отдел подписки.

Внимание! Если произвести оплату в феврале, то подписку можно оформить с апреля.

Единая цена по всей России. Доставка за счет издателя, в том числе курьером по Москве в пределах МКАД

12 НОМЕРОВ — 2200 ÐÓÁ.

6 НОМЕРОВ — 1260 ÐÓÁ.

УЗНАЙ, КАК САМОСТОЯТЕЛЬНО ПОЛУЧИТЬ ЖУРНАЛ НАМНОГО ДЕШЕВЛЕ!

ПРИ ПОДПИСКЕ НА КОМПЛЕКТ ЖУРНАЛОВ

ЖЕЛЕЗО + ХАКЕР + 2 DVD: — ОДИН НОМЕР ВСЕГО ЗА 162 РУБЛЯ (НА 35% ДЕШЕВЛЕ, ЧЕМ В РОЗНИЦУ)

ЗА 12 МЕСЯЦЕВ 3890 РУБЛЕЙ (24 НОМЕРА) ЗА 6 МЕСЯЦЕВ 2205 РУБЛЕЙ (12 НОМЕРОВ)

ЕСТЬ ВОПРОСЫ? Пиши на info@glc.ru или звони по бесплатным телефонам 8(495)663-82-77 (для москвичей) и 8 (800) 200-3- 999 (для жителей других регионов России, абонентов сетей МТС, БиЛайн и Мегафон).

ПРОШУ ОФОРМИТЬ ПОДПИСКУ НА ЖУРНАЛ «ХАКЕР»

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

SYN/ACK

Сергей «grinder» Яремчук (grinder@tux.in.ua)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

-

 

 

n

e

 

 

 

 

 

x cha

 

 

 

 

SaaS для малого

и среднего бизнеса

Переводим стандартные сервисы в облако

Развитие всего в этом мире идет по спирали, и IT-технологии — не исключение. После эпохи ПК разработчикам ПО (да и самим пользователям) стали интересны онлайн-ресурсы, предлагающие замену привычным программам. Доля таких решений на рынке постепенно увеличивается, и сегодня вместо того, чтобы покупать коробку, можно просто подключиться к сервису, обеспечивающему нужный функционал.

ВчемпреимуществаSaaS?

КлассическаясхемапокупкиПОворганизациивыглядиттак. АдминистраторпокупаетОЕMиликоробочнуюверсию, которуюиустанавливаетнапользовательскомПКилисервере. Кэтомупривыкли, многие считаюттакоймеханизмудобнымипонятным. Вотпрограмма, воткомпьютер, накоторомонавыполняется. Постепеннопришликтому, что хранитьспециализированные(и, какправило, дорогие) приложения наперсональномкомпьютеренескольконакладно, витогепоявились серверытерминаловивиртуальныедесктопы, отчастирешающие проблемууменьшенияколичествакопий. Новзаменпоявиласьнеобходимостьвразвертыванииотдельногосервиса, длякотороготребуетсяоборудование, местовстойкеи, опятьже, ПО. Добавимкэтомуи стандартныйнаборлюбойорганизации— почтовыйсервисгрупповой работы, CRM, корпоративныйантивирус, сервисвидеоконференцийи другие. Всеэтохозяйствотребуетденегнаподдержание, включаясо- держаниештатахорошоподготовленныхIT-сотрудников, обновление ПОижелеза, потреблениебольшогоколичестваэлектроэнергииитак далее. Тоесть, привнедренииполучаемзначительныезатраты, даже безучеталицензийнасамоПО. Приэтомневсегдавыбранныйпродуктможетобеспечиватьтребуемуюфункциональность. Например, так частобываетсCRM-системами, которыенеподходятподтребования конкретнойорганизациииливообщеихвнедрениепоразнымпричинампрошлонеудачно. Новедьопределенныезатратыужепонесены. Плюссовременемкупленнаяпрограмматребуетобновления, зачто вбольшинствеслучаевтакженеобходимодоплачиватьи, вероятно, докупатьболеемощныйсервер. Крометого, организациябезопасногодоступаксервисуполностьюложитсянаплечиайтишников, от подготовкикоторыхзависитрезультат. ИспользованиеVPN выручает лишьотчасти, таккакпровайдерычастоблокируютнестандартные порты, чтосоздаетдополнительныетрудности. Асдругойстороныэтой проблемынаходятсякомпании-разработчикиПО, которыетеряют большиеденьгииз-запиратства. Вобщем, ситуация, какнипосмотри, малокогорадует.

Предоставлениеподпискинаопределенныйсервис(SaaS, Software as a Service) позволяетдогнатьсразудвухзайцев. Организация практическисразуполучаетдоступкнеобходимымприложениям, без большихначальныхзатратитрудностейпервоначальноговнедрения. Приэтомвдальнейшемдоплатапроизводитсяисключительноза продлениеподпискии, какправило, ужесоскидкой, нетребуясредств наподдержаниеинфраструктуры. Новыевозможностиподписчик получаетавтоматически(впределахтарифа, разумеется). Некоторые сервисыпредлагаютпомесячнуюоплату, поэтомунапериодотпусков можносэкономить, взявменьшееколичестволицензий. Тестовый период, предоставляемыйпрактическивсемиресурсамиSaaS, дает

возможностьопределитьсясвыборомконкретногорешения. Софтверныекомпании, реализуяпродуктыввидеSaaS, полностью решаютпроблемупиратства. Врамкахэтойстатьимыпостараемся разобратьсявтом, чтоименноонинампредлагают.

Корпоративнаяпочта

Конечно, вслучаесэлектроннойпочтоймногиепытаютсясэкономить, выбравбесплатныесервисы. Длякомпанийэтоневыход– кписьмам, отправленнымсбесплатнойпочты, уклиентовкомпаниидоверия небудет. Даинесолидноэто, ведьналичиесвоегодомена– одиниз признаковсерьезностиорганизации. Внастоящеевремянекоторые

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

Срединих— Яндекс.Почтадлядомена(pdd.yandex.ru). Простоука-

зываемадресдомена(вспискеужеприсутствуютдомены, прописанныевЯндекс.Вебмастер) иредактируемMX-записьпополученной подсказке. Этовсе. Администраторполучаетинтерфейс, припомощи которогоонможетуправлятьпочтовымиаккаунтами. ВозможендоступпользователейпопротоколамPOP3/IMAP, черезвеб-интерфейс имобильныеустройства. Плюсмгновенныесообщениячерез Я.Онлайн, почтоваякнигаиприятныемелочивродеЯндекс.Бар длябраузера. Поумолчаниюподдерживается1000 аккаунтов, этого обычноболеечемдостаточно(иначелучшевсе-такисвойсервер), ноихчисломожноувеличить. Причемзаметь, всеэтобесплатно. Что, сучетомизвестнойстабильностияндексовыхсерверов, делает ихпредложениеболеечемзаманчивым. Гуглтакжепредоставляет возможностьпривязатьдоменкпочте, причемвнесколькихвариантах. СтандартныйпакетGoogle Apps длябизнеса(google.com/apps/ intl/ru/business) даетнамполныйспектрприложений— почтаGMail

спривязкойккорпоративномудомену, общийкалендарьсосписком задач, документы, группы, сайтыивидеоGoogle. Размерпочтового ящикаограничен2 Гб. Функционалприложенийизвестенлюбому пользователю, имеющемуящикнаGMail. Ногуглпошелещедальше. Выбравпрофессиональныйпакет(50$ зааккаунтвгод) получаемувеличенныйдо25 Гбобъемпочтовогоящика, гарантиюбесперебойной работы, поддержку, возможностьпереносадействующихпочтовых аккаунтовнаGmail, доступкAPI-расширениям, позволяющиминте- грироватьразличныеИТ-системы. Крометого, подписчикиполучают доступксистемебезопасностиэлектроннойпочтыPostini, обеспечивающейулучшеннуюфильтрациюспамаивирусов, шифрование

сTLS, настраиваемыеправилаобработкивложений, архивациюи восстановление, поискиэкспортписем. Первыетридцатьднейуказаннымивкусностямиможнопользоватьсябесплатно. Длясомневающихсяввыборедоступны«Историиуспеха», вкоторыхдействующие

118

XÀÊÅÐ 05 /148/ 2011

Соседние файлы в папке журнал хакер