Skip to content

Commit

Permalink
Log if an object is itself a LMS in the retention path
Browse files Browse the repository at this point in the history
  • Loading branch information
SamboyCoding committed Aug 17, 2023
1 parent b717d76 commit 31e1d84
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 25 deletions.
41 changes: 41 additions & 0 deletions UMS.Analysis/Structures/Objects/ManagedClassInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,17 @@ private void AppendRetentionReason(StringBuilder sb, SnapshotFile file, ManagedC
var field = fieldList.First(f => f.FieldIndex == child.FieldIndexOrArrayOffset);
sb.Append("Field ").Append(file.GetFieldName(field.FieldIndex)).Append(" of ");
sb.Append(parentName).Append(" at 0x").Append(parent.ObjectAddress.ToString("X"));

if (parent.InheritsFromUnityEngineObject(file))
{
var parentInst = file.GetOrCreateManagedClassInstance(parent.ObjectAddress);

if (parentInst.HasValue && parentInst.Value.IsLeakedManagedShell(file))
sb.Append(" (leaked managed shell)");
else
sb.Append(" (unity object, non-leaked)");
}

sb.Append(" <- ");
break;
}
Expand All @@ -277,4 +288,34 @@ private void AppendRetentionReason(StringBuilder sb, SnapshotFile file, ManagedC
throw new ArgumentOutOfRangeException(nameof(child), "Invalid LoadedReason");
}
}

public bool IsLeakedManagedShell(SnapshotFile file)
{
if (!InheritsFromUnityEngineObject(file))
//Can't be a leaked managed shell if it's not a managed shell at all
return false;

// if (Fields == null)
// return false; //Can't check

var fields = file.GetInstanceFieldInfoForTypeIndex(TypeInfo.TypeIndex);
for (var fieldNumber = 0; fieldNumber < fields.Length; fieldNumber++)
{
var basicFieldInfoCache = fields[fieldNumber];
var name = file.GetFieldName(basicFieldInfoCache.FieldIndex);

if (name == "m_CachedPtr")
{
var value = Fields[fieldNumber];

if (value is not IntegerFieldValue integerFieldValue)
throw new Exception("Expected integer field value");

return integerFieldValue.Value == 0;
}
}

//Couldn't find the m_CachedPtr field. Weird, but return false.
return false;
}
}
37 changes: 12 additions & 25 deletions UnityMemorySnapshotThing/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,36 +87,21 @@ private static void FindLeakedUnityObjects(SnapshotFile file)
var leakedTypes = new Dictionary<string, int>();
foreach (var managedClassInstance in unityEngineObjects)
{
var fields = file.GetInstanceFieldInfoForTypeIndex(managedClassInstance.TypeInfo.TypeIndex);
for (var fieldNumber = 0; fieldNumber < fields.Length; fieldNumber++)
if (managedClassInstance.IsLeakedManagedShell(file))
{
var basicFieldInfoCache = fields[fieldNumber];
var name = file.GetFieldName(basicFieldInfoCache.FieldIndex);
var typeName = file.GetTypeName(managedClassInstance.TypeInfo.TypeIndex);

if (name == "m_CachedPtr")
{
var value = managedClassInstance.Fields[fieldNumber];

if(value is not IntegerFieldValue integerFieldValue)
throw new Exception("Expected integer field value");

if (integerFieldValue.Value == 0)
{
var typeName = file.GetTypeName(managedClassInstance.TypeInfo.TypeIndex);
str = $"Found leaked managed object of type: {typeName} at memory address 0x{managedClassInstance.ObjectAddress:X}";
Console.WriteLine(str);
ret.AppendLine(str);

str = $"Found leaked managed object of type: {typeName} at memory address 0x{managedClassInstance.ObjectAddress:X}";
Console.WriteLine(str);
ret.AppendLine(str);

str = $" Retention Path: {managedClassInstance.GetFirstObservedRetentionPath(file)}";
Console.WriteLine(str);
ret.AppendLine(str);
str = $" Retention Path: {managedClassInstance.GetFirstObservedRetentionPath(file)}";
Console.WriteLine(str);
ret.AppendLine(str);

leakedTypes[typeName] = leakedTypes.GetValueOrDefault(typeName) + 1;
leakedTypes[typeName] = leakedTypes.GetValueOrDefault(typeName) + 1;

numLeaked++;
}
}
numLeaked++;
}
}

Expand All @@ -131,4 +116,6 @@ private static void FindLeakedUnityObjects(SnapshotFile file)

File.WriteAllText("leaked_objects.txt", ret.ToString());
}


}

0 comments on commit 31e1d84

Please sign in to comment.