svaante / dape

Debug Adapter Protocol for Emacs
GNU General Public License v3.0
501 stars 34 forks source link

How to use the debugpy adapter over tramp? #143

Open jsadusk opened 3 months ago

jsadusk commented 3 months ago

Deleting my previous issue because I have a working config, it is just very manual and I'm trying to figure out if there's a way to do this automatically.

Here's my use case. I am developing python, remotely via tramp over ssh, and my python is being launched by the bazel build system. This has a few implications:

Given all this, I was able to make dape work, beautifully I might add, with this config:

(add-to-list 'dape-configs
     '(debugpy-attach .
           (modes (python-mode python-ts-mode)
                  port 5678
                  host "localhost"
                  :request "attach"
                  :type "python"
                  :cwd dape-cwd
                  :program dape-buffer-default
                  :args []
                  :justMyCode nil
                  :console "integratedTerminal"
                  :showReturnValue t
                  :stopOnEntry nil
                  prefix-local "/ssh:dev:/home/jsadusk/my/project/dir/"
                  prefix-remote "/data/jsadusk/cache/bazel/_bazel_jsadusk/08376eed31abaac569ecaec66be8adad/execroot/waabi-av/bazel-out/k8-opt/bin/my-bazel-run/-arget.runfiles/base-path/"
                  )
           )
     )

(paths are not real for security reasons)

Setting prefix-local and prefix-remote made everything work. But there's no reason those can't be automatically determined. First, /ssh:dev: is in the project root, but it looks like dape--path doesn't make use of the project dir. Second, the file returned by the debugger inside the sandbox is a symlink. I think if dape-path followed symlinks it would be able to resolve this easily.

Does this seem like a reasonable enhancement? I may try to make a PR myself to do this if you don't mind.

jsadusk commented 2 months ago

I submitted a PR to fix this: https://github.com/svaante/dape/pull/148

jsadusk commented 2 months ago

My PR doesn't actually work, because it prevents mapping from local back to remote. "Remote" files in this context are symlinks in a bazel cache for a specific run target, local files are in the project repo. I am not sure how to find a mapping back from a project repo file to the bazel cache in an automatic fashion. However each separate run target gets its own sandbox directory, so putting a remote prefix in a config is not feasible. I'm searching for a way to build a good bazel config. The portion of the above PR that adds tramp prefix does seem to be good however.

svaante commented 2 months ago

Which version of dape are you using?

Dape detects if command-cwd is by tramp and sets prefix-local prefix-remote. This is done in dape-config-tramp I am not sure why this does not work in your case.

jsadusk commented 2 months ago

I'm looking at the code and I think the issue is I'm trying to do an attach to an already running debugpy, so it doesn't look like command-cwd gets set: https://github.com/svaante/dape/blob/master/dape.el#L92

Also, because I'm trying to work with bazel's insane sandbox directory, I'm setting prefix-local and prefix-remote, which I think prevents that auto set.

Aside, would it be possible to make prefix-local and prefix-remote be lambdas? I'm struggling with making an automatic way to determine the sandbox directory path conversion with a simple string replacement.

Oh and I currently have dape master checked out in my straight repo.