Можете да обработите двоичните си класове, търсейки fdiv операции, вмъквайки проверка за деление на нула.
Java:
return x.getFloat() / f2;
javap изход:
0: aload_0
1: invokevirtual #22; //Method DivByZero$X.getFloat:()F
4: fload_1
5: fdiv
6: freturn
Заместващ код, който хвърля ArithemticException за деление на нула:
0: aload_1
1: invokevirtual #22; //Method DivByZero$X.getFloat:()F
4: fstore_2
5: fload_0
6: fconst_0
7: fcmpl
8: ifne 21
11: new #32; //class java/lang/ArithmeticException
14: dup
15: ldc #34; //String / by zero
17: invokespecial #36; //Method java/lang/ArithmeticException."<init>":(Ljava/lang/String;)V
20: athrow
21: fload_2
22: fload_0
23: fdiv
24: freturn
Тази обработка може да се извърши с помощта на API за манипулиране на байт код като ASM. Това всъщност не е тривиално, но не е и ракетна наука.
Ако всичко, което искате, е да наблюдавате (вместо да променяте работата на кода), тогава по-добър подход може да бъде използването на програма за отстраняване на грешки. Не съм сигурен кои дебъгери биха ви позволили да напишете израз, за да уловите това, което търсите, но не е трудно да напишете свой собствен дебъгер. Sun JDK предоставя JPDA и пример код, показващ как да го използвате (разархивирайте jdk/demo/jpda/examples.jar).
Примерен код, който се прикачва към сокет на localhost:
public class CustomDebugger {
public static void main(String[] args) throws Exception {
String port = args[0];
CustomDebugger debugger = new CustomDebugger();
AttachingConnector connector = debugger.getConnector();
VirtualMachine vm = debugger.connect(connector, port);
try {
// TODO: get & use EventRequestManager
vm.resume();
} finally {
vm.dispose();
}
}
private AttachingConnector getConnector() {
VirtualMachineManager vmManager = Bootstrap.virtualMachineManager();
for (Connector connector : vmManager.attachingConnectors()) {
System.out.println(connector.name());
if ("com.sun.jdi.SocketAttach".equals(connector.name())) {
return (AttachingConnector) connector;
}
}
throw new IllegalStateException();
}
private VirtualMachine connect(AttachingConnector connector, String port)
throws IllegalConnectorArgumentsException, IOException {
Map<String, Connector.Argument> args = connector.defaultArguments();
Connector.Argument pidArgument = args.get("port");
if (pidArgument == null) {
throw new IllegalStateException();
}
pidArgument.setValue(port);
return connector.attach(args);
}
}
person
McDowell
schedule
23.02.2009