{"record":{"id":"bf3dbbdd5735ed2d","repo":"Tencent/matrix","slug":"unsupported-object-type-value","errorCode":null,"errorMessage":"Unsupported object type $value","messagePattern":"Unsupported object type \\$value","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-android/src/main/java/com/tencent/matrix/resource/MemoryUtil.kt","lineNumber":284,"sourceCode":"        }\n    }\n\n    private fun convertReferenceType(value: Int): ReferenceTraceElement.Type =\n        when (value) {\n            // It is an end-tag that can only be the last chain element reference type.\n            0 -> ReferenceTraceElement.Type.INSTANCE_FIELD\n            1 -> ReferenceTraceElement.Type.STATIC_FIELD\n            2 -> ReferenceTraceElement.Type.INSTANCE_FIELD\n            3 -> ReferenceTraceElement.Type.ARRAY_ENTRY\n            else -> throw IllegalArgumentException(\"Unsupported reference type $value\")\n        }\n\n    private fun convertObjectType(value: Int): ReferenceTraceElement.Holder =\n        when (value) {\n            1 -> ReferenceTraceElement.Holder.CLASS\n            2 -> ReferenceTraceElement.Holder.ARRAY\n            3 -> ReferenceTraceElement.Holder.OBJECT\n            else -> throw IllegalArgumentException(\"Unsupported object type $value\")\n        }\n\n    private data class LeakChain(val nodes: List<Node>) {\n        data class Node(\n            val objectName: String,\n            val objectType: Int,\n            val referenceName: String,\n            val referenceType: Int\n        )\n\n        fun convertToReferenceChain(): ReferenceChain =\n            nodes.map {\n                ReferenceTraceElement(\n                    it.referenceName,\n                    convertReferenceType(it.referenceType),\n                    convertObjectType(it.objectType),\n                    it.objectName,\n                    null, null, emptyList()","sourceCodeStart":266,"sourceCodeEnd":302,"githubUrl":"https://github.com/Tencent/matrix/blob/3b8293bd65d47eeea7caf1f32a3a5d4d5eab60e7/matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-android/src/main/java/com/tencent/matrix/resource/MemoryUtil.kt#L266-L302","documentation":"MemoryUtil.convertObjectType maps numeric object-type codes from leak-chain nodes to ReferenceTraceElement.Holder. Values other than 1 (CLASS), 2 (ARRAY), or 3 (OBJECT) throw IllegalArgumentException('Unsupported object type $value'), signaling unknown or corrupted dump data.","triggerScenarios":"Parsing a leak chain whose node.objectType is not 1, 2, or 3 — from malformed, truncated, or newer-format hprof-derived chain files.","commonSituations":"Feeding hprof dumps from unsupported ART/OS versions into the analyzer; corrupted dumps after low-memory kills; data produced by incompatible tooling versions.","solutions":["Upgrade Matrix to a version whose parser matches your device's dump format.","Re-dump the hprof from a supported device and retry.","Skip/discard corrupted chains defensively with try-catch around parsing.","Check that the chain data was produced by the same Matrix version that parses it (no cross-version file exchange)."],"exampleFix":"// before\nval chain = MemoryUtil.parseLeakChain(legacyChainFile) // foreign format\n// after\ntry {\n  val chain = MemoryUtil.parseLeakChain(legacyChainFile)\n} catch (e: IllegalArgumentException) {\n  MatrixLog.e(TAG, \"unsupported object type, dropping chain\")\n  legacyChainFile.delete()\n}","handlingStrategy":"try-catch","validationCode":"fun isKnownObjectType(v: Int) = v in 1..3","typeGuard":"fun Int.asHolder(): ReferenceTraceElement.Holder? = when (this) {\n  1 -> ReferenceTraceElement.Holder.CLASS\n  2 -> ReferenceTraceElement.Holder.ARRAY\n  3 -> ReferenceTraceElement.Holder.OBJECT\n  else -> null\n}","tryCatchPattern":"try {\n  val chain = MemoryUtil.parseLeakChain(file)\n} catch (e: IllegalArgumentException) {\n  MatrixLog.e(TAG, \"unsupported object type, dropping chain: ${e.message}\")\n}","preventionTips":["Regenerate dumps when Matrix or OS versions change instead of reusing old chain files.","Validate chain node fields before deep parsing.","Isolate parsing in a worker with graceful failure handling so one bad chain doesn't crash the analysis."],"tags":["android","hprof","memory-leak","unsupported-value"],"backgroundTag":"unsupported-enum-value","analyzedSha":"3b8293bd65d47eeea7caf1f32a3a5d4d5eab60e7","analyzedAt":"2026-09-08T08:01:39.722Z","contentChangedAt":"2026-09-08T08:01:39.722Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}