Tencent/matrix · error · IllegalArgumentException

Unsupported object type $value

Error message

Unsupported object type $value

What it means

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.

Solutions

  1. Upgrade Matrix to a version whose parser matches your device's dump format.
  2. Re-dump the hprof from a supported device and retry.
  3. Skip/discard corrupted chains defensively with try-catch around parsing.
  4. Check that the chain data was produced by the same Matrix version that parses it (no cross-version file exchange).

Example fix

// before
val chain = MemoryUtil.parseLeakChain(legacyChainFile) // foreign format
// after
try {
  val chain = MemoryUtil.parseLeakChain(legacyChainFile)
} catch (e: IllegalArgumentException) {
  MatrixLog.e(TAG, "unsupported object type, dropping chain")
  legacyChainFile.delete()
}
Defensive patterns

Strategy: try-catch

Validate before calling

fun isKnownObjectType(v: Int) = v in 1..3

Type guard

fun Int.asHolder(): ReferenceTraceElement.Holder? = when (this) {
  1 -> ReferenceTraceElement.Holder.CLASS
  2 -> ReferenceTraceElement.Holder.ARRAY
  3 -> ReferenceTraceElement.Holder.OBJECT
  else -> null
}

Try / catch

try {
  val chain = MemoryUtil.parseLeakChain(file)
} catch (e: IllegalArgumentException) {
  MatrixLog.e(TAG, "unsupported object type, dropping chain: ${e.message}")
}

Prevention

When it happens

Trigger: Parsing a leak chain whose node.objectType is not 1, 2, or 3 — from malformed, truncated, or newer-format hprof-derived chain files.

Common situations: Feeding hprof dumps from unsupported ART/OS versions into the analyzer; corrupted dumps after low-memory kills; data produced by incompatible tooling versions.

Related errors


AI-assisted analysis of Tencent/matrix@3b8293bd65 (2026-09-08). Data as JSON: /api/errors/bf3dbbdd5735ed2d. Report an issue: GitHub.

Appendix: source

Thrown at matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-android/src/main/java/com/tencent/matrix/resource/MemoryUtil.kt:284

        }
    }

    private fun convertReferenceType(value: Int): ReferenceTraceElement.Type =
        when (value) {
            // It is an end-tag that can only be the last chain element reference type.
            0 -> ReferenceTraceElement.Type.INSTANCE_FIELD
            1 -> ReferenceTraceElement.Type.STATIC_FIELD
            2 -> ReferenceTraceElement.Type.INSTANCE_FIELD
            3 -> ReferenceTraceElement.Type.ARRAY_ENTRY
            else -> throw IllegalArgumentException("Unsupported reference type $value")
        }

    private fun convertObjectType(value: Int): ReferenceTraceElement.Holder =
        when (value) {
            1 -> ReferenceTraceElement.Holder.CLASS
            2 -> ReferenceTraceElement.Holder.ARRAY
            3 -> ReferenceTraceElement.Holder.OBJECT
            else -> throw IllegalArgumentException("Unsupported object type $value")
        }

    private data class LeakChain(val nodes: List<Node>) {
        data class Node(
            val objectName: String,
            val objectType: Int,
            val referenceName: String,
            val referenceType: Int
        )

        fun convertToReferenceChain(): ReferenceChain =
            nodes.map {
                ReferenceTraceElement(
                    it.referenceName,
                    convertReferenceType(it.referenceType),
                    convertObjectType(it.objectType),
                    it.objectName,
                    null, null, emptyList()

View on GitHub (pinned to 3b8293bd65)