From 84d6ad85916d69b3d717c387747bf65005a44c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 4 Aug 2024 22:26:00 +0200 Subject: [PATCH] Added: #1383 AS Debugger - debugging nested SWFs --- CHANGELOG.md | 2 + lib/flashdebugger.jar | Bin 253697 -> 254441 bytes .../debugger/DebugByteArrayLoadedEvent.as | 10 + .../flash/debugger/DebugConnection.as | 27 +- .../decompiler/flash/debugger/DebugLoader.as | 39 ++- libsrc/debugswf/debug/DOMDocument.xml | 20 +- libsrc/debugswf/debug/META-INF/metadata.xml | 12 +- libsrc/debugswf/debug/PublishSettings.xml | 2 +- libsrc/debugswf/debug/bin/SymDepend.cache | Bin 28 -> 28 bytes .../src/com/jpexs/decompiler/flash/SWF.java | 32 +- .../decompiler/flash/abc/ScriptPack.java | 9 +- libsrc/ffdec_lib/testdata/debug/debug_as2.swf | Bin 0 -> 16138 bytes libsrc/ffdec_lib/testdata/debug/debug_as3.swf | Bin 0 -> 571 bytes .../ffdec_lib/testdata/debug_inner/inner.swf | Bin 0 -> 3735 bytes .../debug_inner/inner/InnerSWF.as3proj | 93 ++++++ .../debug_inner/inner/obj/InnerSWFConfig.old | 48 +++ .../debug_inner/inner/obj/InnerSWFConfig.xml | 48 +++ .../debug_inner/inner/src/InnerMain.as | 24 ++ .../debug_inner/inner/src/MyInnerClass.as | 59 ++++ .../ffdec_lib/testdata/debug_inner/inner2.swf | Bin 0 -> 1244 bytes .../debug_inner/inner2/InnerSWF2.as3proj | 93 ++++++ .../inner2/obj/InnerSWF2Config.old | 48 +++ .../inner2/obj/InnerSWF2Config.xml | 48 +++ .../testdata/debug_inner/inner2/src/Main.as | 24 ++ .../debug_inner/inner2/src/MyInnerClass2.as | 37 +++ .../ffdec_lib/testdata/debug_inner/outer.swf | Bin 0 -> 5911 bytes .../debug_inner/outer/OuterSwf.as3proj | 93 ++++++ .../debug_inner/outer/obj/OuterSwfConfig.old | 48 +++ .../debug_inner/outer/obj/OuterSwfConfig.xml | 48 +++ .../testdata/debug_inner/outer/src/Main.as | 44 +++ .../flash/gui/BreakpointListDialog.java | 2 +- .../decompiler/flash/gui/DebugStackPanel.java | 29 +- .../decompiler/flash/gui/DebuggerHandler.java | 279 ++++++++++++------ src/com/jpexs/decompiler/flash/gui/Main.java | 169 ++++++++--- .../jpexs/decompiler/flash/gui/MainPanel.java | 29 +- .../decompiler/flash/gui/OpenableOpened.java | 27 ++ .../decompiler/flash/gui/abc/ABCPanel.java | 32 ++ .../flash/gui/debugger/DebugAdapter.java | 14 + .../flash/gui/debugger/DebugListener.java | 6 + .../gui/debugger/DebugLoaderDataModified.java | 25 ++ .../flash/gui/debugger/Debugger.java | 60 ++++ .../decompiler/flash/gui/debugger/debug.swf | Bin 5089 -> 4114 bytes .../gui/editor/DebuggableEditorPane.java | 15 +- .../flash/gui/locales/MainFrame.properties | 2 + .../flash/gui/locales/MainFrame_cs.properties | 4 +- 45 files changed, 1409 insertions(+), 192 deletions(-) create mode 100644 libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugByteArrayLoadedEvent.as create mode 100644 libsrc/ffdec_lib/testdata/debug/debug_as2.swf create mode 100644 libsrc/ffdec_lib/testdata/debug/debug_as3.swf create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner.swf create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner/InnerSWF.as3proj create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.old create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2.swf create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/src/Main.as create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/inner2/src/MyInnerClass2.as create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/outer.swf create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/outer/OuterSwf.as3proj create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml create mode 100644 libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as create mode 100644 src/com/jpexs/decompiler/flash/gui/OpenableOpened.java create mode 100644 src/com/jpexs/decompiler/flash/gui/debugger/DebugLoaderDataModified.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c3e01f9..63c7e8719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ All notable changes to this project will be documented in this file. - Optimized (faster) deleting items for large SWF trees - AS debugger - More varible flags - AS3 direct editation - edit files with native keyword +- [#1383] AS Debugger - debugging nested SWFs (enable "Open loaded SWFs while playing") ### Fixed - Debugger - getting children of top level variables @@ -3480,6 +3481,7 @@ Major version of SWF to XML export changed to 2. [#1809]: https://www.free-decompiler.com/flash/issues/1809 [#873]: https://www.free-decompiler.com/flash/issues/873 [#1644]: https://www.free-decompiler.com/flash/issues/1644 +[#1383]: https://www.free-decompiler.com/flash/issues/1383 [#2149]: https://www.free-decompiler.com/flash/issues/2149 [#2172]: https://www.free-decompiler.com/flash/issues/2172 [#2174]: https://www.free-decompiler.com/flash/issues/2174 diff --git a/lib/flashdebugger.jar b/lib/flashdebugger.jar index 579e06cc4e296c2d6917b952af9d50915ffb906e..5608d0a2be0b5b24f4b1646159c1aaf8e44e5b68 100644 GIT binary patch delta 3956 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 0) { - if (lenBytePos < 4) { + if (lenBytePos < 4) { lenBytes[lenBytePos] = s.readUnsignedByte(); lenBytePos++; if (lenBytePos == 4) { @@ -136,9 +138,8 @@ var readLen:int = s.bytesAvailable <= len ? s.bytesAvailable : len; s.readBytes(readBa, readBa.length, readLen); len -= readLen; - - if (len == 0) { - lenBytePos = 0; + if (len == 0) { + lenBytePos = 0; var ba:ByteArray = fillByteArrays.pop(); var pos = ba.position; ba.position = 0; @@ -149,6 +150,10 @@ } else { ba.position = pos; } + var onComplete = fillByteArraysEvents.pop(); + if (onComplete != null) { + onComplete.call(onComplete); + } } } } @@ -163,6 +168,10 @@ public static function writeLoaderBytes(data:ByteArray){ writeMsg(data,MSG_LOADER_BYTES); } + + public static function modifyLoaderBytesWithUrl(data:ByteArray, outputData:ByteArray, url:String, onComplete:Function){ + writeMsg({"inputData": data, "outputData": outputData, "url" : url, "onComplete" : onComplete},MSG_LOADER_MODIFY_BYTES); + } public static function writeCommaSeparatedToByteArray(s:String, ba:ByteArray) { var bytes:Array = s.split(","); @@ -232,8 +241,14 @@ writeBytes(msg); break; case MSG_REQUEST_BYTEARRAY: - fillByteArrays.push(msg); + fillByteArrays.push(msg); break; + case MSG_LOADER_MODIFY_BYTES: + writeString(msg["url"]); + writeBytes(msg["inputData"]); + fillByteArraysEvents.push(msg["onComplete"]); + fillByteArrays.push(msg["outputData"]); + break; } s.flush(); }else{ diff --git a/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugLoader.as b/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugLoader.as index 503b11ae6..2e2b235bc 100644 --- a/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugLoader.as +++ b/libsrc/debugswf/com/jpexs/decompiler/flash/debugger/DebugLoader.as @@ -4,18 +4,45 @@ import flash.net.URLRequest; import flash.system.LoaderContext; import flash.utils.ByteArray; + import flash.net.URLLoader; + import flash.net.URLLoaderDataFormat; + import flash.net.URLRequest; + import flash.events.Event; - public class DebugLoader extends Loader { - + public class DebugLoader extends Loader { + + private var lastLoadedContext:LoaderContext = null; + private var urlLoader:URLLoader = null; + private var lastLoadedRequest:URLRequest = null; + private var lastModifiedByteArray:ByteArray = null; public override function load(request:URLRequest, context:LoaderContext = null):void { - DebugConnection.writeLoaderURL(request.url); - super.load(request,context); + lastLoadedRequest = request; + lastLoadedContext = context; + + urlLoader = new URLLoader(); + urlLoader.dataFormat = URLLoaderDataFormat.BINARY; + urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete); + urlLoader.load(request); } + + private function onURLLoaderComplete(event:Event):void { + var dataBytes:ByteArray = urlLoader.data as ByteArray; + loadBytesInternal(dataBytes, lastLoadedContext, lastLoadedRequest.url); + } + private function loadBytesInternal(bytes:ByteArray, context:LoaderContext = null, url:String = "") { + lastModifiedByteArray = new ByteArray(); + lastLoadedContext = context; + DebugConnection.modifyLoaderBytesWithUrl(bytes, lastModifiedByteArray, url, onModifiedDataLoaded); + } + + private function onModifiedDataLoaded() { + super.loadBytes(lastModifiedByteArray, lastLoadedContext); + } + public override function loadBytes(bytes:ByteArray, context:LoaderContext = null):void { - DebugConnection.writeLoaderBytes(bytes); - super.loadBytes(bytes,context); + loadBytesInternal(bytes, context); } public override function toString():String { diff --git a/libsrc/debugswf/debug/DOMDocument.xml b/libsrc/debugswf/debug/DOMDocument.xml index dcadb265f..605551470 100644 --- a/libsrc/debugswf/debug/DOMDocument.xml +++ b/libsrc/debugswf/debug/DOMDocument.xml @@ -14,6 +14,16 @@ + + + + + + + + + + @@ -24,15 +34,5 @@ - - - - - - - - - - \ No newline at end of file diff --git a/libsrc/debugswf/debug/META-INF/metadata.xml b/libsrc/debugswf/debug/META-INF/metadata.xml index d682531f2..dc3d51ac8 100644 --- a/libsrc/debugswf/debug/META-INF/metadata.xml +++ b/libsrc/debugswf/debug/META-INF/metadata.xml @@ -5,8 +5,8 @@ xmlns:xmp="http://ns.adobe.com/xap/1.0/"> Adobe Flash Professional CS6 - build 537 2014-10-26T15:59:21+01:00 - 2023-11-19T08:32:38-08:00 - 2023-11-19T08:32:38-08:00 + 2024-08-04T02:20:55-07:00 + 2024-08-04T02:20:55-07:00 @@ -15,7 +15,7 @@ - xmp.iid:D4132A45B886EE11B43B9B2E6D6D7C97 + xmp.iid:C1FFFAAC2852EF1194768CEE75293134 xmp.did:1476A545885CE411B13FACEEFCD7D43C xmp.did:1476A545885CE411B13FACEEFCD7D43C @@ -56,6 +56,12 @@ 2014-10-26T15:59:21+01:00 Adobe Flash Professional CS6 - build 481 + + created + xmp.iid:C1FFFAAC2852EF1194768CEE75293134 + 2014-10-26T15:59:21+01:00 + Adobe Flash Professional CS6 - build 481 + diff --git a/libsrc/debugswf/debug/PublishSettings.xml b/libsrc/debugswf/debug/PublishSettings.xml index 618fc2897..e317964e7 100644 --- a/libsrc/debugswf/debug/PublishSettings.xml +++ b/libsrc/debugswf/debug/PublishSettings.xml @@ -79,7 +79,7 @@ . CONFIG::FLASH_AUTHORING="true"; - 1 + 0 1 0 diff --git a/libsrc/debugswf/debug/bin/SymDepend.cache b/libsrc/debugswf/debug/bin/SymDepend.cache index 8ece03aba8945329a120f5d1db7dc7060c7c9016..3a10c8f2e052d9e9ad7b419510b811a2d2b53dd6 100644 GIT binary patch literal 28 ccmYdiU|@K`&H*G@7}yz%fDi)qtz}>U04+QNIRF3v literal 28 ecmYdiU|@L8&J84m8Mqik7^HwK5ZJetfdK$3-~$%` diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 1674db1f8..37690f21f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -3990,6 +3990,9 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * P-code) */ public void injectAS3PcodeDebugInfo() throws InterruptedException { + injectAS3PcodeDebugInfo("main"); + } + public void injectAS3PcodeDebugInfo(String swfHash) throws InterruptedException { List packs = getAS3Packs(); int i = 0; for (ScriptPack s : packs) { @@ -4000,7 +4003,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { informListeners("inject_debuginfo", "" + i + "/" + packs.size() + ": " + s.getPath()); int abcIndex = s.allABCs.indexOf(s.abc); if (s.isSimple) { - s.injectPCodeDebugInfo(abcIndex); + s.injectPCodeDebugInfo(abcIndex, swfHash); } } } @@ -4011,6 +4014,10 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * @param decompileDir Directory to set file information paths */ public void injectAS3DebugInfo(File decompileDir) throws InterruptedException { + injectAS3DebugInfo(decompileDir, "main"); + } + + public void injectAS3DebugInfo(File decompileDir, String swfHash) throws InterruptedException { List packs = getAS3Packs(); int i = 0; for (ScriptPack s : packs) { @@ -4021,7 +4028,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { informListeners("inject_debuginfo", "" + i + "/" + packs.size() + ": " + s.getPath()); if (s.isSimple) { try { - s.injectDebugInfo(decompileDir); + s.injectDebugInfo(decompileDir, swfHash); } catch (Throwable t) { Logger.getLogger(SWF.class.getName()).log(Level.SEVERE, "Errorr injecting debug info", t); } @@ -4072,12 +4079,17 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * @param pcodeLevel inject Pcode lines instead of decompiled lines */ public void enableDebugging(boolean injectAS3Code, File decompileDir, boolean telemetry, boolean pcodeLevel) throws InterruptedException { + enableDebugging(injectAS3Code, decompileDir, telemetry, pcodeLevel, "main"); + } + + public void enableDebugging(boolean injectAS3Code, File decompileDir, boolean telemetry, boolean pcodeLevel, String swfHash) throws InterruptedException { + if (injectAS3Code) { if (pcodeLevel) { - injectAS3PcodeDebugInfo(); + injectAS3PcodeDebugInfo(swfHash); } else { - injectAS3DebugInfo(decompileDir); + injectAS3DebugInfo(decompileDir, swfHash); } } @@ -4156,6 +4168,10 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { } public boolean generatePCodeSwdFile(File file, Map> breakpoints) throws IOException, InterruptedException { + return generatePCodeSwdFile(file, breakpoints, "main"); + } + + public boolean generatePCodeSwdFile(File file, Map> breakpoints, String swfHash) throws IOException, InterruptedException { DebugIDTag dit = getDebugId(); if (dit == null) { return false; @@ -4180,7 +4196,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { } informListeners("generate_swd", name); moduleId++; - String sname = "#PCODE " + name; + String sname = swfHash + ":" + "#PCODE " + name; int bitmap = SWD.bitmapAction; items.add(new SWD.DebugScript(moduleId, bitmap, sname, "")); @@ -4237,6 +4253,10 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { } public boolean generateSwdFile(File file, Map> breakpoints) throws IOException { + return generateSwdFile(file, breakpoints, "main"); + } + + public boolean generateSwdFile(File file, Map> breakpoints, String swfHash) throws IOException { DebugIDTag dit = getDebugId(); if (dit == null) { return false; @@ -4299,7 +4319,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { } //final String NONAME = "[No instance name assigned]"; - String sname = name; + String sname = swfHash + ":" + name; int bitmap = SWD.bitmapAction; /* Matcher m; int bitmap = SWD.bitmapAction; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index 455d9f3d9..37c0ca4fb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -396,6 +396,10 @@ public class ScriptPack extends AS3ClassTreeItem { * http://securityevaluators.com/knowledge/flash/ */ public void injectDebugInfo(File directoryPath) { + injectDebugInfo(directoryPath, "main"); + } + + public void injectDebugInfo(File directoryPath, String swfHash) { Map> bodyToPosToLine = new HashMap<>(); Map> bodyLineToPos = new HashMap<>(); Map> bodyToRegToName = new HashMap<>(); @@ -517,6 +521,7 @@ public class ScriptPack extends AS3ClassTreeItem { String cls = path.className; String filename = new File(directoryPath, path.packageStr.toFilePath()).getPath().replace(";", "{{semicolon}}") + ";" + + swfHash + ":" + pkg.replace(".", File.separator).replace(";", "{{semicolon}}") + ";" + cls.replace(";", "{{semicolon}}") @@ -689,7 +694,7 @@ public class ScriptPack extends AS3ClassTreeItem { ((Tag) abc.parentTag).setModified(true); } - public void injectPCodeDebugInfo(int abcIndex) { + public void injectPCodeDebugInfo(int abcIndex, String swfHash) { Map bodyToIdentifier = new HashMap<>(); @@ -765,7 +770,7 @@ public class ScriptPack extends AS3ClassTreeItem { i -= 2; } } - String filename = "#PCODE " + bodyName + ";" + pkg.replace(".", File.separator) + ";" + cls + ".as"; + String filename = swfHash + ":" + "#PCODE " + bodyName + ";" + pkg.replace(".", File.separator) + ";" + cls + ".as"; b.insertInstruction(0, new AVM2Instruction(0, AVM2Instructions.DebugFile, new int[]{abc.constants.getStringId(filename, true)})); b.setModified(); diff --git a/libsrc/ffdec_lib/testdata/debug/debug_as2.swf b/libsrc/ffdec_lib/testdata/debug/debug_as2.swf new file mode 100644 index 0000000000000000000000000000000000000000..4379aa0b7fbd07339e355a2706cff9f54c6824a0 GIT binary patch literal 16138 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 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/debug/debug_as3.swf b/libsrc/ffdec_lib/testdata/debug/debug_as3.swf new file mode 100644 index 0000000000000000000000000000000000000000..162f5a11e1cfbf15e56639e0747fa50822151714 GIT binary patch literal 571 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.old b/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.old new file mode 100644 index 000000000..3fb908ad7 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.old @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '04.08.2024' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\FlashRelated\test_debugger\inner_debug\inner\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\FlashRelated\test_debugger\inner_debug\inner\src\InnerMain.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml b/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml new file mode 100644 index 000000000..3fb908ad7 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/obj/InnerSWFConfig.xml @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '04.08.2024' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\FlashRelated\test_debugger\inner_debug\inner\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\FlashRelated\test_debugger\inner_debug\inner\src\InnerMain.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as new file mode 100644 index 000000000..710cb6b23 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/InnerMain.as @@ -0,0 +1,24 @@ +package +{ + import flash.display.Sprite; + import flash.events.Event; + + public class InnerMain extends Sprite + { + MyInnerClass; + + public function InnerMain() + { + 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/inner/src/MyInnerClass.as b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as new file mode 100644 index 000000000..b90f7d2ad --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner/src/MyInnerClass.as @@ -0,0 +1,59 @@ +package +{ + import flash.display.Loader; + import flash.display.LoaderInfo; + import flash.display.Sprite; + import flash.events.Event; + import flash.text.TextField; + import flash.text.TextFormat; + import flash.utils.ByteArray; + + public class MyInnerClass + { + [Embed(source="../../inner2.swf", mimeType="application/octet-stream")] + public var binaryData2Class:Class; + + private var root:Sprite; + + public function MyInnerClass() + { + } + + public function run(s:Sprite): void { + var myvar:int = 1; + trace("hello from inner class 1"); + + var textField:TextField = new TextField(); + + textField.text = "Hello from inner1 !"; + + var textFormat:TextFormat = new TextFormat(); + textFormat.size = 24; + textFormat.color = 0x000000; + textField.setTextFormat(textFormat); + + textField.width = 200; + + s.addChild(textField); + + textField.x = 50; + textField.y = 50; + + root = s; + var byteArray:ByteArray = new binaryData2Class() as ByteArray; + var loader:Loader = new Loader(); + loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); + loader.loadBytes(byteArray); + } + + private function onLoaderComplete(event:Event):void { + var loaderInfo:LoaderInfo = event.target as LoaderInfo; + var className:String = "MyInnerClass2"; + var LoadedClass:Class = loaderInfo.applicationDomain.getDefinition(className) as Class; + var instance:* = new LoadedClass(); + instance.run(root); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2.swf b/libsrc/ffdec_lib/testdata/debug_inner/inner2.swf new file mode 100644 index 0000000000000000000000000000000000000000..da6ab5aef075a596fccf71fbd3fb6e2cb6d10226 GIT binary patch literal 1244 zcmV<21S9)HS5qY22LJ$g0iBfJZ`)K9$M3zi<2XN^rc2Xx-Mp=+nzSZqR>s7Ex 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 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj b/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj new file mode 100644 index 000000000..2bf448b4c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/InnerSWF2.as3proj @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old new file mode 100644 index 000000000..a1eafadb6 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.old @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '04.08.2024' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\FlashRelated\test_debugger\inner_debug\inner2\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\FlashRelated\test_debugger\inner_debug\inner2\src\Main.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml new file mode 100644 index 000000000..a1eafadb6 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/obj/InnerSWF2Config.xml @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '04.08.2024' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\FlashRelated\test_debugger\inner_debug\inner2\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\FlashRelated\test_debugger\inner_debug\inner2\src\Main.as + + #FFFFFF + 30 + + 800 + 600 + + \ 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 new file mode 100644 index 000000000..1e9bfa3ff --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/Main.as @@ -0,0 +1,24 @@ +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/inner2/src/MyInnerClass2.as b/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/MyInnerClass2.as new file mode 100644 index 000000000..aff712b6c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/inner2/src/MyInnerClass2.as @@ -0,0 +1,37 @@ +package +{ + import flash.display.Sprite; + import flash.text.TextField; + import flash.text.TextFormat; + + public class MyInnerClass2 + { + + public function MyInnerClass2() + { + + } + + public function run(s:Sprite): void { + var myvar:int = 2; + trace("hello from inner class 2"); + + var textField:TextField = new TextField(); + + textField.text = "Hello from inner2 !"; + + var textFormat:TextFormat = new TextFormat(); + textFormat.size = 24; + textFormat.color = 0x000000; + textField.setTextFormat(textFormat); + textField.width = 200; + + s.addChild(textField); + + textField.x = 50; + textField.y = 75; + + } + } + +} \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..4902490c2030fdc47278f81dbc250993d0d3498c GIT binary patch literal 5911 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 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/OuterSwf.as3proj b/libsrc/ffdec_lib/testdata/debug_inner/outer/OuterSwf.as3proj new file mode 100644 index 000000000..f5a39481c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/OuterSwf.as3proj @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old new file mode 100644 index 000000000..3c1960d44 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.old @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '04.08.2024' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\FlashRelated\test_debugger\inner_debug\outer\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\FlashRelated\test_debugger\inner_debug\outer\src\Main.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml new file mode 100644 index 000000000..3c1960d44 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/obj/OuterSwfConfig.xml @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '04.08.2024' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\FlashRelated\test_debugger\inner_debug\outer\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\FlashRelated\test_debugger\inner_debug\outer\src\Main.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as b/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as new file mode 100644 index 000000000..d4bb99cfe --- /dev/null +++ b/libsrc/ffdec_lib/testdata/debug_inner/outer/src/Main.as @@ -0,0 +1,44 @@ +package +{ + import flash.display.Sprite; + import flash.events.Event; + import flash.display.Loader; + import flash.display.LoaderInfo; + import flash.utils.ByteArray; + + /** + * ... + * @author Jindra + */ + public class Main extends Sprite + { + [Embed(source="../../inner.swf", mimeType="application/octet-stream")] + public var binaryDataClass:Class; + + 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); + + var byteArray:ByteArray = new binaryDataClass() as ByteArray; + var loader:Loader = new Loader(); + loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); + loader.loadBytes(byteArray); + } + + private function onLoaderComplete(event:Event):void { + var loaderInfo:LoaderInfo = event.target as LoaderInfo; + var className:String = "MyInnerClass"; + var LoadedClass:Class = loaderInfo.applicationDomain.getDefinition(className) as Class; + var instance:* = new LoadedClass(); + instance.run(this); + } + + } + +} \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/BreakpointListDialog.java b/src/com/jpexs/decompiler/flash/gui/BreakpointListDialog.java index eca81d5e1..8628f7a65 100644 --- a/src/com/jpexs/decompiler/flash/gui/BreakpointListDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/BreakpointListDialog.java @@ -176,7 +176,7 @@ public class BreakpointListDialog extends AppDialog { } }*/ Pattern abcPcodePattern = Pattern.compile("^#PCODE abc:(?[0-9]+),body:(?[0-9]+);.*"); - Matcher m = abcPcodePattern.matcher(breakpoint.scriptName); + Matcher m = abcPcodePattern.matcher(breakpoint.scriptName); if (m.matches()) { int abcIndex = Integer.parseInt(m.group("abc")); int bodyIndex = Integer.parseInt(m.group("body")); diff --git a/src/com/jpexs/decompiler/flash/gui/DebugStackPanel.java b/src/com/jpexs/decompiler/flash/gui/DebugStackPanel.java index 7d0b8cd9e..a9220f35b 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebugStackPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/DebugStackPanel.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.debugger.flash.messages.in.InBreakAtExt; +import com.jpexs.decompiler.flash.SWF; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -43,6 +44,7 @@ public class DebugStackPanel extends JPanel { private int depth = 0; + private String[] swfHashes = new String[0]; private int[] classIndices = new int[0]; private int[] methodIndices = new int[0]; private int[] traitIndices = new int[0]; @@ -90,9 +92,11 @@ public class DebugStackPanel extends JPanel { if (e.getClickCount() == 2 && SwingUtilities.isLeftMouseButton(e)) { int row = stackTable.rowAtPoint(e.getPoint()); if (row >= 0) { - String scriptName = (String) stackTable.getModel().getValueAt(row, 0); - int line = (int) (Integer) stackTable.getModel().getValueAt(row, 1); - Main.getMainFrame().getPanel().gotoScriptLine(Main.getMainFrame().getPanel().getCurrentSwf(), + String swfHash = swfHashes[row]; + String scriptName = (String) stackTable.getModel().getValueAt(row, 1); + int line = (int) (Integer) stackTable.getModel().getValueAt(row, 2); + SWF swf = swfHash == null ? Main.getRunningSWF() : Main.getSwfByHash(swfHash); + Main.getMainFrame().getPanel().gotoScriptLine(swf, scriptName, line, classIndices[row], traitIndices[row], methodIndices[row], Main.isDebugPCode()); Main.getDebugHandler().setDepth(row); } @@ -117,15 +121,24 @@ public class DebugStackPanel extends JPanel { return; } active = true; - Object[][] data = new Object[info.files.size()][3]; + Object[][] data = new Object[info.files.size()][4]; + String[] newSwfHashes = new String[info.files.size()]; int[] newClassIndices = new int[info.files.size()]; int[] newMethodIndices = new int[info.files.size()]; int[] newTraitIndices = new int[info.files.size()]; for (int i = 0; i < info.files.size(); i++) { int f = info.files.get(i); - data[i][0] = Main.getDebugHandler().moduleToString(f); - data[i][1] = info.lines.get(i); - data[i][2] = info.stacks.get(i); + String moduleName = Main.getDebugHandler().moduleToString(f); + String swfHash = null; + if (moduleName.contains(":")) { + swfHash = moduleName.substring(0, moduleName.indexOf(":")); + moduleName = moduleName.substring(moduleName.indexOf(":") + 1); + } + newSwfHashes[i] = swfHash; + data[i][0] = swfHash == null ? "unknown" : Main.getSwfByHash(swfHash).toString(); + data[i][1] = moduleName; + data[i][2] = info.lines.get(i); + data[i][3] = info.stacks.get(i); Integer newClassIndex = Main.getDebugHandler().moduleToClassIndex(f); newClassIndices[i] = newClassIndex == null ? -1 : newClassIndex; Integer newMethodIndex = Main.getDebugHandler().moduleToMethodIndex(f); @@ -135,6 +148,7 @@ public class DebugStackPanel extends JPanel { } DefaultTableModel tm = new DefaultTableModel(data, new Object[]{ + AppStrings.translate("callStack.header.swf"), AppStrings.translate("callStack.header.file"), AppStrings.translate("callStack.header.line"), AppStrings.translate("stack.header.item") @@ -146,6 +160,7 @@ public class DebugStackPanel extends JPanel { }; stackTable.setModel(tm); + this.swfHashes = newSwfHashes; this.classIndices = newClassIndices; this.methodIndices = newMethodIndices; this.traitIndices = newTraitIndices; diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index 606bfd0bf..7aa0df343 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -57,6 +57,7 @@ import com.jpexs.decompiler.graph.DottedChain; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -85,7 +86,13 @@ public class DebuggerHandler implements DebugConnectionListener { private Map modulePaths = new HashMap<>(); private Map moduleToSwfIndex = new HashMap<>(); - + + //Marks swfIndices that are fully loaded - at least one break was on it (including onloaded break) + private Set swfIndicesCommited = new HashSet<>(); + + private Map swfIndicesNewToSwfHash = new HashMap<>(); + + private Map scriptToModule = new HashMap<>(); private Map moduleToTraitIndex = new HashMap<>(); @@ -110,7 +117,7 @@ public class DebuggerHandler implements DebugConnectionListener { private List stackLines = new ArrayList<>(); - private SWF debuggedSwf = null; + private List debuggedSwfs = new ArrayList<>(); public static class ActionScriptException extends Exception { @@ -130,12 +137,13 @@ public class DebuggerHandler implements DebugConnectionListener { } } - public void setDebuggedSwf(SWF debuggedSwf) { - this.debuggedSwf = debuggedSwf; + public void setMainDebuggedSwf(SWF debuggedSwf) { + debuggedSwfs.clear(); + //debuggedSwfs.add(debuggedSwf); } - public SWF getDebuggedSwf() { - return debuggedSwf; + public List getDebuggedSwfs() { + return debuggedSwfs; } public int getBreakIp() { @@ -538,11 +546,11 @@ public class DebuggerHandler implements DebugConnectionListener { return frame; } - public synchronized int moduleIdOf(String pack) { - if (scriptToModule.containsKey(pack)) { - return scriptToModule.get(pack); + public synchronized int moduleIdOf(String packWithHash) { + if (!scriptToModule.containsKey(packWithHash)) { + return -1; } - return -1; + return scriptToModule.get(packWithHash); } public boolean isPaused() { @@ -569,35 +577,38 @@ public class DebuggerHandler implements DebugConnectionListener { } commands = null; synchronized (this) { - if (confirmedPointMap.containsKey(debuggedSwf)) { - for (String scriptName : confirmedPointMap.get(debuggedSwf).keySet()) { - if (!toAddBPointMap.containsKey(debuggedSwf)) { - toAddBPointMap.put(debuggedSwf, new HashMap<>()); + for (SWF debuggedSwf : debuggedSwfs) { + if (confirmedPointMap.containsKey(debuggedSwf)) { + for (String scriptName : confirmedPointMap.get(debuggedSwf).keySet()) { + if (!toAddBPointMap.containsKey(debuggedSwf)) { + toAddBPointMap.put(debuggedSwf, new HashMap<>()); + } + if (!toAddBPointMap.get(debuggedSwf).containsKey(scriptName)) { + toAddBPointMap.get(debuggedSwf).put(scriptName, new TreeSet<>()); + } + toAddBPointMap.get(debuggedSwf).get(scriptName).addAll(confirmedPointMap.get(debuggedSwf).get(scriptName)); } - if (!toAddBPointMap.get(debuggedSwf).containsKey(scriptName)) { - toAddBPointMap.get(debuggedSwf).put(scriptName, new TreeSet<>()); - } - toAddBPointMap.get(debuggedSwf).get(scriptName).addAll(confirmedPointMap.get(debuggedSwf).get(scriptName)); + confirmedPointMap.get(debuggedSwf).clear(); } - confirmedPointMap.get(debuggedSwf).clear(); - } - if (invalidBreakPointMap.containsKey(debuggedSwf)) { - for (String scriptName : invalidBreakPointMap.get(debuggedSwf).keySet()) { - if (!toAddBPointMap.containsKey(debuggedSwf)) { - toAddBPointMap.put(debuggedSwf, new HashMap<>()); + if (invalidBreakPointMap.containsKey(debuggedSwf)) { + for (String scriptName : invalidBreakPointMap.get(debuggedSwf).keySet()) { + if (!toAddBPointMap.containsKey(debuggedSwf)) { + toAddBPointMap.put(debuggedSwf, new HashMap<>()); + } + if (!toAddBPointMap.get(debuggedSwf).containsKey(scriptName)) { + toAddBPointMap.get(debuggedSwf).put(scriptName, new TreeSet<>()); + } + toAddBPointMap.get(debuggedSwf).get(scriptName).addAll(invalidBreakPointMap.get(debuggedSwf).get(scriptName)); } - if (!toAddBPointMap.get(debuggedSwf).containsKey(scriptName)) { - toAddBPointMap.get(debuggedSwf).put(scriptName, new TreeSet<>()); - } - toAddBPointMap.get(debuggedSwf).get(scriptName).addAll(invalidBreakPointMap.get(debuggedSwf).get(scriptName)); + invalidBreakPointMap.get(debuggedSwf).clear(); } - invalidBreakPointMap.get(debuggedSwf).clear(); } } for (ConnectionListener l : clisteners) { l.disconnected(); } + debuggedSwfs.clear(); } public synchronized boolean isConnected() { @@ -628,7 +639,9 @@ public class DebuggerHandler implements DebugConnectionListener { @Override public void connected(DebuggerConnection con) { - makeBreakPointsUnconfirmed(debuggedSwf); + /*for (SWF debuggedSwf : debuggedSwfs) { + makeBreakPointsUnconfirmed(debuggedSwf); + }*/ Main.startWork(AppStrings.translate("work.debugging"), null); @@ -661,13 +674,15 @@ public class DebuggerHandler implements DebugConnectionListener { }); swfs.clear(); - + swfIndicesCommited.clear(); + swfIndicesNewToSwfHash.clear(); + Map moduleNames = new HashMap<>(); final Pattern patAS3 = Pattern.compile("^(.*);(.*);(.*)\\.as$"); - final Pattern patAS3PCode = Pattern.compile("^#PCODE abc:([0-9]+),script:([0-9]+),class:(-?[0-9]+),trait:(-?[0-9]+),method:([0-9]+),body:([0-9]+);(.*)$"); + final Pattern patAS3PCode = Pattern.compile("^(?[0-9a-z_]+):#PCODE abc:(?[0-9]+),script:(?