{"record":{"id":"ec0260ce5c8d9aed","repo":"pinpoint-apm/pinpoint","slug":"not-found-signature-ec0260","errorCode":null,"errorMessage":"')' not found. signature:","messagePattern":"'\\)' not found\\. signature:","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtils.java","lineNumber":384,"sourceCode":"            return Collections.emptyList();\n        }\n        final Matcher matcher = PARAMETER_SIGNATURE_PATTERN.matcher(parameterSignature);\n        final List<String> parameterTypeList = new ArrayList<>();\n        while (matcher.find()) {\n            parameterTypeList.add(matcher.group());\n        }\n        return parameterTypeList;\n    }\n\n\n    private static String getParameterSignature(String signature) {\n        int start = signature.indexOf('(');\n        if (start == -1) {\n            throw new IllegalArgumentException(\"'(' not found. signature:\" + signature);\n        }\n        final int end = signature.indexOf(')', start + 1);\n        if (end == -1) {\n            throw new IllegalArgumentException(\"')' not found. signature:\" + signature);\n        }\n        start = start + 1;\n        if (start == end) {\n            return \"\";\n        }\n        return signature.substring(start, end);\n    }\n\n    public static String[] getParameterType(Class<?>[] paramsClass) {\n        if (paramsClass == null) {\n            return null;\n        }\n        String[] paramsString = new String[paramsClass.length];\n        for (int i = 0; i < paramsClass.length; i++) {\n            paramsString[i] = paramsClass[i].getName();\n        }\n        return paramsString;\n    }","sourceCodeStart":366,"sourceCodeEnd":402,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtils.java#L366-L402","documentation":"After finding '(' in the method descriptor, getParameterSignature looks for the matching ')'. If the signature has an opening parenthesis but no closing one, the descriptor is truncated/malformed and IllegalArgumentException is thrown.","triggerScenarios":"Calling parameterSignature/getParameterSignature with a truncated method descriptor such as '(ILjava/lang/String; — cut off before the parameter list terminator.","commonSituations":"Descriptor strings truncated by fixed-length storage or bad string slicing; signature built incrementally and passed before completion; corrupted API metadata caches.","solutions":["Ensure the complete descriptor including ')' (and return type) is passed","Fix string truncation where the descriptor is produced or stored","Validate with signature.indexOf(')') > signature.indexOf('(') before calling"],"exampleFix":"// before\nString sig = \"(ILjava/lang/String;\"; // truncated -> throws\n// after\nString sig = \"(ILjava/lang/String;)V\"; // complete descriptor","handlingStrategy":"validation","validationCode":"int open = signature.indexOf('('); if (open < 0 || signature.indexOf(')', open + 1) < 0) { throw new IllegalArgumentException(\"truncated method descriptor: \" + signature); }","typeGuard":"boolean isCompleteMethodDescriptor(String s) { int o = s == null ? -1 : s.indexOf('('); return o >= 0 && s.indexOf(')', o + 1) >= 0; }","tryCatchPattern":"try { params = JavaAssistUtils.parseParameterSignature(sig); } catch (IllegalArgumentException e) { logger.warn(\"Truncated descriptor {}\", sig); params = Collections.emptyList(); }","preventionTips":["Avoid fixed-length/truncating storage of descriptors","Validate descriptor completeness before caching","Build descriptors atomically and pass them only when complete"],"tags":["java","jvm-signature","parsing"],"backgroundTag":"invalid-argument-format","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}