Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > e4xu

Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
Рейтинг: 5.00. Голосов: 4.

"Сокровища" mm.cfg

Запись от wvxvw размещена 11.02.2010 в 20:47
Обновил(-а) wvxvw 12.02.2010 в 20:46

Наткнулся на интерсную статью о недокументированых настройках флешевого дебаг плеера. Предлагаю вашему вниманию сокращенный перевод и немного своих комментариев.

Когда я это нашел, я просто не мог в это поверить!

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

Как вы уже наверное знаете, 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
Есть еще куча других настроек, которые описаны в Adobe FlashPlayer Admin Guide. Но они не документированы!

Тут есть куча вещей о которых стоило бы поговорить и которые бы могли во много раз улучшить ваше понимание флеша.
Вобщем, к делу:

Сокровище

Полный список фич в конце поста, а пока что я хочу обсудить 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
AS3Trace = 1|0

Еще одна полезная штука для дебага.
Она трейсит каждый вызов каждой функции в вашей 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
AS3StaticProfile = 1|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
PreloadSwf=?flashvar1=value&…

Эта настройка восновном нужна для флексового профайлера. Билдер добавляет эту строчку в 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 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
а можно вот в эту фразу ссылки вставить?
Цитата:
опкоды (команды виртуальной машины) или плюшки связаные с контекстным меню и т.п.
Старый 11.02.2010 22:01 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Сделано.
На самом деле надо будет все таки допереводть. Но уже завтра
Старый 11.02.2010 22:13 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
надо было видимо мне уточнить, про опкоды я знал, интересовало что за плюшки в контекстном меню

ждем дальнейший перевод
Старый 12.02.2010 00:35 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Я не знаю то ли автор имел в виду, но тут на флешере тоже недавно попадалась инфа о том как убрать контекстное меню над текстовым полем. Хотя, возможно есть и еще...
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 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Т.е. это просто нужно добавить одну из указанных строк? А то у меня весь конфиг из 3х строк (и структура немного отличается)
Старый 07.05.2010 00:41 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Да, именно так. Если вы пользуетесь последним билдом ФД (с профайлером), то даже увидите одну из этих фич в действии - ФД как раз в этот файл и дописывает путь к профайлер-агенту.
Старый 28.04.2011 19:31 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
что то TraceOutputBuffered совсем не спасает...
Старый 02.05.2011 00:02 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Даж не знаю... могло поменятся с того времени...
Старый 02.05.2011 00:20 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Цитата:
AS3Trace = 1|0
Штука красивая, только с ней аккуратно очень надо. У меня за два часа работы в ФД раздуло файл лога до 700мб, а текстовик 700мб это не хрен с горы... Я тогда не подозревал о таком файлике как мм.кфг, и парился полдня чтоб понять почему у меня окошко логов заспамлено тем что мне не надо и почему комп висит жутко.... (как оказалось в итоге файрбаг пошаманил с настройками в этом конфиге на свое усмотрение и меня не предупредил.)
Старый 04.05.2011 13:57 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Цитата:
Даж не знаю... могло поменятся с того времени...
Не, я вот к чему. Я работаю в флешдевелопе, когда запускаю дебаг с AS3Trace = 1, то падает при любом раскладе, в output panel валятся все трейсы. мб просто его на 0 при таком раскладе в любом случае надо?
Старый 04.05.2011 23:54 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Я почему-то думаю, что ФД их сам дописывает. Но на всякий случай еще бы проверил, что никакие FlashFireBug и им подобные этого не делают
Старый 05.05.2011 12:51 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Цитата:
Я почему-то думаю, что ФД их сам дописывает.
Ну я так понимаю что он из файла логов читает. Разве так и не должно быть?
Старый 05.05.2011 14:56 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Конечно читает, чтение само по себе - незначительная нагрузка. Нагрузка возникает когда часто открывается и закрывается файл. Т.е. предположим, прочитали строку, закрыли, открыли и т.д. - так понятно будет куда хуже. Собственно из названия настройки нужно понимать, что вместо того, чтобы записывать по одной строчке каждый раз, плеер будет собирать строчки в буффере, а потом их все за один раз записывать в файл, тем самым экономя на I/O. Я вот и подумал, что на время запуска флешки FD вполне может сам поменять настройки в mm.cfg, а после закрытия процесса - вернуть. Он так делает когда запускает профайлер, например. Но я не уверен т.как давно не пробовал.
 

 


Часовой пояс GMT +4, время: 16:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.