Java-Methodenparameterwerte in ASM

8

Ich versuche, die Werte der Methodenparameter eines Java-Programms zu erhalten. Ich verwende ASM, um den Bytecode zu instrumentieren und diese Werte zu erhalten. Ich laufe jedoch in einige Schwierigkeiten.

Hier ist die Methode visitCode (), mit der der Code instrumentiert wird. Was es macht ist:

  1. Erstellen Sie ein leeres Array zum Speichern der gesammelten Parameter.
  2. Laden Sie für jeden Parameter seinen Wert in das Array.
  3. Senden Sie dieses Array an die OnMethodEntry-Methode meines Agenten (in der die Werte verwendet werden).

.

%Vor%

Dies funktioniert jedoch nicht, wenn die Methode anscheinend mehr als einen Parameter hat.

Die erhaltene Klassendatei zeigt folgende Dinge:

%Vor%

Wo 2 lokale Objekte erstellt werden, anstatt die Parameter zu laden.

Der Bytecode zeigt nichts Seltsames an:

%Vor%

Und schließlich ist der angezeigte Fehler (bei Verwendung von -overify):

%Vor%

Ansonsten ist es:

%Vor%

Dies sollte normalerweise funktionieren, da ich gerade Informationen aus dem Stack-Frame lade. Ich habe auch versucht, statische & amp; nicht statische Methoden (wie aus dem Stapel hier erklärt: Ссылка ), aber immer noch ohne Erfolg. p>

Irgendeine Idee, warum das passiert, oder vielleicht eine Idee einer Lösung?

Danke:)

BEARBEITEN:

Es funktioniert jetzt, wenn primitive Typen (dank Vorschläge von int3 unten :) :)). Hier ist der Arbeitscode der Methode visitCode ():

%Vor%     
Adel 17.12.2012, 09:09
quelle

1 Antwort

6

Sie verwenden aastore , um eine char in einem Objekt-Array zu speichern, was ein Typfehler ist. aastore sollte nur zum Speichern von Objekten und Arrays verwendet werden, was wahrscheinlich der Grund ist, warum der Fehler 'erwartetes Objekt / Array auf Stack' lautet. Zeichen sollten in einem Char-Array mit castore gespeichert werden. Da dies jedoch für beliebige Signaturen funktionieren soll, möchten Sie wahrscheinlich die primitiven Typen in Objekte einbetten, die Sie dann mit aastore verwenden können - z. char sollte in einem java.lang.Character -Objekt eingerahmt werden.

    
int3 17.12.2012, 10:01
quelle