книги хакеры / журнал хакер / 148_Optimized
.pdf
|
|
|
|
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 |