Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
"Сокровища" mm.cfg
Наткнулся на интерсную статью о недокументированых настройках флешевого дебаг плеера. Предлагаю вашему вниманию сокращенный перевод и немного своих комментариев.
Когда я это нашел, я просто не мог в это поверить!
Я конечно подозревал, что во флеше есть разные недокументированые возможности, такие как например опкоды (команды виртуальной машины) По работе с памятью, или плюшки связаные с контекстным меню и т.п. Но я никогда и не подозревал, что в самом флеш плеере есть инструменты которые бы помогали отыскивать баги или помогали лучше понять, как интерпретируестся код.
Как вы уже наверное знаете, mm.cfg файл находится в:
- Windows; C:\Documents and Settings\username\mm.cfg
- OSX; /Library/Application Support/Macromedia/mm.cfg
- Linux; home/username/mm.cfg
Это файл настроек для флеш плеера, который он считывает перед тем, как запустить новую SWF.
Вот типичный набор параметров:
Код:
ErrorReportingEnable=1 TraceOutputFileEnable=1 TraceOutputFileName=c:\logs\flashlogs.txt MaxWarnings=50
Тут есть куча вещей о которых стоило бы поговорить и которые бы могли во много раз улучшить ваше понимание флеша.
Вобщем, к делу:
Сокровище
Полный список фич в конце поста, а пока что я хочу обсудить 7 моих "любимых":
TraceOutputBuffered = 1|0
Эта фича просто необходима для того, чтобы вы смогли по-нормальному воспользоваться остальными имеющимися в наличие потому, что вам прийдется разгребать кучу текста в flashlog файле (куча - это может несколько мегабайт! Так что осторожно).
Это очень простенькая настройка, но она много чего меняет. Не случалось ли у вас, что трейсов было столько, что они пропадали из лога и лог при этом еще активно лагал?
Если не случалось - попробуйте создайте цикл на 1000000 операций и потрейсите чего-нибудь внутри цикла, - 100% загрузки ЦПЮ вам гарантированы на несколько минут.
Так вот, если вы выставите эту настройку в true, то сообщения будут складываться в буффер и выводится пачками. По моим тестам я мог вывести 3600 строк в лог при этом ЦПЮ был загружен на 100%, но если это включить, то я могу распечатать 1000000 строк и при этом камень будет холодным как лед! (ну это я уже загнул :-) )
AS3Verbose = 1|0
Это - нечто!
Трейсит подробную инфу о SWF байткоде и о том как он распарсился в плеере!
Никаких дополнительных програм не нужно, фреймворков и т.п. для того чтобы просмотреть во что скомпилировалась ваша флешка - всего-то одна настройка!
Код:
verify Main/CallFoo() define incoming args @0 arg 0 @1 arg 0 @2 arg 0 @3 arg 0 @4 arg 0 @5 arg 0 alloc local traits @6 alloc 4 @7 alloc 8 alloc CallStackNode @8 alloc 48 param 0 @9 ldop 0(@5) @10 imm 4 debug_enter @11 imm 0 @12 imm 1 @13 lea 0(@7) @14 lea 0(@8) @15 lea 0(@6) save state @16 def @9 @17 imm 165651400 @18 st 0(@6) <- @17 @19 usea @16 @20 st 0(@7) <- @19 @21 def @10 cse @11 @22 st 4(@7) <- @11 @23 cm MethodEnv::debugEnter (@3, @4, @5, @15, @12, @14, @13, @11) @26 ld 164427072(0) cse @11 @27 ucmp @26 @11 @28 jne @27 -> 0 @29 alloc 0 stack: scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$] locals: Main@16
Еще одна полезная штука для дебага.
Она трейсит каждый вызов каждой функции в вашей SWF. Это все равно что если бы у вас в каждой функции распечатывался Error#getStackTrace().
Если плеер падает, то с этой настройкой вы всегда сможете точно определить, кто же его уронил. Более того, даже вызовы Timer'a показываются!
Код:
255552 AVMINF: MTHD ProfilerAgent/stopProfiling () @ 0x05DA35A0 1255552 AVMINF: MTHD global/flash.sampler::stopSampling () @ 0x0A8C2B20 1255553 AVMINF: MTHD flash.display::DisplayObject/get root () @ 0x0A8C06B0 1255553 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255553 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255553 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255553 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255553 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255553 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255553 AVMINF: MTHD flash.net::Socket/flush () @ 0x0A8C2AD0 1255553 AVMINF: MTHD flash.net::Socket/close () @ 0x0A8C2B70 1255553 AVMINF: MTHD flash.net::Socket/_init () @ 0x0A8C0DF0 1255553 AVMINF: MTHD flash.utils::Timer/stop () @ 0x0A8C2CB0 1255554 AVMINF: MTHD flash.utils::Timer/reset () @ 0x0A8C1B20 1255554 AVMINF: MTHD flash.utils::Timer/get running () @ 0x0A8C1C30 1255554 AVMINF: MTHD flash.net::Socket/internalClose () @ 0x0A8C2D00 1255554 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0x0A8C2110 1255554 AVMINF: MTHD flash.utils::Timer/stop () @ 0x0A8C2CB0 1255554 AVMINF: MTHD flash.system::System$/resume () @ 0x0A8C2D50 1256675 AVMINF: MTHD flash.utils::Timer/tick () @ 0x0A8C2DA0 1256675 AVMINF: MTHD flash.utils::Timer/_timerDispatch () @ 0x0A8C2FF0 1256675 AVMINF: MTHD flash.events::TimerEvent () @ 0x0A8C3040 1256675 AVMINF: MTHD flash.events::Event () @ 0x0A8C1AC0 1256675 AVMINF: MTHD Main/OnTimer () @ 0x00B70910 1256675 AVMINF: MTHD global/trace () @ 0x0A8C2170 MyTimer 1258705 AVMINF: MTHD flash.utils::Timer/tick () @ 0
Эта настройка позволяет увидеть логи JIT'a (Just in Time Compiler - NanoJIT который используется во Флеш и Тамарине).
Распечатывается информация о конвертации функций, конвертации байткода в целом, полученый MIR (machine-dependent intermediate representation), расходе памайти и т.п.
В конце еще и статистика об использовании опкодов (количество использований, относительная важность и т.п.)
Код:
size profile Main/CallFoo abc 12 mir 880 md 204 1773K mir/s 74K md/s 96% in compile during 854 micros 204 bytes from 55 MIR instructions 61 MD. max span 0 cse 7 dead 0 76 bytes of stack with 5 spills 5 steals 5 remats using 0 times size profile Main/CallFooBar abc 23 mir 1088 md 262 2386K mir/s 85K md/s 96% in compile during 921 micros 262 bytes from 68 MIR instructions 76 MD. max span 0 cse 10 dead 0 88 bytes of stack with 8 spills 7 steals 5 remats using 0 times
Эта настройка восновном нужна для флексового профайлера. Билдер добавляет эту строчку в mm.cfg перед тем как запустить вашу SWF в профайлере.
По умолчанию он добавляет следующее:
C:/Documents and Settings/{USER}/My Documents/Flex Builder 3/.metadata/.plugins/com.adobe.flash.profiler/ProfilerAgent.swf?host=localhost&port=9999
(ну это при условии, что воркспейс эклипса у вас там, а не в другом месте, вообще - лучше воркспейс не делать на системном диске, подальше от лукавого - прим. пер.) ProfilerAgent.swf - это флешка с классами нужными для работы профайлера, она собирает инфо из вашей основной флешке и отсылает ее билдреу через сокет.
Если вы поменяете host в параметрах на имя любой другой машины, вы, таким образом, зможете профайлить флешку запущеную с той (другой) машины. Когда вы подключаетесь таким образом, вам нужно будет закликнуть “wait for application” в настройках профайлера, после чего запустить нужную флешку. (Если чесно, я вроде пробовал подключаться и к уже запущеной флешке - вроде работало... - прим. пер.)
Листинги укорочены (на самом деле они просто очень длинные и приводить их полностью - бессмысленно).
Продолжение
Всего комментариев 14
Комментарии
11.02.2010 21:37 | |
а можно вот в эту фразу ссылки вставить?
Цитата:
опкоды (команды виртуальной машины) или плюшки связаные с контекстным меню и т.п.
|
11.02.2010 22:01 | |
Сделано.
На самом деле надо будет все таки допереводть. Но уже завтра |
11.02.2010 22:13 | |
надо было видимо мне уточнить, про опкоды я знал, интересовало что за плюшки в контекстном меню
ждем дальнейший перевод |
12.02.2010 00:35 | |
Я не знаю то ли автор имел в виду, но тут на флешере тоже недавно попадалась инфа о том как убрать контекстное меню над текстовым полем. Хотя, возможно есть и еще...
http://flasher.ru/forum/showthread.p...=clipboardMenu |
12.02.2010 09:28 | |
супер, особенно приятен AS3Trace = 1..единственно - не хватает там объекта вызвавшего ф-цию,или еще лучше его toString. хотя его можно отследить по AS3Verbose..
в общем можно очень даже хитрыеинтсрументики сделать ( побежал учить C# для конструирования плагинов по FD ) можно прям по этому логу строить sequenceDiagramm, да еще и с временем выполнения.. А вот про кастомный профайлер ( в оригинальной статье) что-то не совсем понял.. |
|
Обновил(-а) Котяра 12.02.2010 в 09:56
|
04.05.2010 17:23 | |
Т.е. это просто нужно добавить одну из указанных строк? А то у меня весь конфиг из 3х строк (и структура немного отличается)
|
07.05.2010 00:41 | |
Да, именно так. Если вы пользуетесь последним билдом ФД (с профайлером), то даже увидите одну из этих фич в действии - ФД как раз в этот файл и дописывает путь к профайлер-агенту.
|
28.04.2011 19:31 | |
что то TraceOutputBuffered совсем не спасает...
|
02.05.2011 00:02 | |
Даж не знаю... могло поменятся с того времени...
|
04.05.2011 23:54 | |
Я почему-то думаю, что ФД их сам дописывает. Но на всякий случай еще бы проверил, что никакие FlashFireBug и им подобные этого не делают
|
05.05.2011 12:51 | |
Цитата:
Я почему-то думаю, что ФД их сам дописывает.
|
Последние записи от wvxvw
- Dired - текстовый проводник по файловой системе (29.06.2013)
- Навигация по HTML с WASD (09.06.2012)
- JavaScript, все не так плохо (07.06.2012)
- Что такое tarball и чем его пакуют (11.04.2012)
- Критика Presentation Model (18.02.2012)