Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to debug a .NET Core application running in a Linux Docker container from Visual Studio

I have my own hand written Dockerfile/docker-compose files. I start containers from command line. Now I want to attach Visual Studio 2017 (not Visual Studio Code) to my application inside a Docker (Linux-based) container. It seems it should a pretty easy task, but I can't find any information on how to do this.

I read through the guide Off-road Debugging of .NET Core on Linux or OS X from Visual Studio carefully. At first it looked like what I needed - a description on how to remotely debug a .NET Core application running in Linux. But it only tells a part of the story - how to debug via SSH. And just mentions Docker, but it says nothing to how to remotely debug an application inside Docker.

I guess there shouldn't be much specific of Docker here, it's just running vsdbg inside Docker and attaching here. But obviously it's a very common dev use case and it's weird that there's no good information on this.

Surely, there are VS Tools for Docker using which we can easily do debugging of an application inside a Docker container. But for me, VS Tools for Docker are just terrible. Yes, they work seamlessly at first. But it is absolute unclear what is going on under the hood.

It seems that we just can look up what VS Tools for Docker do and try to reproduce that. But it's not very obvious. It adds an additional "debug" YAML file to docker-compose (docker-compose.vs.debug.g.yml) which should do the debugging magic. I tried to add that YAML content to my hand-written docker-compose, run Dockers, but how can I attach Visual Studio?

I get the IP address of my container, tried to find a remote debugger on that IP address and 4022 that Visual Studio can't see anything. Also it's suspicious that file debug.yaml created by Tools for Docker has nothing about exposing the 4022 port as it could be expected.

P.S.: I found a good guide but on Windows containers

like image 807
Shrike Avatar asked Feb 07 '18 10:02

Shrike


People also ask

How do I debug a .NET core application?

Open the Debug view by selecting the Debugging icon on the left side menu. Select the green arrow at the top of the pane, next to . NET Core Launch (console). Other ways to start the program in debugging mode are by pressing F5 or choosing Run > Start Debugging from the menu.


1 Answers

How about this:

If your service is based off of the microsoft/dotnet Docker image, create a new dockerfile based on the same image, and install the debugger, ssh and unzip.

FROM microsoft/dotnet

RUN apt-get update && apt-get -y install openssh-server unzip

RUN mkdir /var/run/sshd && chmod 0755 /var/run/sshd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin without-password/g' /etc/ssh/sshd_config
RUN sed -i 's/#StrictModes yes/StrictModes no/g' /etc/ssh/sshd_config

RUN service ssh restart

RUN mkdir /root/.vs-debugger && chmod 0755 /root/.vs-debugger
RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v vs2017u1 -l /root/.vs-debugger/

EXPOSE 22

Build and push this to your registry.

docker build -t myregistry/dotnetdebugger .
docker push myregistry/dotnetdebugger

Next ensure that your service's build is outputting the PDB files as portable PDB files - Offroad Debugging of .NET Core on Linux and OS X from Visual Studio

And ensure that the PDB files are included with the DLL files when you build your service's Docker image.

Then when your container is running and you decide that you need to debug it, you can attach the debugger container as a side car container to the service:

docker run -d -p 10222:22 --pid container:<container name> - myregistry/dotnetdebugger

Then in Visual Studio, go to menu ToolsOptionsCrossplatformConnection Manager - and add a new connection. Specify the IP address or hostname of the container, 10222 as the port (the one in the docker run command), and root as the user with no password.

like image 136
Mark Jones Avatar answered Sep 27 '22 17:09

Mark Jones