DebugAdapter.jl icon indicating copy to clipboard operation
DebugAdapter.jl copied to clipboard

Integrating Julia's Debug Adapter Protocol with neovim

Open tapyu opened this issue 3 years ago • 6 comments

I am trying to integrate Julia's DAP with Debug Adapter Protocol client implementation for Neovim. You must to configure the DAP for each specific language. I've tried to do so using some references for other languages, but it failed...

I am not an expert with regard Debug Adapter Protocol and how to handle then, and the source for doing that with Julia are scarce. Anyone can give some help?

Thank you.

tapyu avatar Apr 20 '22 09:04 tapyu

Still hoping one day this will happen.

remann2 avatar Sep 19 '23 09:09 remann2

I just merged a PR that implements the actual DAP, not our own home-grown JSON-RPC version of it. So, in principle this should now be feasible. In practice I expect that the API for using things will see some churn in the next couple of weeks before things settle down a bit.

davidanthoff avatar Jun 28 '24 10:06 davidanthoff

I'm building a neovim dap plugin, and I'm using an adapted version of this script:

using Sockets
using DebugAdapter
using Logging

function start_debugger()
    server_port = parse(Int, ARGS[1])

    server = Sockets.listen(server_port)

    conn = Sockets.accept(server)
    debugsession = DebugAdapter.DebugSession(conn)

    run(debugsession)

    close(conn)
end

start_debugger()

However, I get this error and the debugger script crashes.

[debug-adapter stderr] ERROR: 
[debug-adapter stderr] KeyError: key 
[debug-adapter stderr] "
[debug-adapter stderr] program" not found
[debug-adapter stderr] 
Stacktrace:
[debug-adapter stderr] 
 [1] getindex
   @ ./dict.jl:498 [inlined]
 [2] 
[debug-adapter stderr] DebugAdapter.LaunchArguments(dict::Dict{String, Any})
[debug-adapter stderr] 
   @ DebugAdapter ~/.julia/packages/DebugAdapter/NSeaJ/src/DAPRPC/interface_def.jl:63
 [3] dispatch_msg(x::DebugAdapter.DAPRPC.DAPEndpoint{TCPSocket, TCPSocket}, dispatcher::DebugAdapter.DAPRPC.MsgDispatcher, msg::Dict{String, Any})
   @ DebugAdapter.DAPRPC 
[debug-adapter stderr] ~/.julia/packages/DebugAdapter/NSeaJ/src/DAPRPC/typed.jl:86
 [4] 
[debug-adapter stderr] (::DebugAdapter.var"#132#161"{Dict{String, Any}, Nothing, DebugAdapter.DAPRPC.MsgDispatcher, DebugAdapter.DAPRPC.DAPEndpoint{TCPSocket, TCPSocket}})()
[debug-adapter stderr] 
   @ DebugAdapter ~/.julia/packages/DebugAdapter/NSeaJ/src/packagedef.jl:105

Here's the full log from nvim-dap:

[ DEBUG ] 2024-06-28T23:57:15Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:1154 ]	"Starting debug adapter server executable"	{
  args = { "--project=/Users/kd/gitrepos/nvim-dap-julia", "/Users/kd/gitrepos/nvim-dap-julia/scripts/server.jl", "65396" },
  command = "julia"
}
[ DEBUG ] 2024-06-28T23:57:15Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:1286 ]	"Debug adapter server executable started, listening on 65396"
[ DEBUG ] 2024-06-28T23:57:15Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:1289 ]	"Connecting to debug adapter"	{
  executable = {
    args = { "--project=/Users/kd/gitrepos/nvim-dap-julia", "/Users/kd/gitrepos/nvim-dap-julia/scripts/server.jl", "65396" },
    command = "julia"
  },
  options = {
    max_retries = 100
  },
  port = 65396,
  type = "server"
}
[ DEBUG ] 2024-06-28T23:57:16Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:1664 ]	"request"	{
  arguments = {
    adapterID = "nvim-dap",
    clientID = "neovim",
    clientName = "neovim",
    columnsStartAt1 = true,
    linesStartAt1 = true,
    locale = "en_US.UTF-8",
    pathFormat = "path",
    supportsProgressReporting = true,
    supportsRunInTerminalRequest = true,
    supportsStartDebuggingRequest = true,
    supportsVariableType = true
  },
  command = "initialize",
  seq = 1,
  type = "request"
}
[ DEBUG ] 2024-06-28T23:57:17Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:942 ]	1	{
  body = {
    additionalModuleColumns = {},
    exceptionBreakpointFilters = { {
        default = true,
        filter = "error",
        label = "Uncaught Exceptions"
      }, {
        default = false,
        filter = "throw",
        label = "All Exceptions"
      } },
    supportedChecksumAlgorithms = {},
    supportsCompletionsRequest = false,
    supportsConditionalBreakpoints = true,
    supportsConfigurationDoneRequest = true,
    supportsDataBreakpoints = false,
    supportsEvaluateForHovers = true,
    supportsExceptionInfoRequest = true,
    supportsFunctionBreakpoints = true,
    supportsHitConditionalBreakpoints = false,
    supportsLogPoints = false,
    supportsRestartFrame = true,
    supportsSetVariable = true,
    supportsStepBack = false,
    supportsStepInTargetsRequest = true,
    supportsTerminateRequest = true
  },
  command = "initialize",
  request_seq = 1,
  seq = 1,
  success = "true",
  type = "response"
}
[ DEBUG ] 2024-06-28T23:57:17Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:1664 ]	"request"	{
  arguments = {
    args = {},
    debugAutoInterpretAllModules = false,
    exitAfterTaskReturns = false,
    name = "Debug julia executable",
    projectDir = "/Users/kd/gitrepos/nvim-dap-julia",
    request = "launch",
    type = "julia"
  },
  command = "launch",
  seq = 2,
  type = "request"
}
[ DEBUG ] 2024-06-28T23:57:22Z-0400 ] ...s/kd/.local/share/nvim/lazy/nvim-dap/lua/dap/session.lua:1664 ]	"request"	{
  arguments = vim.empty_dict(),
  command = "terminate",
  seq = 3,
  type = "request"
}

kdheepak avatar Jun 29 '24 03:06 kdheepak

It turns out I had to pass a program to the configuration. Now I get a different error:


[debug-adapter stderr] ERROR: 
[debug-adapter stderr] MethodError: no method matching activate(::Missing)

Closest candidates are:
  activate(; temp, shared, prev, io)
   @ Pkg ~/.julia/juliaup/julia-1.10.4+0.aarch64.apple.darwin14/share/julia/stdlib/v1.10/Pkg/src/API.jl:1896
  activate(!Matched::Function, !Matched::AbstractString)
   @ Pkg ~/.julia/juliaup/julia-1.10.4+0.aarch64.apple.darwin14/share/julia/stdlib/v1.10/Pkg/src/API.jl:1976
  activate(!Matched::AbstractString; shared, temp, io)
   @ Pkg ~/.julia/juliaup/julia-1.10.4+0.aarch64.apple.darwin14/share/julia/stdlib/v1.10/Pkg/src/API.jl:1932

[debug-adapter stderr] 
Stacktrace:
[debug-adapter stderr] 
 [1] launch_request(debug_session::DebugAdapter.DebugSession, params::DebugAdapter.LaunchArguments)
   @ DebugAdapter ~/.julia/packages/DebugAdapter/NSeaJ/src/debugger_requests.jl:54
 [2] 
[debug-adapter stderr] (::DebugAdapter.var"#129#158"{DebugAdapter.DebugSession})(params::DebugAdapter.LaunchArguments)
[debug-adapter stderr] 
   @ DebugAdapter ~/.julia/packages/DebugAdapter/NSeaJ/src/packagedef.jl:99
 [3] 
[debug-adapter stderr] dispatch_msg(x::DebugAdapter.DAPRPC.DAPEndpoint{TCPSocket, TCPSocket}, dispatcher::DebugAdapter.DAPRPC.MsgDispatcher, msg::Dict{String, Any})
   @ DebugAdapter.DAPRPC ~/.julia/packages/DebugAdapter/NSeaJ/src/DAPRPC/typed.jl:89
 [4] (::DebugAdapter.var"#132#161"{Dict{String, Any}, Nothing, DebugAdapter.DAPRPC.MsgDispatcher, DebugAdapter.DAPRPC.DAPEndpoint{TCPSocket, TCPSocket}})()
   @ DebugAdapter
[debug-adapter stderr]  
[debug-adapter stderr] ~/.julia/packages/DebugAdapter/NSeaJ/src/packagedef.jl:105
[debug-adapter stderr] 

kdheepak avatar Jun 29 '24 04:06 kdheepak

I hardcoded juliaEnv into the requests with the current workspace and now I get this error:


[debug-adapter stderr]   Activating
[debug-adapter stderr]  project at `~/gitrepos/nvim-dap-julia`

[debug-adapter stderr] ERROR: 
[debug-adapter stderr] MethodError: Cannot `convert` an object of type Missing to an object of type Bool
[debug-adapter stderr] 

Closest candidates are:
  convert(::Type{T}, !Matched::T) where T<:Number
   @ Base number.jl:6
  convert(::Type{T}, !Matched::T) where T
   @ Base Base.jl:84
  convert(::Type{T}, !Matched::Number) where T<:Number
   @ Base number.jl:7
  ...

[debug-adapter stderr] 
Stacktrace:
[debug-adapter stderr] 
 [1] setproperty!(x::DebugAdapter.DebugSession, f::Symbol, v::Missing)
   @ Base ./Base.jl:40
 [2] launch_request(debug_session::DebugAdapter.DebugSession, params::DebugAdapter.LaunchArguments)
   @ DebugAdapter 
[debug-adapter stderr] ~/.julia/packages/DebugAdapter/NSeaJ/src/
[debug-adapter stderr] debugger_requests.jl:104
[debug-adapter stderr] 

[debug-adapter stderr]  
[debug-adapter stderr] [3]
[debug-adapter stderr]  
[debug-adapter stderr] (::DebugAdapter.var"#129#158"{DebugAdapter.DebugSession})(params::DebugAdapter.LaunchArguments)
[debug-adapter stderr] 
   @ DebugAdapter ~/.julia/packages/DebugAdapter/NSeaJ/src/packagedef.jl:99
 [4] dispatch_msg(x::DebugAdapter.DAPRPC.DAPEndpoint{TCPSocket, TCPSocket}, dispatcher::DebugAdapter.DAPRPC.MsgDispatcher, msg::Dict{String, Any})
   @ DebugAdapter.DAPRPC
[debug-adapter stderr]  ~/.julia/packages/DebugAdapter/NSeaJ/src/DAPRPC/typed.jl:89
 [5] (::DebugAdapter.var"#132#161"{Dict{String, Any}, Nothing, DebugAdapter.DAPRPC.MsgDispatcher, DebugAdapter.DAPRPC.DAPEndpoint{TCPSocket, TCPSocket}})()
   @ DebugAdapter ~/.julia/packages/DebugAdapter/NSeaJ/src/packagedef.jl:105

kdheepak avatar Jun 29 '24 04:06 kdheepak

I set stopOnEntry = true and now I have a version that works with neovim:

https://github.com/julia-vscode/DebugAdapter.jl/assets/1813121/a30828e8-2b4d-4ea0-b1eb-6e9cc3653c8f

I made the repo public: https://github.com/kdheepak/nvim-dap-julia

It segfaults when it finishes running the server but otherwise seems to work. I haven't tested a lot of features yet.

kdheepak avatar Jun 29 '24 04:06 kdheepak