From d505eeee6adf7c95b630cea500bdea13938b2bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 5 Aug 2024 09:58:19 +0200 Subject: [PATCH] Fixed twolevel nested debugging --- .../flash/debugger/DebugConnection.as | 41 +++++--- .../ffdec_lib/testdata/debug_inner/inner.swf | Bin 3735 -> 4049 bytes .../debug_inner/inner/obj/InnerSWFConfig.old | 6 +- .../debug_inner/inner/obj/InnerSWFConfig.xml | 6 +- .../debug_inner/inner/src/InnerMain.as | 20 +++- .../debug_inner/inner/src/MyInnerClass.as | 3 + .../ffdec_lib/testdata/debug_inner/inner2.swf | Bin 1244 -> 1403 bytes .../debug_inner/inner2/InnerSWF2.as3proj | 4 +- .../inner2/obj/InnerSWF2Config.old | 6 +- .../inner2/obj/InnerSWF2Config.xml | 6 +- .../debug_inner/inner2/src/InnerMain2.as | 40 ++++++++ .../testdata/debug_inner/inner2/src/Main.as | 24 ----- .../ffdec_lib/testdata/debug_inner/outer.swf | Bin 5911 -> 6260 bytes .../debug_inner/outer/obj/OuterSwfConfig.old | 6 +- .../debug_inner/outer/obj/OuterSwfConfig.xml | 6 +- .../testdata/debug_inner/outer/src/Main.as | 3 + .../decompiler/flash/gui/DebuggerHandler.java | 93 +++++++++++------- src/com/jpexs/decompiler/flash/gui/Main.java | 11 ++- .../flash/gui/debugger/Debugger.java | 4 + .../decompiler/flash/gui/debugger/debug.swf | Bin 4114 -> 4390 bytes 20 files changed, 176 insertions(+), 103 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/src/InnerMain2.as delete mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/src/Main.as diff --git a/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugConnection.as b/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugConnection.as index 46b25b6dcf..e0fb8ff87c 100644 --- a/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugConnection.as +++ b/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugConnection.as @@ -11,7 +11,6 @@ private static var s:Socket; private static var q = []; - private static var first:Boolean = true; private static var inited:Boolean = false; private static var name:String; private static var failed:Boolean = false; @@ -34,12 +33,16 @@ public static const MSG_DUMP_BYTEARRAY = 3; public static const MSG_REQUEST_BYTEARRAY = 4; public static const MSG_LOADER_URL_INFO = 5; - public static const MSG_LOADER_MODIFY_BYTES = 6; + public static const MSG_LOADER_MODIFY_BYTES = 6; + + private static var connected:Boolean = false; + + public static const SHOW_TRACE = false; private static function sendQueue(){ + if (SHOW_TRACE) trace("debugswf: client " + name + " sending queue"); var qo = q; q = []; - sendHeader(); for each(var m in qo){ writeMsg(m.data,m.type); } @@ -103,25 +106,30 @@ if(inited){ return; } + if (SHOW_TRACE) trace("debugswf: initing client " + sname); name = sname; inited = true; try { - s = new Socket(); + s = new Socket(); s.addEventListener(Event.CONNECT, onSocketConnect); s.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); var port:int = 0; - port = 123456; + port = 123456; + if (SHOW_TRACE) trace("debugswf: connecting client " + sname + " to localhost:" + port) ; s.connect("localhost",port); inited = true; } catch (e:SecurityError) { - trace("Debugger helper failed to connect to localhost"); + if (SHOW_TRACE) trace("Debugger helper failed to connect to localhost"); failed = true; } } private static function onSocketConnect(event:Event):void { - sendQueue(); + if (SHOW_TRACE) trace("debugswf: client " + name + " connected"); + sendHeader(); + connected = true; + sendQueue(); } @@ -150,8 +158,10 @@ } else { ba.position = pos; } + if (SHOW_TRACE) trace("debugswf: client " + name + " received bytearray of " + ba.length + " bytes"); var onComplete = fillByteArraysEvents.pop(); if (onComplete != null) { + if (SHOW_TRACE) trace("debugswf: client " + name + " calling onComplete"); onComplete.call(onComplete); } } @@ -200,15 +210,11 @@ } private static function sendHeader() { - if (!first) { - return; - } if (!s.connected) { return; } writeStringNull("debug.version.major="+DEBUG_VERSION_MAJOR+";debug.version.minor="+DEBUG_VERSION_MINOR); writeString(name); - first = false; } public static function writeMsg(msg,msgType=0){ @@ -216,7 +222,9 @@ return; } if(!inited) { - initClient(""); + var max:int = 100000; + var randomInt:int = Math.floor(Math.random() * (max + 1)); + initClient("rand" + randomInt); } if ((msg is ByteArray) && msgType == MSG_DUMP_BYTEARRAY) { var ba2:ByteArray = new ByteArray(); @@ -224,9 +232,9 @@ msg = ba2; } - if(s.connected){ - sendHeader(); - s.writeByte(msgType); + if(connected) { + if (SHOW_TRACE) trace("debugswf: client " + name +" sending msg " + msgType); + s.writeByte(msgType); switch(msgType){ case MSG_STRING: writeString(msg); @@ -242,6 +250,7 @@ break; case MSG_REQUEST_BYTEARRAY: fillByteArrays.push(msg); + fillByteArraysEvents.push(null); break; case MSG_LOADER_MODIFY_BYTES: writeString(msg["url"]); @@ -251,7 +260,9 @@ break; } s.flush(); + if (SHOW_TRACE) trace("debugswf: client " + name +" msg " + msgType + " sent"); }else{ + if (SHOW_TRACE) trace("debugswf: client " + name +" pushing msg " + msgType + " to queue"); q.push({type:msgType,data:msg}); } } diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner.swf b/libsrc/ffdec_lib/testdata/debug_inner/inner.swf index 0a7bf764f2d7718874032df0e9fa1821e2d497d5..050b03ad60c754daab616b561bb712de73db5658 100644 GIT binary patch literal 4049 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 DaQ@&s literal 3735 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 CONFIG::timeStamp - '04.08.2024' + '05.08.2024' CONFIG::air @@ -32,12 +32,12 @@ true - C:\FlashRelated\test_debugger\inner_debug\inner\src + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner\src C:\Program Files (x86)\FlashDevelop\Library\AS3\classes - C:\FlashRelated\test_debugger\inner_debug\inner\src\InnerMain.as + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner\src\InnerMain.as #FFFFFF 30 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml b/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml index 3fb908ad70..ec4ea7bee0 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml @@ -16,7 +16,7 @@ CONFIG::timeStamp - '04.08.2024' + '05.08.2024' CONFIG::air @@ -32,12 +32,12 @@ true - C:\FlashRelated\test_debugger\inner_debug\inner\src + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner\src C:\Program Files (x86)\FlashDevelop\Library\AS3\classes - C:\FlashRelated\test_debugger\inner_debug\inner\src\InnerMain.as + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner\src\InnerMain.as #FFFFFF 30 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as index 710cb6b23c..028dc8a01f 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as @@ -2,6 +2,8 @@ package { import flash.display.Sprite; import flash.events.Event; + import flash.text.TextField; + import flash.text.TextFormat; public class InnerMain extends Sprite { @@ -13,10 +15,24 @@ package else addEventListener(Event.ADDED_TO_STAGE, init); } - private function init(e:Event = null):void + private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); - // entry point + + var textField:TextField = new TextField(); + + textField.text = "Main inner1."; + + var textFormat:TextFormat = new TextFormat(); + textFormat.size = 24; + textFormat.color = 0x000000; + textField.setTextFormat(textFormat); + textField.width = 200; + + addChild(textField); + + textField.x = 50; + textField.y = 125; } } diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as index b90f7d2ad2..7e78e7891d 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as @@ -43,14 +43,17 @@ package var byteArray:ByteArray = new binaryData2Class() as ByteArray; var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); + //trace("loading innerSwf 2"); loader.loadBytes(byteArray); } private function onLoaderComplete(event:Event):void { var loaderInfo:LoaderInfo = event.target as LoaderInfo; var className:String = "MyInnerClass2"; + //trace("getting definition of " + className); var LoadedClass:Class = loaderInfo.applicationDomain.getDefinition(className) as Class; var instance:* = new LoadedClass(); + //trace("calling innerSwf 2 instance"); instance.run(root); } diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2.swf b/libsrc/ffdec_lib/testdata/debug_inner/inner2.swf index da6ab5aef075a596fccf71fbd3fb6e2cb6d10226..b9d6125fdf6a20f86420a187054c1c7b4e6378d0 100644 GIT binary patch literal 1403 zcmV->1%&!TS5qWC2><|i0kxIQZrer>$9I>c){^yU*^>Mj`6G2**p^H?0qi(N4a-X7 zHgOOKXc34IR^-xRBZ~q_$#O4sfgXD8BlJmfY>{463rJp}H?vQW4k;zF+8~#r1Vrx6 z{AYG{IX|k6Xa}Km1ED#L3W-UC(D%t#7@=KD(|4X0irMyAt#0qY?EZ4qaT+_h-1+(W z`uXO%X`SXawzs!)c{wM`YoJ)OFX|3!uhs3v#kSOvu4`N^!=&VJ+tHZA zN*b>;Ps@h4a>>8TB~aeGH&}L^*^=$RsfkA2aN~NRimciHoiy?YJxU2TJXkqyq$_I z)6ml8@~K&N%(BLH&j@IgtGw0_8m295Zf!?;1!;!esIiN{2_$fM;JETFSDl!@i2}Ho zqeA0GydkK1-o(SY!!4#dMvM0>sUiP?39uV*z%%bkP@%Q|RfjBZ3LAGesDx7_HIj;_ zvKfpfDG@1_C<#!3QWB&jO2rr@V^mC1GET_^B`HeMlw>FY@f0O9lwc~&Q?fvXMJg>( z={A)<5fLKLaUp~g;`C2A93J%y!YrPV+9OjB7$`! zD0K1ckyaTV{vy03J?hFW4n`w z5=J;u#`W>MGNDi8m6V>!D``EQS2B7guO#)PfBOc_`d4)fA_9=$<@k6X=0_KPvmL+( z)s|78=f%jd`SgE6dT14(dV0u^8=7HTI=g5w>w}C+4)iV000%WQt6Sz-55uhLZ7VB( z5ZB}v|4_@>`Ts&~VyN7l)vWuxevn52ydMQwmN)v$ejK)qyLW{Rc`M+<7EVoOFtquY z2beJGF(v?GaY_;%Y2+qp87cx}(;j2wRuJPpS3pQOlD?FDsAll&To%vH!*c=0;z0@U zi4LHO6+qR4N)Y={K_V#%O%?*EMm?w^9xp@^rArLvmM3+!sI13aoRs7?Y&EcuVWxXs7Ex z8s00pUc0=xy}ezoRLj-s1}HZC6DQC{8;*Z_y%rUyQ(yP2USPS7!U}3Fw;w!OU!PVr z^oydszGp`z4ZTcl+NDn5mp4nBP{`1COxNpbK~3xRY)jWzx$HGNTU2S-bfj!4d$asVJ&`c6F>ADT=`}T$UDDldx#zh?Ux%JdC>14N zPGKc_{g!R{9qQHk&MU_qI+1GTWg6Y1THwwr-uYPE)|_@LX{D|yJ(-h zef#!hf`d>DethivmlM_a^>^351tfk*Jku-(y;*!s5CR)Tri@BVc8!m$NBcX+4R#vO zsSTYO#{u<&ra@c%cAI*~mg7)wVoui8W8c#sK4iHi%@_OtUY@rcE08tAI2Zs0pIClC zAxns?RCLrO$|8PduUH(wk!k6!FOK9E?IGP_}#_h{E0(76h^DBkm|0d%&*HsJ@Z zWh^zDZMPY?(3Z)Z09Ug^?H<>2eXjb!R(i6fVfj5jCDn1NKn5h-y4Qsr^w94C<+E~v4YEC#YgkZ}Zd+a6ay z7^6r{n2Cy-G?NuIWu_`>+Duo}jG3vZk|{;EFVJdqb>fi0LxDGof4n2}}P<3ur*rWiK;OU5ZC1A?M5hYNMGUMhFpjw-PHspTPvHhkQ|YBsAtL)4UcIj1)tm6Vg|l)*c4kI) zwhpQZ*&IJ58wv@T%Veh+v_#;AQw;7bqgFuKa~#9+Ic%Lj$8l~cl-G#=OPEvf-9!W9 zJ7HcWPYF6DzlK-N?xr;^TvGX`JUZodJ}kEQwW213%kV^6EWCQw;u|6)t(?90Bi7>K z>d$8l3G5qZYgH`~DrajSYsv7|bS$`)Xe>lEr^=>WVK<<^lZEaCkVyH9&+&&az<&Y) Gj5;&m?^hfE diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj b/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj index 2bf448b4c6..e8b2f51716 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj @@ -4,7 +4,7 @@ - + @@ -72,7 +72,7 @@ - + diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old index a1eafadb62..90a9f4d03d 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old @@ -16,7 +16,7 @@ CONFIG::timeStamp - '04.08.2024' + '05.08.2024' CONFIG::air @@ -32,12 +32,12 @@ true - C:\FlashRelated\test_debugger\inner_debug\inner2\src + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner2\src C:\Program Files (x86)\FlashDevelop\Library\AS3\classes - C:\FlashRelated\test_debugger\inner_debug\inner2\src\Main.as + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner2\src\InnerMain2.as #FFFFFF 30 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml index a1eafadb62..90a9f4d03d 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml @@ -16,7 +16,7 @@ CONFIG::timeStamp - '04.08.2024' + '05.08.2024' CONFIG::air @@ -32,12 +32,12 @@ true - C:\FlashRelated\test_debugger\inner_debug\inner2\src + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner2\src C:\Program Files (x86)\FlashDevelop\Library\AS3\classes - C:\FlashRelated\test_debugger\inner_debug\inner2\src\Main.as + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\inner2\src\InnerMain2.as #FFFFFF 30 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/InnerMain2.as b/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/InnerMain2.as new file mode 100644 index 0000000000..3abc54c2cf --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/InnerMain2.as @@ -0,0 +1,40 @@ +package +{ + import flash.display.Sprite; + import flash.events.Event; + import flash.text.TextField; + import flash.text.TextFormat; + + public class InnerMain2 extends Sprite + { + MyInnerClass2; + + public function InnerMain2() + { + if (stage) init(); + else addEventListener(Event.ADDED_TO_STAGE, init); + } + + private function init(e:Event = null):void + { + removeEventListener(Event.ADDED_TO_STAGE, init); + + var textField:TextField = new TextField(); + + textField.text = "Main inner2."; + + var textFormat:TextFormat = new TextFormat(); + textFormat.size = 24; + textFormat.color = 0x000000; + textField.setTextFormat(textFormat); + textField.width = 200; + + addChild(textField); + + textField.x = 50; + textField.y = 100; + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/Main.as b/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/Main.as deleted file mode 100644 index 1e9bfa3ff5..0000000000 --- a/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/Main.as +++ /dev/null @@ -1,24 +0,0 @@ -package -{ - import flash.display.Sprite; - import flash.events.Event; - - public class Main extends Sprite - { - MyInnerClass2; - - public function Main() - { - if (stage) init(); - else addEventListener(Event.ADDED_TO_STAGE, init); - } - - private function init(e:Event = null):void - { - removeEventListener(Event.ADDED_TO_STAGE, init); - // entry point - } - - } - -} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer.swf b/libsrc/ffdec_lib/testdata/debug_inner/outer.swf index 4902490c2030fdc47278f81dbc250993d0d3498c..90a6d467a8651a5673d7d03d67868b3ac003cba2 100644 GIT binary patch literal 6260 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 literal 5911 zcmV+y7wG6iS5qVy8~^}#0i9U~SQA;-o=Ka8UP36+tALQuixh!?6afW95F!RhAPPxH zq1Z*R0ZLIsiYSVReGxF!BF%&zN9D#k5PvEP$M6`uIGU47G%J#(=@Cau*0j`g`8i&sJ*y&Aj{Z4O zr(c#y6^=HIV#O2L99A?x3Z4@kh7t|_b%+px&5w*@aARp4Cq8p6la<62Y5kN6b)q;l zDvvc+diXJ#mJ2k^N#>Tbvk(d$h(dCIA^W=o z_Ma0VCBs+t^EX-Q5*WC`KY$E$NyAQ_^C8QOAsqlW#LUdhN--qdg@G>==E%xft;P-F z8aZ%C+z|7nGMK=OLWvXrz-{>BwjxlMp#T8MU`YsWL*VkujiaV@bqx6)lfggnE4`oR zTE>e>#xod&Rr?5xas`#Q%)BD~>~dWjhD-Vjhwbj_sq?kRGbPXpGRw9)UE4Fgp3np} zxqik#(Xz`H$FotiWg`Pcrj_8-lPuvSL#adhM zD?{VKPe-1*y67KmeaU;kxR}Od{1%#JY2eqL|LUS`mUtM0m=}Mso9UAiS&$RfyfSoN zU;v$CZN@3dV&sk9zPi#t0m8pGflVCOLXiojDh;BM9cMK^yA0M3L_jXM?QF75I7v7 zr){(1dQ*O$rooIbIAgeexN7*V)8Iz-8MBSl@XF#lmna*a?6N2sELnIq zJv~YM0?TV={VSatJMMW-tWhVAE!dc%5q~9N{KLs}rl((BUzhaoWd5cJ$CR($K5hf$ z?RP#c-pf~aK06eV^y15k)CBYgot}-CKi1qcZPq|KE2S~$l+6q0 zt7BvJ-IW%n@2|2lHR@RETVe8varCR-;}xS5hwi-e>pLAGu#-VL=>Zd|W#b ze2z-(OixO3=B!V7e8w@Y@o9w{!@RyrTySBTAi9 zI#F(}O&2B`O-)1Z2~uCoZ}d$j_rPU3+%X5ONbL|6+E`NHs?|jMnii_## znX78nj9(HkDwW55`zwsS@tw<0JKIk$jBL>Qa%U{2JdD=+%s7eP@Y#Eio4&Zp`m(=O zy^g*7enF(s;ZsbX=dbUkE~-i9Fnamf3?Ly zZ%B(~>|a4nbXd7@<4E~U>DHBDPNyEe3mRNcRn9p7;GQDI-!q~#`@(3}fhrVa{D;Z) zhEm=x%A)WRLOsL$^=Zo)(y_c3g3v$ zyvYxpC(PbItsH8khkm_bGt?M*e_i~8CcTpDJx5PY*JczlnicahY z`0aJDnCkrXBb`N!%0mgwpHs`{bBbaj2G5R-UB|vNo9tY8<$Zl3XCzU3L&M13zz^%j z$2Uy-GdG57TO<4B!tzZY2;Nt)?w^nO+N=7RsQz;8#!uxM#?Hj>Pm>KuzI@^pmi~cF z{rpy^Q9;NnW_RW8u7(G*>>el1^MT#}|YrNilsaEmM`(x_!bnj5&39d@a z&;!b`y4Qxk+rNAACvorB&cIEt22Mx$tUK4b*Ke?P>Z5ejx^t^Oy;yRgVA}p_%J9(# z)F(xX`ou3?L$~Q_DNVWM%O{*3bbI=Lbi23x+0f(h;}26t+B+0(ITPKwtqSYU-n8ig z?np+J;(s4rP28%YzkmN)6@IvEVaI(<%_5c1)(({=OY$n}4klQwv>T9+Ku%;a4^DS>iUgdRh@zwk9c9^sEn)bSWGCI)AwqSZ43=TVD)pu8E&G;=N zW9{u^!|e|N`QgZyenbn`{J2>4e9Kdc%;4tdEe(FB4EtBdCaQ!O3{)P}xo*DpJn16g z^o{4OLGpJWUz1uAoRpEZYQc$gM2N@I-s&x8RY#LeR@%B>@CZTO7%+Y+*1p}Bdp)TQ2wtwAkp{M(N+U3d*nFoG31A0B(OwbD7>IPDB)X17~F{UGG ztE9H|W=W8lDP!1^?}x-5u9hWjlHb<0UH{a!M3X;y7Myu(<+IsqrzCv^N_tDtdE)yX z)7`ZGkdpns9VCC5Hv|UwW`rJZf0o)E!|l;8P+5>^q>u5a>@c*sQk+<~|F%_K&cbsJ z2TsnDliNx03u@_$V2|DkWHVh`xRbltwS1hLQi*ki&rACKVO-hWHIXK+1!d0&r#evm z*CGd=@v8dvHI<~JEK@>Gb(oxZoMdMXpIxN>x_2X^$L-qh40*DtDIM*h%N6(v0Tnve zLS9$b-dD>1q~Nf$*wA*0$vCg2V7hmk|M*t2Uh-3!g!asgUhg*^Cy&2cf<4#Na>YBA zzi2*3Ng4FHQm7n^@490m17)m8NAsVotWZ0CPN{0`j>Fp?-Jr4+hnvP%pFVc-t|8L* zJ$oA^xTs>O;ePaP{k?ZvSE@0ZGPa+8aiBGMe)Kbi6TfYsY2`=Qf}P8sjYuuJ+ia%q z9FbMoS9iqWrYCJzRrG_{GEEf)znx$LpaXh~87{*vYGZe8a~+e-Q%XC+mU|)#Woa){ z-sO=OE3vCJH&zw**vnz7ZmwsLpICtBC7ENnu`0Xv=yfOP=D3uJUX;~V8 zlv~b~+3t575SuL6W&$G0qI&-Hl2LQ|ZKK0tc|4*+H(88bN~ z94+_Mj_cMd_mm)?iMn%+R4x*pS5`y582wg*lT?i+4Y$>0NWO zZDwSJgEVPCu^!Rie``uts-KWs8kl{wec7|heRVru4^>UxbX*ix@%8;{ypA%u=Jf3s zv6~7?%=m}wZ|ZGZm79sjhjX_Zch5i*g8F(_y|aZOA)a!JcK(h%7-DUNv6oQHo$np# zYJ`99BbS>UAh#%z+SMSFBO|v8mAY&ZUQUWED^SKA*(P^w4{n|G*y=V^L+7sHrI^D? z^}}gtw=M9vQt2wTxFQ+=Ts0dE1-TE0&f@g5mEoRPEkJa#bX1*Y+e|{vu$)RkQ{5ZWSIUJxh!_a2~7}%H;{&lOySX7I2>vUCXPjorg7vsw0Kq`Z4M;P z^@o!9EG(bLh~r|Ghz3Z`ilP}@b{sWDHj2fBr@@=;^J3CjST}#)rAyp{++|qIS*aT< zo*hTy(QrbGLTIk6Xhv)fBN67yUbrk&B8w4?7ENDFs7B)mv2amBHvFjZG;tABw1^!n zg9-D&jG|$9R89JFI|53gSm)+W>FLW6L{2QAVE(J3?8R@^-keo9e+5eb4VNU;FYgYYX zJPIyT{l^R}?5vUI=C(3ukboeF5#$JXw1FZ5J6{P@0aXlDj8u$O7O0pYBtQfP!s5il zB_yS!)gS~4LZBg71VRu33n6h3LL5TKKqy%VEe|0SAOryd6(NKYgiwJHnh;tGLg+vU zT?nCv(+4302%#+@gcXFehR`+;+7?3F!Mhs)?`R1Cl*TCU1SKRS;UA`3<_X1UB1kfW zFLU^^um?#C;co|!poqf(AQG_%z{80F0m5EAm8N$2=Ejn9hoSH1As0M6ksSL3jhKI3YvnUW9U#9 z9p!;W7zzk51`LT43xhF~x=0hCB%m|_N`a~qpfo~FphCg^9Ds!fsCIcH01A$d+pz`r zhd_-Y<}C(n5xXZ)@1={2G$p#|k|Jo0-X0Gr&`_WWn?NEkII&RJgtpMcJV1K_R0VY= zKsAK!1gMVGn*cRX`U0J9x(r2@F1urk>>mrX1-j|?1bRJmxn2)>kbpg=;zhM`dD7dHM%-*XsIApBU(+_{kcTRS@l4Puc5G(nOetpqy^g@q6Z2#Li>fDlRw zLd)Q!KnN)dyBE$b00duX0Eq*|#N|LSdH5R-qR==DoE2d2fgT_N1$$oz1N$8TB9QP6 zg_aWTK?EST3S5AS6-EIFf@qA)8;l?njs%P#Oqe~wzefj3OC(!N!B8MNM53VSXwgl$ zfnrgx_H4MYga+Z+2oH_FKY9GvKGOgATml&W(-_gC#ovMc3+>+t{>k{Sevoiaj*8<) z(?sX;zxqIQbXi)F{%agq*jQjhhYCswBw%4WF~YQuMB_j>|6?FD1bao8@P&I10eb}y z1L4C36qkbc7!LL87DU26fiIZ#?^zrKF%YJU1QY+AcCS3_^n-JZ8~h;2O=SL$8S57$cpCvfh!_7w{y%JOBms#<0|*E{ t!e$wQV-ke_zCpk#7mhsy1c%sc-qDmtz$^NvfcPF;z#{m^{{ejJ4~TO;Y?J^1 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old index 3c1960d444..a147a267c5 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old @@ -16,7 +16,7 @@ CONFIG::timeStamp - '04.08.2024' + '05.08.2024' CONFIG::air @@ -32,12 +32,12 @@ true - C:\FlashRelated\test_debugger\inner_debug\outer\src + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\outer\src C:\Program Files (x86)\FlashDevelop\Library\AS3\classes - C:\FlashRelated\test_debugger\inner_debug\outer\src\Main.as + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\outer\src\Main.as #FFFFFF 30 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml index 3c1960d444..a147a267c5 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml @@ -16,7 +16,7 @@ CONFIG::timeStamp - '04.08.2024' + '05.08.2024' CONFIG::air @@ -32,12 +32,12 @@ true - C:\FlashRelated\test_debugger\inner_debug\outer\src + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\outer\src C:\Program Files (x86)\FlashDevelop\Library\AS3\classes - C:\FlashRelated\test_debugger\inner_debug\outer\src\Main.as + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\debug_inner\outer\src\Main.as #FFFFFF 30 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as b/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as index d4bb99cfea..39bd24e7e4 100644 --- a/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as @@ -28,14 +28,17 @@ package var byteArray:ByteArray = new binaryDataClass() as ByteArray; var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); + //trace("loading innerSwf 1"); loader.loadBytes(byteArray); } private function onLoaderComplete(event:Event):void { var loaderInfo:LoaderInfo = event.target as LoaderInfo; var className:String = "MyInnerClass"; + //trace("getting definition of " + className); var LoadedClass:Class = loaderInfo.applicationDomain.getDefinition(className) as Class; var instance:* = new LoadedClass(); + //trace("calling innerSwf 1 instance"); instance.run(this); } diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index 7aa0df3439..9d8fbb3889 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -79,7 +79,7 @@ public class DebuggerHandler implements DebugConnectionListener { private DebuggerCommands commands = null; - private List swfs = new ArrayList<>(); + //private List swfs = new ArrayList<>(); private boolean paused = true; @@ -396,6 +396,32 @@ private synchronized void markBreakPointInvalid(SWF swf, String scriptName, int } invalidBreakPointMap.get(swf).get(scriptName).add(line); } + + private synchronized void markBreakPointConfirmed(SWF swf, String scriptName, int line) { + if (!confirmedPointMap.containsKey(swf)) { + confirmedPointMap.put(swf, new HashMap<>()); + } + if (!confirmedPointMap.get(swf).containsKey(scriptName)) { + confirmedPointMap.get(swf).put(scriptName, new TreeSet<>()); + } + confirmedPointMap.get(swf).get(scriptName).add(line); + } + + private synchronized void markBreakPointValid(SWF swf, String scriptName, int line) { + if (!invalidBreakPointMap.containsKey(swf)) { + return; + } + if (!invalidBreakPointMap.get(swf).containsKey(scriptName)) { + return; + } + invalidBreakPointMap.get(swf).get(scriptName).remove(line); + if (invalidBreakPointMap.get(swf).get(scriptName).isEmpty()) { + invalidBreakPointMap.get(swf).remove(scriptName); + } + if (invalidBreakPointMap.get(swf).isEmpty()) { + invalidBreakPointMap.remove(swf); + } + } private InFrame frame; @@ -562,10 +588,7 @@ public boolean isPaused() { } } - public List getSwfs() { - return swfs; - } - + public void disconnect() { frame = null; pool = null; @@ -673,7 +696,6 @@ public void message(InProcessTag message) { } }); - swfs.clear(); swfIndicesCommited.clear(); swfIndicesNewToSwfHash.clear(); @@ -759,11 +781,12 @@ public void message(InScript sc) { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.WARNING, "SWF with hash {0} not found", swfHash); } else { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINE, "adding {0} to debugSwfs", swfIndex); + swfIndicesCommited.add(swfIndex); debuggedSwfs.add(swf); } } else { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINE, "Swf index already commited"); - } + } } con.dropMessage(sc); } @@ -804,8 +827,7 @@ public void message(InScript sc) { con.addMessageListener(new DebugMessageListener() { @Override public void message(InSwfInfo t) { - for (InSwfInfo.SwfInfo s : t.swfInfos) { - swfs.add(s); + /*for (InSwfInfo.SwfInfo s : t.swfInfos) { View.execInEventDispatch(new Runnable() { @Override public void run() { @@ -817,7 +839,7 @@ public void run() { } } }); - } + }*/ con.dropMessage(t); } }); @@ -845,13 +867,7 @@ public void run() { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "Breakpoint {0}:{1} submitted successfully", new Object[]{sname, isb.lines.get(i)}); } } - - con.addMessageListener(new DebugMessageListener() { - @Override - public void message(InAskBreakpoints message) { - - } - }); + con.addMessageListener(new DebugMessageListener() { @Override public void message(InContinue msg) { @@ -864,6 +880,7 @@ public void message(InContinue msg) { } } }); + con.addMessageListener(new DebugMessageListener() { @Override public void message(InBreakAt message) { @@ -897,18 +914,20 @@ public void message(InBreakAt message) { Logger.getLogger(DebuggerCommands.class.getName()).log(Level.SEVERE, "Invalid file: {0}", message.file); //return; } - - - for (int i = 0; i < debuggedSwfs.size(); i++) { - swfIndicesCommited.add(i); - } + final String[] reasonNames = new String[]{"unknown", "breakpoint", "watch", "fault", "stopRequest", "step", "halt", "scriptLoaded"}; String reason = reasonInt < reasonNames.length ? reasonNames[reasonInt] : reasonNames[0]; Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINE, "break at {0}:{1}, reason: {2}", new Object[]{newBreakScriptName, message.line, reason}); - - sendBreakPoints(); + + try { + sendBreakPoints(); + } catch (IOException ex) { + //ignore + Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINE, "send breakpoints exception: " + ex.getMessage()); + } + synchronized (DebuggerHandler.this) { breakScriptName = newBreakScriptName; breakIp = message.line; @@ -1030,7 +1049,8 @@ private void sendBreakPoints() throws IOException { } if (toAddBPointMap.containsKey(debuggedSwf)) { - for (String scriptName : toAddBPointMap.get(debuggedSwf).keySet()) { + Set toAddScripts = new HashSet<>(toAddBPointMap.get(debuggedSwf).keySet()); + for (String scriptName : toAddScripts) { if (scriptName.startsWith("#PCODE") != Main.isDebugPCode()) { continue; } @@ -1038,16 +1058,19 @@ private void sendBreakPoints() throws IOException { int file = moduleIdOf(hash + ":" + scriptName); Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINEST, "module = {0}", file); if (file > -1) { - for (int line : toAddBPointMap.get(debuggedSwf).get(scriptName)) { + Set lines = new HashSet<>(toAddBPointMap.get(debuggedSwf).get(scriptName)); + for (int line : lines) { if (commands.addBreakPoint(file, line)) { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "Breakpoint {0}:{1} submitted successfully", new Object[]{scriptName, line}); - if (!confirmedPointMap.containsKey(debuggedSwf)) { - confirmedPointMap.put(debuggedSwf, new HashMap<>()); + markBreakPointConfirmed(debuggedSwf, scriptName, line); + markBreakPointValid(debuggedSwf, scriptName, line); + toAddBPointMap.get(debuggedSwf).get(scriptName).remove(line); + if (toAddBPointMap.get(debuggedSwf).get(scriptName).isEmpty()) { + toAddBPointMap.get(debuggedSwf).remove(scriptName); } - if (!confirmedPointMap.get(debuggedSwf).containsKey(scriptName)) { - confirmedPointMap.get(debuggedSwf).put(scriptName, new TreeSet<>()); + if (toAddBPointMap.get(debuggedSwf).isEmpty()) { + toAddBPointMap.remove(debuggedSwf); } - confirmedPointMap.get(debuggedSwf).get(scriptName).add(line); } else { Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "Breakpoint {0}:{1} unable to submit", new Object[]{scriptName, line}); markBreakPointInvalid(debuggedSwf, scriptName, line); @@ -1058,13 +1081,7 @@ private void sendBreakPoints() throws IOException { markBreakPointInvalid(debuggedSwf, scriptName, line); } } - } - Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINEST, "clearing toAddBps of {0}", hash); - toAddBPointMap.get(debuggedSwf).clear(); - - if (toAddBPointMap.get(debuggedSwf).isEmpty()) { - toAddBPointMap.remove(debuggedSwf); - } + } } } } diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 1e09911aba..7891e1428f 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -476,9 +476,9 @@ public void handleEvent(String event, Object data) { try { File fTempFile = new File(instrSWF.getFile()); instrSWF.enableDebugging(true, new File("."), true, doPCode, swfHash); - FileOutputStream fos = new FileOutputStream(fTempFile); - instrSWF.saveTo(fos); - fos.close(); + try (FileOutputStream fos = new FileOutputStream(fTempFile)) { + instrSWF.saveTo(fos); + } if (!instrSWF.isAS3()) { //Read again, because line file offsets changed with adding debug tags //TODO: handle somehow without rereading? @@ -550,7 +550,7 @@ private static void prepareSwf(String swfHash, SwfPreparation prep, File toPrepa String url = it.getUrl(); File importedFile = new File(origFile.getParentFile(), url); if (importedFile.exists()) { - File newTempFile = createTempFileInDir(tempFilesDir, "~ffdec_run_import_", ".swf"); + File newTempFile = createTempFileInDir(tempFilesDir, "~ffdec_run_import_", ".swf"); it.setUrl("./" + newTempFile.getName()); byte[] impData = Helper.readFile(importedFile.getAbsolutePath()); Helper.writeFile(newTempFile.getAbsolutePath(), impData); @@ -2503,15 +2503,18 @@ public void opened(Openable openable) { try(FileOutputStream fos = new FileOutputStream(tempFile)) { fos.write(inputData); } + Logger.getLogger(Main.class.getName()).log(Level.FINE, "preparing for load: {0}", hash); prepareSwf("loaded_" + hash, runningPreparation, tempFile, mainSWF.getFile() == null ? null : new File(mainSWF.getFile()), tempRunDir, runTempFiles); byte outputData[] = Helper.readFileEx(tempFile.getAbsolutePath()); tempFile.delete(); + Logger.getLogger(Main.class.getName()).log(Level.FINE, "calling datamodified"); modifiedListener.dataModified(outputData); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } + Logger.getLogger(Main.class.getName()).log(Level.FINE, "finished opened method"); } }; diff --git a/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java b/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java index e66d73fa45..845a6440df 100644 --- a/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java +++ b/src/com/jpexs/decompiler/flash/gui/debugger/Debugger.java @@ -350,18 +350,22 @@ public void dataModified(byte[] data) { } } catch (IOException ex) { + logger.log(Level.FINER, "IOException in injected debugger thread: {0}", ex.getMessage()); //ignore } try { s.close(); } catch (IOException ex) { + logger.log(Level.FINER, "Socked close exception in injected debugger thread: {0}", ex.getMessage()); //ignore } finished = true; active = false; + logger.log(Level.FINER, "Calling onFinish"); for (DebugListener l : listeners) { l.onFinish(clientName); } + logger.log(Level.FINER, "Injected debugger finished"); } } diff --git a/src/com/jpexs/decompiler/flash/gui/debugger/debug.swf b/src/com/jpexs/decompiler/flash/gui/debugger/debug.swf index 55095b233993b2bddb17e24e9ab680a2b56ae42e..63a2cb31b49f2953755721be03400eecc6a4d2c7 100644 GIT binary patch literal 4390 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 literal 4114 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 QgZ{-5eFzr+3l^Kb+`oAy0RR91