<html><head></head><body><div style="font-family:Helvetica Neue, Helvetica, Arial, sans-serif;font-size:16px;"><div></div>
            <div>Hello Jan, thank you.</div><div><br></div><div>I am trying to instrument APK applications using a well know sample taken from Soot tutorials.</div><div>I implemented the following code:</div><div><br></div><div><br></div><div><div>PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new BodyTransformer() {</div><div><span style="white-space: pre-wrap;">            </span>@Override</div><div><span style="white-space: pre-wrap;">              </span>protected void internalTransform(final Body b, String phaseName,</div><div><span style="white-space: pre-wrap;">                       </span>@SuppressWarnings("rawtypes") Map options) {</div><div><span style="white-space: pre-wrap;">         </span>    final PatchingChain<Unit> units = b.getUnits();</div><div><span style="white-space: pre-wrap;">            </span>    // important to use snapshotIterator here</div><div><span style="white-space: pre-wrap;">                </span>    for (Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) {</div><div><span style="white-space: pre-wrap;">                    </span>final Unit u = iter.next();</div><div><span style="white-space: pre-wrap;">                    </span>u.apply(new AbstractStmtSwitch() {</div><div><span style="white-space: pre-wrap;">                     </span>    public void caseInvokeStmt(InvokeStmt stmt) {</div><div><span style="white-space: pre-wrap;">                            </span>InvokeExpr invokeExpr = stmt.getInvokeExpr();</div><div><span style="white-space: pre-wrap;">                          </span>String methodSignature = invokeExpr.getMethodRef().getSignature();</div><div><br></div><div><span style="white-space: pre-wrap;">                            </span>String instrumentation = checkCallType(methodSignature);</div><div><span style="white-space: pre-wrap;">                               </span>Local tmpRef = addTmpRef(b);</div><div><span style="white-space: pre-wrap;">                           </span>Local tmpString = addTmpString(b);</div><div><span style="white-space: pre-wrap;">                             </span>// insert "tmpRef = java.lang.System.out;"</div><div><span style="white-space: pre-wrap;">                           </span>units.insertBefore(</div><div><span style="white-space: pre-wrap;">                                    </span>Jimple.v().newAssignStmt(tmpRef, Jimple.v().newStaticFieldRef(Scene.v()</div><div><span style="white-space: pre-wrap;">                                                </span>.getField("<java.lang.System: java.io.PrintStream out>").makeRef())),</div><div><span style="white-space: pre-wrap;">                                  </span>u);</div><div><span style="white-space: pre-wrap;">                            </span>// insert "tmpLong = instrumentation"</div><div><span style="white-space: pre-wrap;">                                </span>LOGGER.debug("--> INSTRUMENTATION " + instrumentation);</div><div><span style="white-space: pre-wrap;">                           </span>units.insertBefore(</div><div><span style="white-space: pre-wrap;">                                    </span>Jimple.v().newAssignStmt(tmpString, StringConstant.v(instrumentation)), u);</div><div><br></div><div><span style="white-space: pre-wrap;">                           </span>// insert "tmpRef.println(tmpString);"</div><div><span style="white-space: pre-wrap;">                               </span>SootMethod toCall = Scene.v().getSootClass("java.io.PrintStream")</div><div><span style="white-space: pre-wrap;">                                    </span>.getMethod("void println(java.lang.String)");</div><div><span style="white-space: pre-wrap;">                                </span>units.insertBefore(</div><div><span style="white-space: pre-wrap;">                                    </span>Jimple.v().newInvokeStmt(</div><div><span style="white-space: pre-wrap;">                                              </span>Jimple.v().newVirtualInvokeExpr(tmpRef, toCall.makeRef(), tmpString)),</div><div><span style="white-space: pre-wrap;">                                 </span>u);</div><div><br></div><div><span style="white-space: pre-wrap;">                           </span>// check Jimple code</div><div><span style="white-space: pre-wrap;">                           </span>b.validate();</div><div><span style="white-space: pre-wrap;">                  </span>    }</div><div><span style="white-space: pre-wrap;">                        </span>});</div><div><span style="white-space: pre-wrap;">            </span>    }</div><div><span style="white-space: pre-wrap;">                </span>}</div><div><br></div><div><span style="white-space: pre-wrap;">     </span>    }));</div><div><span style="white-space: pre-wrap;">     </span>    soot.Main.main(args);</div><br></div><div><br></div><div>It works quite well on most of public APK files, but sometimes crashes on specific scenarios. For example, if APK is multi dex, it may stop working with the following exception:</div><div><br><div>[Thread-17] ERROR heros.solver.CountingThreadPoolExecutor - Worker thread execution failed: Dex file overflow. Splitting not support for pre Lollipop Android (Api 22).</div><div>java.lang.RuntimeException: Dex file overflow. Splitting not support for pre Lollipop Android (Api 22).</div><div><span style="white-space: pre-wrap;">    </span>at soot.toDex.MultiDexBuilder.hasOverflowed(MultiDexBuilder.java:62)</div><div><span style="white-space: pre-wrap;">   </span>at soot.toDex.MultiDexBuilder.internClass(MultiDexBuilder.java:37)</div><div><span style="white-space: pre-wrap;">     </span>at soot.toDex.DexPrinter.addAsClassDefItem(DexPrinter.java:586)</div><div><span style="white-space: pre-wrap;">        </span>at soot.toDex.DexPrinter.add(DexPrinter.java:1490)</div><div><span style="white-space: pre-wrap;">     </span>at soot.PackManager.writeClass(PackManager.java:1060)</div><div><span style="white-space: pre-wrap;">  </span>at soot.PackManager.access$100(PackManager.java:112)</div><div><span style="white-space: pre-wrap;">   </span>at soot.PackManager$2.run(PackManager.java:664)</div><div><span style="white-space: pre-wrap;">        </span>at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)</div><div><span style="white-space: pre-wrap;">     </span>at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)</div><div><span style="white-space: pre-wrap;">     </span>at java.lang.Thread.run(Thread.java:745)</div></div><div><br></div><div> I already asked on a different thread regarding this specific issue, but now the question is: how I can catch this exception from my program ? It seems to be thrown by PackManager, but I am not able to catch it (I think it depends on threads nature).</div><div><br></div><div>Thanks</div><div>Paolo</div><div><br></div><div><br></div><div><br></div>
            
            <div id="ydp7451be34yahoo_quoted_1913255515" class="ydp7451be34yahoo_quoted">
                <div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;color:#26282a;">
                    
                    <div>
                        On Saturday, 24 March 2018, 16:36:43 CET, Jan Peter Stotz <jan-peter.stotz@sit.fraunhofer.de> wrote:
                    </div>
                    <div><br></div>
                    <div><br></div>
                    <div><div dir="ltr">Hi Paolo,<br clear="none"><br clear="none">what are you trying to do and what function of Soot do you execute when <br clear="none">he exception occurs you want to catch? Without detailed information all <br clear="none">we can do is guesswork.<br clear="none"><br clear="none">Jan<br clear="none"><div class="ydp7451be34yqt2288546278" id="ydp7451be34yqtfd79060"><br clear="none">Am 24.03.2018 um 16:27 schrieb Paolo Giannoccaro:<br clear="none">> Hi,<br clear="none">> how I can catch in my java program exceptions thrown by Soot threads ? I <br clear="none">> tried several options, but such exceptions seem not to be catchable from <br clear="none">> my application.<br clear="none">> <br clear="none">> Thanks<br clear="none">> Paolo<br clear="none"></div></div></div>
                </div>
            </div></div></body></html>