julia-vscode / DebugAdapter.jl

Julia implementation of the Debug Adapter Protocol
MIT License
40 stars 9 forks source link

Integrating Julia's Debug Adapter Protocol with neovim #59

Open tapyu opened 2 years ago

tapyu commented 2 years ago

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.

remann2 commented 1 year ago

Still hoping one day this will happen.

davidanthoff commented 3 months ago

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.

kdheepak commented 3 months ago

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 commented 3 months ago

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 commented 3 months ago

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 commented 3 months ago

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.