ocaml-lsp icon indicating copy to clipboard operation
ocaml-lsp copied to clipboard

LSP crash w/ Invalid_argument("List.combine")

Open ELLIOTTCABLE opened this issue 1 year ago • 3 comments
trafficstars

I'm getting an lsp-server crash; it's not clear what initiates it, but it happens almost immediately after invoking ocaml.server.restart:

[Error - 7:39:15 PM] Server process exited with code 0.
detached: /-----------------------------------------------------------------------
| Internal error: Uncaught exception.
| Invalid_argument("List.combine")
| Raised at Stdlib.invalid_arg in file "stdlib.ml", line 30, characters 20-45
| Called from Stdlib__List.combine in file "list.ml", line 305, characters 36-49
| Called from Merlin_specific__Browse_raw.of_expression_desc in file "src/ocaml/merlin_specific/browse_raw.ml", line 392, characters 23-54
| Called from Merlin_specific__Browse_raw.fold_node in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 698, characters 2-24
| Called from Merlin_specific__Browse_raw.all_holes.aux in file "src/ocaml/merlin_specific/browse_raw.ml", line 987, characters 4-28
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression_desc in file "src/ocaml/merlin_specific/browse_raw.ml", line 326, characters 4-53
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression_desc in file "src/ocaml/merlin_specific/browse_raw.ml", line 326, characters 4-53
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_node in file "src/ocaml/merlin_specific/browse_raw.ml", line 575, characters 24-84
| Called from Merlin_specific__Browse_raw.list_fold in file "src/ocaml/merlin_specific/browse_raw.ml", line 236, characters 37-53
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.list_fold in file "src/ocaml/merlin_specific/browse_raw.ml", line 236, characters 37-53
| Called from Merlin_specific__Browse_raw.list_fold_with_next in file "src/ocaml/merlin_specific/browse_raw.ml", line 247, characters 59-84
| Called from Merlin_specific__Browse_raw.all_holes in file "src/ocaml/merlin_specific/browse_raw.ml", line 989, characters 2-20
| Called from Query_commands.dispatch.loc_and_types_of_holes in file "src/frontend/query_commands.ml", line 613, characters 15-42
| Called from Stdlib__List.map in file "list.ml", line 92, characters 20-23
| Called from Merlin_utils__Std.List.concat_map in file "src/utils/std.ml" (inlined), line 129, characters 32-42
| Called from Query_commands.dispatch in file "src/frontend/query_commands.ml", line 619, characters 4-51
| Called from Ocaml_lsp_server__Diagnostics.merlin_diagnostics.(fun) in file "ocaml-lsp-server/src/diagnostics.ml", line 339, characters 12-50
| Called from Merlin_utils__Std.let_ref in file "src/utils/std.ml", line 693, characters 8-12
| Re-raised at Merlin_utils__Std.let_ref in file "src/utils/std.ml", line 695, characters 30-39
| Called from Merlin_utils__Misc.try_finally in file "src/utils/misc.ml", line 45, characters 8-15
| Re-raised at Merlin_utils__Misc.try_finally in file "src/utils/misc.ml", line 62, characters 10-24
| Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15
| Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52
| Called from Merlin_kernel__Mocaml.with_state in file "src/kernel/mocaml.ml", line 18, characters 8-38
| Re-raised at Merlin_kernel__Mocaml.with_state in file "src/kernel/mocaml.ml", line 20, characters 42-53
| Called from Ocaml_lsp_server__Document.Single_pipeline.use.(fun) in file "ocaml-lsp-server/src/document.ml", line 147, characters 22-77
| Called from Stdune__Exn_with_backtrace.try_with in file "otherlibs/stdune/src/exn_with_backtrace.ml", line 9, characters 8-12
| Re-raised at Stdune__Exn.raise_with_backtrace in file "otherlibs/stdune/src/exn.ml" (inlined), line 36, characters 27-56
| Called from Stdune__Exn_with_backtrace.reraise in file "otherlibs/stdune/src/exn_with_backtrace.ml", line 18, characters 33-71
| Called from Fiber__Core.O.(>>|).(fun) in file "fiber/src/core.ml", line 250, characters 36-41
| Called from Fiber__Scheduler.exec in file "fiber/src/scheduler.ml", line 73, characters 8-11
\-----------------------------------------------------------------------

The only invocation of List.combine seems to be here:

https://github.com/ocaml/merlin/blob/v4.11-414/src/ocaml/merlin_specific/browse_raw.ml#L382-L393

File contents
open Printf
open Lwt.Syntax

let show_option o = Option.value ~default:"<none>" o

let create_random_large_value size =
   let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" in
   let chars_len = String.length chars in
   let result = Bytes.create size in
   for i = 0 to size - 1 do
     Bytes.set result i chars.[Random.int chars_len]
   done ;
   Bytes.to_string result


let create_and_leak_value size =
   let value = create_random_large_value size in
   let key = Lwt.new_key () in
   Lwt.bind (Lwt.return ()) (fun () ->
       let* () =
          Lwt.with_value key (Some value) (fun () ->
            (* test thing *)
            123
          )
       in
       printf "Gc.full_major ...\n%!" ;
       Gc.full_major () ;
       Lwt.return_unit)


let rec create_and_link_sequentially n size =
   match n with
   | 0 -> Lwt.return_unit
   | _ ->
       let* () = create_and_leak_value size in
       let* () = Lwt_unix.sleep 0.1 in
       create_and_link_sequentially (n - 1) size


let sleeper_and_leaker () =
   let leaker = create_and_link_sequentially 5 (1024 * 1024 * 10) in
   let sleeper = Lwt_unix.sleep 3. in
   let* (), () = Lwt.both sleeper leaker in
   Lwt.return_unit


let () =
   Memtrace.trace_if_requested ~sampling_rate:7e-6 ~context:"lwt leaking test" () ;

   Lwt_main.run @@ sleeper_and_leaker () ;

   printf "Gc.full_major ...\n%!" ;
   Gc.full_major ()
Full "OCaml Language Server" output pane contents
[Trace - 7:39:15 PM] Sending request 'shutdown - (5)'.
[Trace - 7:39:15 PM] Received response 'shutdown - (5)' in 0ms.
No result returned.


[Trace - 7:39:15 PM] Sending notification 'exit'.
No parameters provided.


halting dune merlin process
{ pid = pid 2836610; initial_cwd = "/home/me/code/ocaml-ambient-context" }
closed merlin process
{ pid = pid 2836610; initial_cwd = "/home/me/code/ocaml-ambient-context" }
[Trace - 7:39:15 PM] Sending request 'initialize - (0)'.
Params: {
    "processId": 2799344,
    "clientInfo": {
        "name": "Visual Studio Code",
        "version": "1.85.2"
    },
    "locale": "en",
    "rootPath": "/home/me/code/ocaml-ambient-context",
    "rootUri": "file:///home/me/code/ocaml-ambient-context",
    "capabilities": {
        "workspace": {
            "applyEdit": true,
            "workspaceEdit": {
                "documentChanges": true,
                "resourceOperations": [
                    "create",
                    "rename",
                    "delete"
                ],
                "failureHandling": "textOnlyTransactional",
                "normalizesLineEndings": true,
                "changeAnnotationSupport": {
                    "groupsOnLabel": true
                }
            },
            "configuration": true,
            "didChangeWatchedFiles": {
                "dynamicRegistration": true,
                "relativePatternSupport": true
            },
            "symbol": {
                "dynamicRegistration": true,
                "symbolKind": {
                    "valueSet": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7,
                        8,
                        9,
                        10,
                        11,
                        12,
                        13,
                        14,
                        15,
                        16,
                        17,
                        18,
                        19,
                        20,
                        21,
                        22,
                        23,
                        24,
                        25,
                        26
                    ]
                },
                "tagSupport": {
                    "valueSet": [
                        1
                    ]
                },
                "resolveSupport": {
                    "properties": [
                        "location.range"
                    ]
                }
            },
            "codeLens": {
                "refreshSupport": true
            },
            "executeCommand": {
                "dynamicRegistration": true
            },
            "didChangeConfiguration": {
                "dynamicRegistration": true
            },
            "workspaceFolders": true,
            "foldingRange": {
                "refreshSupport": true
            },
            "semanticTokens": {
                "refreshSupport": true
            },
            "fileOperations": {
                "dynamicRegistration": true,
                "didCreate": true,
                "didRename": true,
                "didDelete": true,
                "willCreate": true,
                "willRename": true,
                "willDelete": true
            },
            "inlineValue": {
                "refreshSupport": true
            },
            "inlayHint": {
                "refreshSupport": true
            },
            "diagnostics": {
                "refreshSupport": true
            }
        },
        "textDocument": {
            "publishDiagnostics": {
                "relatedInformation": true,
                "versionSupport": false,
                "tagSupport": {
                    "valueSet": [
                        1,
                        2
                    ]
                },
                "codeDescriptionSupport": true,
                "dataSupport": true
            },
            "synchronization": {
                "dynamicRegistration": true,
                "willSave": true,
                "willSaveWaitUntil": true,
                "didSave": true
            },
            "completion": {
                "dynamicRegistration": true,
                "contextSupport": true,
                "completionItem": {
                    "snippetSupport": true,
                    "commitCharactersSupport": true,
                    "documentationFormat": [
                        "markdown",
                        "plaintext"
                    ],
                    "deprecatedSupport": true,
                    "preselectSupport": true,
                    "tagSupport": {
                        "valueSet": [
                            1
                        ]
                    },
                    "insertReplaceSupport": true,
                    "resolveSupport": {
                        "properties": [
                            "documentation",
                            "detail",
                            "additionalTextEdits"
                        ]
                    },
                    "insertTextModeSupport": {
                        "valueSet": [
                            1,
                            2
                        ]
                    },
                    "labelDetailsSupport": true
                },
                "insertTextMode": 2,
                "completionItemKind": {
                    "valueSet": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7,
                        8,
                        9,
                        10,
                        11,
                        12,
                        13,
                        14,
                        15,
                        16,
                        17,
                        18,
                        19,
                        20,
                        21,
                        22,
                        23,
                        24,
                        25
                    ]
                },
                "completionList": {
                    "itemDefaults": [
                        "commitCharacters",
                        "editRange",
                        "insertTextFormat",
                        "insertTextMode",
                        "data"
                    ]
                }
            },
            "hover": {
                "dynamicRegistration": true,
                "contentFormat": [
                    "markdown",
                    "plaintext"
                ]
            },
            "signatureHelp": {
                "dynamicRegistration": true,
                "signatureInformation": {
                    "documentationFormat": [
                        "markdown",
                        "plaintext"
                    ],
                    "parameterInformation": {
                        "labelOffsetSupport": true
                    },
                    "activeParameterSupport": true
                },
                "contextSupport": true
            },
            "definition": {
                "dynamicRegistration": true,
                "linkSupport": true
            },
            "references": {
                "dynamicRegistration": true
            },
            "documentHighlight": {
                "dynamicRegistration": true
            },
            "documentSymbol": {
                "dynamicRegistration": true,
                "symbolKind": {
                    "valueSet": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7,
                        8,
                        9,
                        10,
                        11,
                        12,
                        13,
                        14,
                        15,
                        16,
                        17,
                        18,
                        19,
                        20,
                        21,
                        22,
                        23,
                        24,
                        25,
                        26
                    ]
                },
                "hierarchicalDocumentSymbolSupport": true,
                "tagSupport": {
                    "valueSet": [
                        1
                    ]
                },
                "labelSupport": true
            },
            "codeAction": {
                "dynamicRegistration": true,
                "isPreferredSupport": true,
                "disabledSupport": true,
                "dataSupport": true,
                "resolveSupport": {
                    "properties": [
                        "edit"
                    ]
                },
                "codeActionLiteralSupport": {
                    "codeActionKind": {
                        "valueSet": [
                            "",
                            "quickfix",
                            "refactor",
                            "refactor.extract",
                            "refactor.inline",
                            "refactor.rewrite",
                            "source",
                            "source.organizeImports"
                        ]
                    }
                },
                "honorsChangeAnnotations": true
            },
            "codeLens": {
                "dynamicRegistration": true
            },
            "formatting": {
                "dynamicRegistration": true
            },
            "rangeFormatting": {
                "dynamicRegistration": true,
                "rangesSupport": true
            },
            "onTypeFormatting": {
                "dynamicRegistration": true
            },
            "rename": {
                "dynamicRegistration": true,
                "prepareSupport": true,
                "prepareSupportDefaultBehavior": 1,
                "honorsChangeAnnotations": true
            },
            "documentLink": {
                "dynamicRegistration": true,
                "tooltipSupport": true
            },
            "typeDefinition": {
                "dynamicRegistration": true,
                "linkSupport": true
            },
            "implementation": {
                "dynamicRegistration": true,
                "linkSupport": true
            },
            "colorProvider": {
                "dynamicRegistration": true
            },
            "foldingRange": {
                "dynamicRegistration": true,
                "rangeLimit": 5000,
                "lineFoldingOnly": true,
                "foldingRangeKind": {
                    "valueSet": [
                        "comment",
                        "imports",
                        "region"
                    ]
                },
                "foldingRange": {
                    "collapsedText": false
                }
            },
            "declaration": {
                "dynamicRegistration": true,
                "linkSupport": true
            },
            "selectionRange": {
                "dynamicRegistration": true
            },
            "callHierarchy": {
                "dynamicRegistration": true
            },
            "semanticTokens": {
                "dynamicRegistration": true,
                "tokenTypes": [
                    "namespace",
                    "type",
                    "class",
                    "enum",
                    "interface",
                    "struct",
                    "typeParameter",
                    "parameter",
                    "variable",
                    "property",
                    "enumMember",
                    "event",
                    "function",
                    "method",
                    "macro",
                    "keyword",
                    "modifier",
                    "comment",
                    "string",
                    "number",
                    "regexp",
                    "operator",
                    "decorator"
                ],
                "tokenModifiers": [
                    "declaration",
                    "definition",
                    "readonly",
                    "static",
                    "deprecated",
                    "abstract",
                    "async",
                    "modification",
                    "documentation",
                    "defaultLibrary"
                ],
                "formats": [
                    "relative"
                ],
                "requests": {
                    "range": true,
                    "full": {
                        "delta": true
                    }
                },
                "multilineTokenSupport": false,
                "overlappingTokenSupport": false,
                "serverCancelSupport": true,
                "augmentsSyntaxTokens": true
            },
            "linkedEditingRange": {
                "dynamicRegistration": true
            },
            "typeHierarchy": {
                "dynamicRegistration": true
            },
            "inlineValue": {
                "dynamicRegistration": true
            },
            "inlayHint": {
                "dynamicRegistration": true,
                "resolveSupport": {
                    "properties": [
                        "tooltip",
                        "textEdits",
                        "label.tooltip",
                        "label.location",
                        "label.command"
                    ]
                }
            },
            "diagnostic": {
                "dynamicRegistration": true,
                "relatedDocumentSupport": false
            }
        },
        "window": {
            "showMessage": {
                "messageActionItem": {
                    "additionalPropertiesSupport": true
                }
            },
            "showDocument": {
                "support": true
            },
            "workDoneProgress": true
        },
        "general": {
            "staleRequestSupport": {
                "cancel": true,
                "retryOnContentModified": [
                    "textDocument/semanticTokens/full",
                    "textDocument/semanticTokens/range",
                    "textDocument/semanticTokens/full/delta"
                ]
            },
            "regularExpressions": {
                "engine": "ECMAScript",
                "version": "ES2020"
            },
            "markdown": {
                "parser": "marked",
                "version": "1.1.0"
            },
            "positionEncodings": [
                "utf-16"
            ]
        },
        "notebookDocument": {
            "synchronization": {
                "dynamicRegistration": true,
                "executionSummarySupport": true
            }
        },
        "experimental": {
            "jumpToNextHole": true
        }
    },
    "trace": "verbose",
    "workspaceFolders": [
        {
            "uri": "file:///home/me/code/ocaml-ambient-context",
            "name": "ocaml-ambient-context"
        }
    ]
}


[Trace - 7:39:15 PM] Received notification 'window/logMessage'.
Params: {
    "message": "failed to poll dune registry.\nUnix.Unix_error(Unix.ENOENT, \"stat\", \"/run/user/2040/dune/rpc\")\nMaybe you are not running dune in watch mode?\nHint: $ dune build -w",
    "type": 2
}


[Warn  - 7:39:15 PM] failed to poll dune registry.
Unix.Unix_error(Unix.ENOENT, "stat", "/run/user/2040/dune/rpc")
Maybe you are not running dune in watch mode?
Hint: $ dune build -w
[Trace - 7:39:15 PM] Received response 'initialize - (0)' in 19ms.
Result: {
    "capabilities": {
        "codeActionProvider": {
            "codeActionKinds": [
                "quickfix",
                "refactor.inline",
                "construct",
                "destruct",
                "inferred_intf",
                "put module name in identifiers",
                "remove module name from identifiers",
                "remove type annotation",
                "type-annotate"
            ]
        },
        "codeLensProvider": {
            "resolveProvider": false
        },
        "completionProvider": {
            "resolveProvider": true,
            "triggerCharacters": [
                ".",
                "#"
            ]
        },
        "declarationProvider": true,
        "definitionProvider": true,
        "documentFormattingProvider": true,
        "documentHighlightProvider": true,
        "documentSymbolProvider": true,
        "executeCommandProvider": {
            "commands": [
                "ocamllsp/view-metrics",
                "ocamllsp/open-related-source",
                "ocamllsp/show-document-text",
                "ocamllsp/show-merlin-config",
                "dune/promote"
            ]
        },
        "experimental": {
            "ocamllsp": {
                "interfaceSpecificLangId": true,
                "handleSwitchImplIntf": true,
                "handleInferIntf": true,
                "handleTypedHoles": true,
                "handleWrappingAstNode": true,
                "diagnostic_promotions": true,
                "handleHoverExtended": true
            }
        },
        "foldingRangeProvider": true,
        "hoverProvider": true,
        "positionEncoding": "utf-16",
        "referencesProvider": true,
        "renameProvider": {
            "prepareProvider": true
        },
        "selectionRangeProvider": true,
        "semanticTokensProvider": {
            "full": {
                "delta": true
            },
            "legend": {
                "tokenModifiers": [
                    "declaration",
                    "definition",
                    "readonly",
                    "static",
                    "deprecated",
                    "abstract",
                    "async",
                    "modification",
                    "documentation",
                    "defaultLibrary"
                ],
                "tokenTypes": [
                    "namespace",
                    "type",
                    "class",
                    "enum",
                    "interface",
                    "struct",
                    "typeParameter",
                    "parameter",
                    "variable",
                    "property",
                    "enumMember",
                    "event",
                    "function",
                    "method",
                    "macro",
                    "keyword",
                    "modifier",
                    "comment",
                    "string",
                    "number",
                    "regexp",
                    "operator",
                    "decorator"
                ]
            }
        },
        "signatureHelpProvider": {
            "triggerCharacters": [
                " ",
                "~",
                "?",
                ":",
                "("
            ]
        },
        "textDocumentSync": {
            "change": 2,
            "openClose": true,
            "save": {
                "includeText": false
            },
            "willSave": false,
            "willSaveWaitUntil": false
        },
        "typeDefinitionProvider": true,
        "workspace": {
            "workspaceFolders": {
                "changeNotifications": true,
                "supported": true
            }
        },
        "workspaceSymbolProvider": true
    },
    "serverInfo": {
        "name": "ocamllsp",
        "version": "1.17.0"
    }
}


[Trace - 7:39:15 PM] Sending notification 'initialized'.
Params: {}


[Trace - 7:39:15 PM] Received request 'client/registerCapability - (1)'.
Params: {
    "registrations": [
        {
            "id": "ocamllsp-cram-dune-files/textDocument/didOpen",
            "method": "textDocument/didOpen",
            "registerOptions": {
                "documentSelector": [
                    {
                        "language": "cram",
                        "scheme": null,
                        "pattern": null
                    },
                    {
                        "language": "dune",
                        "scheme": null,
                        "pattern": null
                    },
                    {
                        "language": "dune-project",
                        "scheme": null,
                        "pattern": null
                    },
                    {
                        "language": "dune-workspace",
                        "scheme": null,
                        "pattern": null
                    }
                ]
            }
        },
        {
            "id": "ocamllsp-cram-dune-files/textDocument/didClose",
            "method": "textDocument/didClose",
            "registerOptions": {
                "documentSelector": [
                    {
                        "language": "cram",
                        "scheme": null,
                        "pattern": null
                    },
                    {
                        "language": "dune",
                        "scheme": null,
                        "pattern": null
                    },
                    {
                        "language": "dune-project",
                        "scheme": null,
                        "pattern": null
                    },
                    {
                        "language": "dune-workspace",
                        "scheme": null,
                        "pattern": null
                    }
                ]
            }
        }
    ]
}


[Trace - 7:39:15 PM] Sending response 'client/registerCapability - (1)'. Processing request took 0ms
No result returned.


[Trace - 7:39:15 PM] Sending notification 'textDocument/didOpen'.
Params: {
    "textDocument": {
        "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.ml",
        "languageId": "ocaml",
        "version": 1,
        "text": "open Printf\nopen Lwt.Syntax\n\nlet show_option o = Option.value ~default:\"<none>\" o\n\nlet create_random_large_value size =\n   let chars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\" in\n   let chars_len = String.length chars in\n   let result = Bytes.create size in\n   for i = 0 to size - 1 do\n     Bytes.set result i chars.[Random.int chars_len]\n   done ;\n   Bytes.to_string result\n\n\nlet create_and_leak_value size =\n   let value = create_random_large_value size in\n   let key = Lwt.new_key () in\n   Lwt.bind (Lwt.return ()) (fun () ->\n       let* () =\n          Lwt.with_value key (Some value) (fun () ->\n            (* test thing *)\n            123\n          )\n       in\n       printf \"Gc.full_major ...\\n%!\" ;\n       Gc.full_major () ;\n       Lwt.return_unit)\n\n\nlet rec create_and_link_sequentially n size =\n   match n with\n   | 0 -> Lwt.return_unit\n   | _ ->\n       let* () = create_and_leak_value size in\n       let* () = Lwt_unix.sleep 0.1 in\n       create_and_link_sequentially (n - 1) size\n\n\nlet sleeper_and_leaker () =\n   let leaker = create_and_link_sequentially 5 (1024 * 1024 * 10) in\n   let sleeper = Lwt_unix.sleep 3. in\n   let* (), () = Lwt.both sleeper leaker in\n   Lwt.return_unit\n\n\nlet () =\n   Memtrace.trace_if_requested ~sampling_rate:7e-6 ~context:\"lwt leaking test\" () ;\n\n   Lwt_main.run @@ sleeper_and_leaker () ;\n\n   printf \"Gc.full_major ...\\n%!\" ;\n   Gc.full_major ()\n"
    }
}


[Trace - 7:39:15 PM] Sending notification 'workspace/didChangeConfiguration'.
Params: {
    "settings": {
        "codelens": {
            "enable": true
        },
        "extendedHover": {
            "enable": false
        },
        "duneDiagnostics": {
            "enable": true
        },
        "syntaxDocumentation": {
            "enable": false
        }
    }
}


[Trace - 7:39:15 PM] Sending request 'textDocument/codeAction - (1)'.
Params: {
    "textDocument": {
        "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.ml"
    },
    "range": {
        "start": {
            "line": 21,
            "character": 27
        },
        "end": {
            "line": 21,
            "character": 27
        }
    },
    "context": {
        "diagnostics": [],
        "triggerKind": 2
    }
}


[Trace - 7:39:15 PM] Received response 'textDocument/codeAction - (1)' in 15ms.
Result: [
    {
        "edit": {
            "documentChanges": [
                {
                    "edits": [
                        {
                            "newText": "(123 : int)",
                            "range": {
                                "end": {
                                    "character": 15,
                                    "line": 22
                                },
                                "start": {
                                    "character": 12,
                                    "line": 22
                                }
                            }
                        }
                    ],
                    "textDocument": {
                        "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.ml",
                        "version": 1
                    }
                }
            ]
        },
        "isPreferred": false,
        "kind": "type-annotate",
        "title": "Type-annotate"
    },
    {
        "command": {
            "arguments": [
                "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.mli"
            ],
            "command": "ocamllsp/open-related-source",
            "title": "Create test_lwt_leak.mli"
        },
        "edit": {
            "documentChanges": [
                {
                    "kind": "create",
                    "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.mli"
                }
            ]
        },
        "kind": "switch",
        "title": "Create test_lwt_leak.mli"
    }
]


[Error - 7:39:15 PM] Server process exited with code 0.
detached: /-----------------------------------------------------------------------
| Internal error: Uncaught exception.
| Invalid_argument("List.combine")
| Raised at Stdlib.invalid_arg in file "stdlib.ml", line 30, characters 20-45
| Called from Stdlib__List.combine in file "list.ml", line 305, characters 36-49
| Called from Merlin_specific__Browse_raw.of_expression_desc in file "src/ocaml/merlin_specific/browse_raw.ml", line 392, characters 23-54
| Called from Merlin_specific__Browse_raw.fold_node in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 698, characters 2-24
| Called from Merlin_specific__Browse_raw.all_holes.aux in file "src/ocaml/merlin_specific/browse_raw.ml", line 987, characters 4-28
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression_desc in file "src/ocaml/merlin_specific/browse_raw.ml", line 326, characters 4-53
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression_desc in file "src/ocaml/merlin_specific/browse_raw.ml", line 326, characters 4-53
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_node in file "src/ocaml/merlin_specific/browse_raw.ml", line 575, characters 24-84
| Called from Merlin_specific__Browse_raw.list_fold in file "src/ocaml/merlin_specific/browse_raw.ml", line 236, characters 37-53
| Called from Merlin_specific__Browse_raw.(**) in file "src/ocaml/merlin_specific/browse_raw.ml" (inlined), line 233, characters 11-25
| Called from Merlin_specific__Browse_raw.of_expression in file "src/ocaml/merlin_specific/browse_raw.ml", line 267, characters 22-78
| Called from Merlin_specific__Browse_raw.list_fold in file "src/ocaml/merlin_specific/browse_raw.ml", line 236, characters 37-53
| Called from Merlin_specific__Browse_raw.list_fold_with_next in file "src/ocaml/merlin_specific/browse_raw.ml", line 247, characters 59-84
| Called from Merlin_specific__Browse_raw.all_holes in file "src/ocaml/merlin_specific/browse_raw.ml", line 989, characters 2-20
| Called from Query_commands.dispatch.loc_and_types_of_holes in file "src/frontend/query_commands.ml", line 613, characters 15-42
| Called from Stdlib__List.map in file "list.ml", line 92, characters 20-23
| Called from Merlin_utils__Std.List.concat_map in file "src/utils/std.ml" (inlined), line 129, characters 32-42
| Called from Query_commands.dispatch in file "src/frontend/query_commands.ml", line 619, characters 4-51
| Called from Ocaml_lsp_server__Diagnostics.merlin_diagnostics.(fun) in file "ocaml-lsp-server/src/diagnostics.ml", line 339, characters 12-50
| Called from Merlin_utils__Std.let_ref in file "src/utils/std.ml", line 693, characters 8-12
| Re-raised at Merlin_utils__Std.let_ref in file "src/utils/std.ml", line 695, characters 30-39
| Called from Merlin_utils__Misc.try_finally in file "src/utils/misc.ml", line 45, characters 8-15
| Re-raised at Merlin_utils__Misc.try_finally in file "src/utils/misc.ml", line 62, characters 10-24
| Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15
| Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52
| Called from Merlin_kernel__Mocaml.with_state in file "src/kernel/mocaml.ml", line 18, characters 8-38
| Re-raised at Merlin_kernel__Mocaml.with_state in file "src/kernel/mocaml.ml", line 20, characters 42-53
| Called from Ocaml_lsp_server__Document.Single_pipeline.use.(fun) in file "ocaml-lsp-server/src/document.ml", line 147, characters 22-77
| Called from Stdune__Exn_with_backtrace.try_with in file "otherlibs/stdune/src/exn_with_backtrace.ml", line 9, characters 8-12
| Re-raised at Stdune__Exn.raise_with_backtrace in file "otherlibs/stdune/src/exn.ml" (inlined), line 36, characters 27-56
| Called from Stdune__Exn_with_backtrace.reraise in file "otherlibs/stdune/src/exn_with_backtrace.ml", line 18, characters 33-71
| Called from Fiber__Core.O.(>>|).(fun) in file "fiber/src/core.ml", line 250, characters 36-41
| Called from Fiber__Scheduler.exec in file "fiber/src/scheduler.ml", line 73, characters 8-11
\-----------------------------------------------------------------------

[Trace - 7:39:16 PM] Sending request 'textDocument/foldingRange - (2)'.
Params: {
    "textDocument": {
        "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.ml"
    }
}


[Trace - 7:39:16 PM] Received response 'textDocument/foldingRange - (2)' in 2ms.
Result: [
    {
        "endCharacter": 25,
        "endLine": 12,
        "kind": "region",
        "startCharacter": 0,
        "startLine": 5
    },
    {
        "endCharacter": 7,
        "endLine": 11,
        "kind": "region",
        "startCharacter": 3,
        "startLine": 9
    },
    {
        "endCharacter": 23,
        "endLine": 27,
        "kind": "region",
        "startCharacter": 0,
        "startLine": 15
    },
    {
        "endCharacter": 23,
        "endLine": 27,
        "kind": "region",
        "startCharacter": 3,
        "startLine": 18
    },
    {
        "endCharacter": 22,
        "endLine": 27,
        "kind": "region",
        "startCharacter": 7,
        "startLine": 19
    },
    {
        "endCharacter": 11,
        "endLine": 23,
        "kind": "region",
        "startCharacter": 10,
        "startLine": 20
    },
    {
        "endCharacter": 48,
        "endLine": 36,
        "kind": "region",
        "startCharacter": 0,
        "startLine": 30
    },
    {
        "endCharacter": 48,
        "endLine": 36,
        "kind": "region",
        "startCharacter": 3,
        "startLine": 31
    },
    {
        "endCharacter": 48,
        "endLine": 36,
        "kind": "region",
        "startCharacter": 6,
        "startLine": 33
    },
    {
        "endCharacter": 48,
        "endLine": 36,
        "kind": "region",
        "startCharacter": 7,
        "startLine": 34
    },
    {
        "endCharacter": 48,
        "endLine": 36,
        "kind": "region",
        "startCharacter": 7,
        "startLine": 35
    },
    {
        "endCharacter": 18,
        "endLine": 43,
        "kind": "region",
        "startCharacter": 0,
        "startLine": 39
    },
    {
        "endCharacter": 18,
        "endLine": 43,
        "kind": "region",
        "startCharacter": 3,
        "startLine": 42
    },
    {
        "endCharacter": 19,
        "endLine": 52,
        "kind": "region",
        "startCharacter": 0,
        "startLine": 46
    }
]


[Trace - 7:39:16 PM] Sending request 'textDocument/codeLens - (3)'.
Params: {
    "textDocument": {
        "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.ml"
    }
}


[Trace - 7:39:16 PM] Received response 'textDocument/codeLens - (3)' in 1ms.
Result: [
    {
        "command": {
            "command": "",
            "title": "unit -> unit Lwt.t"
        },
        "range": {
            "end": {
                "character": 18,
                "line": 43
            },
            "start": {
                "character": 0,
                "line": 39
            }
        }
    },
    {
        "command": {
            "command": "",
            "title": "int -> int -> unit Lwt.t"
        },
        "range": {
            "end": {
                "character": 48,
                "line": 36
            },
            "start": {
                "character": 0,
                "line": 30
            }
        }
    },
    {
        "command": {
            "command": "",
            "title": "int -> unit Lwt.t"
        },
        "range": {
            "end": {
                "character": 23,
                "line": 27
            },
            "start": {
                "character": 0,
                "line": 15
            }
        }
    },
    {
        "command": {
            "command": "",
            "title": "int -> string"
        },
        "range": {
            "end": {
                "character": 25,
                "line": 12
            },
            "start": {
                "character": 0,
                "line": 5
            }
        }
    },
    {
        "command": {
            "command": "",
            "title": "string option -> string"
        },
        "range": {
            "end": {
                "character": 52,
                "line": 3
            },
            "start": {
                "character": 0,
                "line": 3
            }
        }
    }
]


[Trace - 7:39:16 PM] Sending request 'textDocument/documentSymbol - (4)'.
Params: {
    "textDocument": {
        "uri": "file:///home/me/code/ocaml-ambient-context/test/memory/test_lwt_leak.ml"
    }
}


[Trace - 7:39:16 PM] Received response 'textDocument/documentSymbol - (4)' in 2ms.
Result: [
    {
        "children": [],
        "deprecated": false,
        "detail": "unit -> unit Lwt.t",
        "kind": 12,
        "name": "sleeper_and_leaker",
        "range": {
            "end": {
                "character": 18,
                "line": 43
            },
            "start": {
                "character": 0,
                "line": 39
            }
        },
        "selectionRange": {
            "end": {
                "character": 18,
                "line": 43
            },
            "start": {
                "character": 0,
                "line": 39
            }
        }
    },
    {
        "children": [],
        "deprecated": false,
        "detail": "int -> int -> unit Lwt.t",
        "kind": 12,
        "name": "create_and_link_sequentially",
        "range": {
            "end": {
                "character": 48,
                "line": 36
            },
            "start": {
                "character": 0,
                "line": 30
            }
        },
        "selectionRange": {
            "end": {
                "character": 48,
                "line": 36
            },
            "start": {
                "character": 0,
                "line": 30
            }
        }
    },
    {
        "children": [],
        "deprecated": false,
        "detail": "int -> unit Lwt.t",
        "kind": 12,
        "name": "create_and_leak_value",
        "range": {
            "end": {
                "character": 23,
                "line": 27
            },
            "start": {
                "character": 0,
                "line": 15
            }
        },
        "selectionRange": {
            "end": {
                "character": 23,
                "line": 27
            },
            "start": {
                "character": 0,
                "line": 15
            }
        }
    },
    {
        "children": [],
        "deprecated": false,
        "detail": "int -> string",
        "kind": 12,
        "name": "create_random_large_value",
        "range": {
            "end": {
                "character": 25,
                "line": 12
            },
            "start": {
                "character": 0,
                "line": 5
            }
        },
        "selectionRange": {
            "end": {
                "character": 25,
                "line": 12
            },
            "start": {
                "character": 0,
                "line": 5
            }
        }
    },
    {
        "children": [],
        "deprecated": false,
        "detail": "string option -> string",
        "kind": 12,
        "name": "show_option",
        "range": {
            "end": {
                "character": 52,
                "line": 3
            },
            "start": {
                "character": 0,
                "line": 3
            }
        },
        "selectionRange": {
            "end": {
                "character": 52,
                "line": 3
            },
            "start": {
                "character": 0,
                "line": 3
            }
        }
    }
]
Platform & versions
  • macOS “Sonoma” 14.2.1
  • VScode 1.85.2
  • VScode OCaml Platform: 1.17.0
  • OCaml: 4.14.1
  • ocaml-lsp-server: 1.17.0

ELLIOTTCABLE avatar Jan 31 '24 19:01 ELLIOTTCABLE

cc @voodoos

rgrinberg avatar Jan 31 '24 20:01 rgrinberg

That's definitively a Merlin issue. We already fixed issues with that feature (my guess is that it's the let* (), () = Lwt.both sleeper leaker in expression that breaks merlin), @ELLIOTTCABLE could confirm that you are running the latest merlin-lib / ocaml-lsp versions ?

voodoos avatar Feb 01 '24 09:02 voodoos

@ELLIOTTCABLE

I just made a small project with your file, OCaml 4.14, ocaml-lsp-server 1.17.0 and merlin-lib 4.13-414 and I am not able to reproduce the crash with vscode.

voodoos avatar Feb 15 '24 09:02 voodoos