debuginjector - adapt for dexlib2

This commit is contained in:
Connor Tumbleson 2013-08-13 15:45:15 -05:00
parent 5aa18eee2d
commit f95f9b2f4b

View File

@ -20,7 +20,6 @@ import brut.androlib.AndrolibException;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.jf.dexlib.Code.Analysis.RegisterType;
/** /**
* @author Ryszard Wiśniewski <brut.alll@gmail.com> * @author Ryszard Wiśniewski <brut.alll@gmail.com>
@ -74,7 +73,7 @@ public class DebugInjector {
private void injectRemainingParams() { private void injectRemainingParams() {
areParamsInjected = true; areParamsInjected = true;
while(currParam <= lastParam) { while(currParam <= lastParam) {
mOut.append(".parameter \"p").append(currParam).append("\"\n"); //mOut.append(".param \"p").append(currParam).append("\"\n");
currParam++; currParam++;
} }
} }
@ -108,61 +107,65 @@ public class DebugInjector {
Matcher m = REGISTER_INFO_PATTERN.matcher(line); Matcher m = REGISTER_INFO_PATTERN.matcher(line);
while (m.find()) { while (m.find()) {
String localName = m.group(1); String localName = m.group(1);
String localType = null; String localType = null;
switch (RegisterType.Category.valueOf(m.group(2))) { switch (m.group(2)) {
case Reference: case "Reference":
case Null: case "UninitRef":
case UninitRef: case "REFERENCE":
case UninitThis: case "Null":
localType = "Ljava/lang/Object;"; case "UninitThis":
break; localType = "Ljava/lang/Object;";
case Boolean: break;
localType = "Z"; case "Boolean":
break; localType = "Z";
case Integer: break;
case One: case "Integer":
case Unknown: case "One":
localType = "I"; case "Unknown":
break; localType = "I";
case Uninit: break;
case Conflicted: case "Uninit":
if (mInitializedRegisters.remove(localName)) { case "Conflicted":
mOut.append(".end local ").append(localName).append('\n'); if (mInitializedRegisters.remove(localName)) {
} mOut.append(".end local ").append(localName).append('\n');
continue; }
case Short: continue;
case PosShort: case "Short":
localType = "S"; case "PosShort":
break; localType = "S";
case Byte: break;
case PosByte: case "Byte":
localType = "B"; case "PosByte":
break; localType = "B";
case Char: break;
localType = "C"; case "Char":
break; localType = "C";
case Float: break;
localType = "F"; case "Float":
break; localType = "F";
case LongHi: break;
case LongLo: case "LongHi":
localType = "J"; case "LongLo":
break; localType = "J";
case DoubleHi: break;
case DoubleLo: case "DoubleHi":
localType = "D"; case "DoubleLo":
break; localType = "D";
default: break;
assert false; default:
} System.out.println(line);
System.out.println(m.group(2));
System.out.println(m.group(3));
assert false;
}
mInitializedRegisters.add(localName); mInitializedRegisters.add(localName);
mOut.append(".local ").append(localName).append(", ") mOut.append(".local ").append(localName).append(", ").append('"')
.append(localName).append(':').append(localType) .append(localName).append('"').append(':').append(localType)
.append('\n'); .append('\n');
} }
return false; return false;
} }
@ -178,11 +181,11 @@ public class DebugInjector {
} }
return false; return false;
} }
if (line2.equals("parameter")) { if (line2.equals("param")) {
mOut.append(".parameter \"p").append(currParam++).append("\"\n"); mOut.append(".param \"p").append(currParam++).append("\"\n");
return false; return false;
} }
if (line2.startsWith("parameter")) { if (line2.startsWith("param")) {
mOut.append(line).append("\n"); mOut.append(line).append("\n");
currParam++; currParam++;
return false; return false;
@ -237,5 +240,5 @@ public class DebugInjector {
private final Set<String> mInitializedRegisters = new HashSet<String>(); private final Set<String> mInitializedRegisters = new HashSet<String>();
private static final Pattern REGISTER_INFO_PATTERN = Pattern private static final Pattern REGISTER_INFO_PATTERN = Pattern
.compile("((?:p|v)\\d+)=\\(([^)]+)\\);"); .compile("((?:p|v)\\d+)=\\(([^,)]+)([^)]*)\\);");
} }