add some extra try/except to some of the stream functions so the lua part error out properly. And start adding the java varscan scantype option

This commit is contained in:
Dark Byte 2023-06-18 14:36:16 +02:00
parent 2d70b881cf
commit 262cbe39b3
4 changed files with 175 additions and 35 deletions

View File

@ -343,7 +343,7 @@ begin
lua_pushstring(l, e.Message);
if (GetCurrentThreadId=MainThreadID) and (e.Message='Access violation') and mainform.miEnableLCLDebug.checked then
if (GetCurrentThreadId=MainThreadID) and mainform.miEnableLCLDebug.checked then
begin
DebugLn('Lua Exception: '+e.Message);
lazlogger.DumpExceptionBackTrace;

View File

@ -130,7 +130,12 @@ var
stream: Tstream;
begin
stream:=luaclass_getClassObject(L);
try
lua_pushinteger(L,stream.ReadByte);
except
lua_pushstring(L,'stream error');
lua_error(L);
end;
result:=1;
end;
@ -139,7 +144,11 @@ var
stream: Tstream;
begin
stream:=luaclass_getClassObject(L);
try
stream.WriteByte(lua_tointeger(L,1));
finally
end;
result:=0;
end;
@ -148,7 +157,12 @@ var
stream: Tstream;
begin
stream:=luaclass_getClassObject(L);
try
lua_pushinteger(L,stream.ReadWord);
except
lua_pushstring(L,'stream error');
lua_error(L);
end;
result:=1;
end;
@ -166,7 +180,12 @@ var
stream: Tstream;
begin
stream:=luaclass_getClassObject(L);
try
lua_pushinteger(L,stream.ReadDword);
except
lua_pushstring(L,'stream error');
lua_error(L);
end;
result:=1;
end;
@ -184,7 +203,12 @@ var
stream: Tstream;
begin
stream:=luaclass_getClassObject(L);
try
lua_pushinteger(L,stream.ReadQword);
except
lua_pushstring(L,'stream error');
lua_error(L);
end;
result:=1;
end;
@ -203,7 +227,13 @@ var
f: single;
begin
stream:=luaclass_getClassObject(L);
try
stream.Read(f,sizeof(f));
except
lua_pushstring(L,'stream error');
lua_error(L);
end;
lua_pushnumber(L,f);
result:=1;
end;
@ -225,7 +255,13 @@ var
d: double;
begin
stream:=luaclass_getClassObject(L);
try
stream.Read(d,sizeof(d));
except
lua_pushstring(L,'stream error');
lua_error(L);
end;
lua_pushnumber(L,d);
result:=1;
end;

View File

@ -56,6 +56,8 @@ JAVACMD_SETFIELDVALUES=42
JAVACMD_GETOBJECTCLASSNAMES=43
JAVACMD_GETFIELDSIGNATUREBYOBJECT=44
JAVACMD_TERMINATESERVER=255
@ -1732,11 +1734,46 @@ function java_getFieldDeclaringClass(klass, fieldid)
return result
end
function java_getFieldSignature(fieldid)
function java_getFieldSignatureByObject(object, fieldid)
--slightly faster as 2 pipecalls can be skipped if you don't have the class (get class, release class)
local result={}
local ms=createMemoryStream()
ms.writeByte(JAVACMD_GETFIELDSIGNATUREBYOBJECT)
ms.writeQword(object)
ms.writeQword(fieldid)
ms.Position=0
javapipe.lock()
javapipe.writeFromStream(ms)
ms.clear()
local sz=javapipe.readDword()
javapipe.readIntoStream(ms, sz)
javapipe.unlock()
ms.position=0
local length
length=ms.readWord()
result.name=ms.readString(length)
length=ms.readWord()
result.signature=ms.readString(length)
length=ms.readWord()
result.generic=ms.readString(length)
ms.destroy()
return result
end
function java_getFieldSignature(class, fieldid)
local result={}
local ms=createMemoryStream()
ms.writeByte(JAVACMD_GETFIELDSIGNATURE)
ms.writeQword(class)
ms.writeQword(fieldid)
ms.Position=0
@ -1898,11 +1935,7 @@ end
function java_getField(jObject, fieldid, signature)
if signature==nil then
--I need to figure it out myself I guess...
local klass=java_getObjectClass(jObject)
signature=java_getFieldSignature(fieldid).signature
java_dereferenceLocalObject(klass)
signature=java_getFieldSignatureByObject(jObject, fieldid).signature
end
--parse the signature
@ -1938,10 +1971,7 @@ end
function java_setField(jObject, fieldid, signature, value)
if signature==nil then
--I need to figure it out myself I guess...
local klass=java_getObjectClass(jObject)
signature=java_getFieldSignature(fieldid).signature
java_dereferenceLocalObject(klass)
signature=java_getFieldSignatureByObject(jObject, fieldid).signature
end
local vartype=Java_TypeSigToIDConversion[string.sub(signature,1,1)]
@ -2586,16 +2616,12 @@ function varscan_showResults(count)
local fieldname='fieldindex '..java.varscan.currentresults[i].fieldindex
if fieldid then
fieldname=string.format("%x (%s)", fieldid, fieldname)
--[[
local fieldsig=java_getFieldSignature(object, fieldid)
local fieldsig=java_getFieldSignatureByObject(object, fieldid)
if fieldsig.name then
fieldname=fieldsig.name.. ' ('..fieldname..')'
end
--]]
end
java.varscan.Results.Items.Add('Obj('..classname..'::'..fieldname..')')
end
@ -2694,11 +2720,21 @@ function miJavaVariableScanClick(sender)
varscan.ValueText=createLabel(varscan.controls)
varscan.ValueText.Caption=translate("Value")
varscan.ScanType=createComboBox(varscan.controls)
varscan.ScanType.Items.add('Exact Value')
varscan.ScanType.Items.add('Increased Value')
varscan.ScanType.Items.add('Decreased Value')
varscan.ScanType.Items.add('Changed Value')
varscan.ScanType.Items.add('Unchanged Value')
-- varscan.ScanType.visible=false
varscan.FirstScan=createButton(varscan.controls)
varscan.FirstScan.Caption=translate("First Scan")
varscan.FirstScan.AutoSize=true
varscan.NextScan=createButton(varscan.controls)
varscan.NextScan.Caption=translate("Next Scan")
varscan.NextScan.AutoSize=true
local width=6*dpim+math.max(varscan.form.Canvas.getTextWidth(varscan.FirstScan.Caption), varscan.form.Canvas.getTextWidth(varscan.NextScan.Caption)) --guess which one will be bigger... (just in case someone translates this)
@ -2720,6 +2756,13 @@ function miJavaVariableScanClick(sender)
varscan.ValueText.AnchorSideBottom.Side=asrTop
varscan.ValueText.Anchors="[akLeft, akBottom]"
varscan.ScanType.AnchorSideLeft.Control=varscan.ValueBox
varscan.ScanType.AnchorSideLeft.Side=asrLeft
varscan.ScanType.AnchorSideRight.Control=varscan.ValueBox
varscan.ScanType.AnchorSideRight.Side=asrRight
varscan.ScanType.AnchorSideTop.Control=varscan.ValueBox
varscan.ScanType.AnchorSideTop.Side=asrBottom
varscan.ScanType.Anchors="[akTop, akLeft, akRight]"
varscan.FirstScan.AnchorSideLeft.Control=varscan.ValueBox
varscan.FirstScan.AnchorSideLeft.Side=asrLeft

View File

@ -94,6 +94,7 @@ int _ZN3art9ArtMethod18HasAnyCompiledCodeEv(void* ArtMethod);
#define JAVAVMD_GETOBJECTCLASSNAME 41
#define JAVACMD_SETFIELDVALUES 42
#define JAVACMD_GETOBJECTCLASSNAMES 43
#define JAVACMD_GETFIELDSIGNATUREBYOBJECT 44
@ -263,36 +264,22 @@ void js_getscanresults(PCEJVMTIAgent agent)
void js_getFieldSignature(PCEJVMTIAgent agent)
{
debug_log("js_getFieldSignature");
/*
jfieldID fieldid=(jfieldID)ps_readQword(agent->pipe);
GetFieldDeclaringClass(jvmtiEnv* env,
jclass klass,
jfieldID field,
jclass* declaring_class_ptr)
debug_log("js_getFieldSignatureByObject");
jclass klass=_env->GetObjectClass(agent->env, object);
jclass c=(jclass)ps_readQword(agent->pipe);
jfieldID fid=(jfieldID)ps_readQword(agent->pipe);
PMemoryStream ms=ms_create(512);
if (klass)
{
jint error;
char *name=NULL, *sig=NULL, *gen=NULL;
int len;
if (_jvmti->GetFieldName(agent->jvmti, klass, fieldid, &name, &sig, &gen)==JVMTI_ERROR_NONE)
if (_jvmti->GetFieldName(agent->jvmti, c, fid, &name, &sig, &gen)==JVMTI_ERROR_NONE)
{
if (name)
{
len=(int)strlen(name);
ms_writeWord(ms, len);
ms_write(ms, name, len);
//debug_log("fieldname: %s", name);
_jvmti->Deallocate(agent->jvmti, (unsigned char *)name);
}
else
@ -326,11 +313,81 @@ GetFieldDeclaringClass(jvmtiEnv* env,
ms_writeWord(ms, 0);
}
ps_writeMemStream(agent->pipe, ms);
ms_destroy(ms);
}
void js_getFieldSignatureByObject(PCEJVMTIAgent agent)
{
debug_log("js_getFieldSignatureByObject");
jobject object=(jobject)ps_readQword(agent->pipe);
jfieldID fieldid=(jfieldID)ps_readQword(agent->pipe);
debug_log("js_getFieldSignatureByObject");
jclass klass=_env->GetObjectClass(agent->env, object);
PMemoryStream ms=ms_create(512);
if (klass)
{
jint error;
char *name=NULL, *sig=NULL, *gen=NULL;
int len;
if (_jvmti->GetFieldName(agent->jvmti, klass, fieldid, &name, &sig, &gen)==JVMTI_ERROR_NONE)
{
if (name)
{
len=(int)strlen(name);
ms_writeWord(ms, len);
ms_write(ms, name, len);
_jvmti->Deallocate(agent->jvmti, (unsigned char *)name);
}
else
ms_writeWord(ms, 0);
if (sig)
{
len=(int)strlen(sig);
ms_writeWord(ms, len);
ms_write(ms, sig, len);
_jvmti->Deallocate(agent->jvmti, (unsigned char *)sig);
}
else
ms_writeWord(ms, 0);
if (gen)
{
len=(int)strlen(gen);
ms_writeWord(ms, len);
ms_write(ms, gen, len);
_jvmti->Deallocate(agent->jvmti,(unsigned char *)gen);
}
else
ms_writeWord(ms, 0);
}
else
{
debug_log("js_getFieldSignatureByObject: GetFieldName failed");
ms_writeWord(ms, 0);
ms_writeWord(ms, 0);
ms_writeWord(ms, 0);
}
_env->DeleteLocalRef(agent->env, klass);
}
else
{
debug_log("js_getFieldSignatureByObject: invalid object");
ms_writeWord(ms, 0);
ms_writeWord(ms, 0);
ms_writeWord(ms, 0);
}
ps_writeMemStream(agent->pipe, ms);
ms_destroy(ms); */
ms_destroy(ms);
}
@ -2219,6 +2276,10 @@ void launchCEJVMTIServer(JNIEnv *env, jvmtiEnv *jvmti, void* soa)
js_getFieldSignature(agent);
break;
case JAVACMD_GETFIELDSIGNATUREBYOBJECT:
js_getFieldSignatureByObject(agent);
break;
default:
debug_log("Invalid command. Terminating server");
terminated=1;