远程调试.NET Core Linux Docker容器 - "当前源与.dll中内置的版本不同"

Bri*_*den 14 .net c# linux docker asp.net-core

  • 搬运工人
  • .NET Core 1.1
  • Visual Studio 2017
  • .NET核心调试器(clrdbg)

我收到以下错误:

"The breakpoint will not currently be hit. A copy of TokenController.cs was found in TSL.Security.Service.dll, but the current source code is different from the version built into the TSL.Security.Service.dll."
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我将逐步了解如何构建我的.NET Core Docker镜像并从此图像运行Container实例,然后使用Visual Studio 2017连接远程,我的Dockerfile.debug位于我的问题的底部:

  1. 在我的docker主机cd ~/repos/api.security//一个git存储库
  2. git pull //从git for .NET Core项目中提取最新代码
  3. dotnet restore
  4. dotnet publish //没有其他args与.pdbs一起发布
  5. docker build -t tsl.api.security.image.debug -f Docker.debug .
  6. docker run -d -p 8080:5000 -p 10222:22 --name=tsl.api.security.container.debug -t tsl.api.security.image.debug //在端口5000上的Container中运行并映射我的.NET Core Webapi到主机端口8080并将容器(端口22)中的ssh映射到主机上的端口10222
  7. docker exec -it tsl.api.security.container.debug bash //终端从主机进入运行容器
  8. /usr/sbin/sshd //启动sshd

好的,现在该容器已准备好使用Visual Studio 2017在我的机器上使用Visual Studio 2017进行远程调试:

  1. 从git中提取最新代码
  2. 使用Visual Studio 2016打开.sln
  3. 内置调试
  4. 转到工具 - >选项 - >跨平台和我的SSH远程:在此输入图像描述
  5. CTRL + ALT + P //附加到进程
  6. 选择连接类型 - > SSH 在此输入图像描述
  7. 选择Managed(适用于Unix的.NET Core) 在此输入图像描述

而且中提琴!我们有问题: 在此输入图像描述

如果我们/app在Docker Container中查看,我们可以看到pdbs:在此输入图像描述

并且源代码是相同的,因为我的工作流程说明中的git pull步骤演示了.

不知道从哪里开始......

这是我的Dockerfile.debug:

# Use the standard Microsoft ASP.NET Core container
FROM microsoft/aspnetcore

# File Author / Maintainer
MAINTAINER Brian Ogden

WORKDIR /
RUN apt-get update && apt-get install -y unzip
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

#install CLRDBG, Microsoft's new cross-platform command line debugger used for debugging code running on .NET Core
RUN curl -sSL https://aka.ms/getclrdbgsh | bash /dev/stdin vs2015u2 ~/clrdbg

# Copy our code from the "/src/MyWebApi/bin/Debug/netcoreapp1.1/publish" folder to the "/app" folder in our container
WORKDIR /app
COPY ./src/TSL.Security.Service/bin/Debug/netcoreapp1.1/publish .

# Expose port 80 for the Web API traffic
ENV ASPNETCORE_URLS http://+:5000
EXPOSE 5000 22

ENTRYPOINT ["dotnet", "TSL.Security.Service.dll"]
Run Code Online (Sandbox Code Playgroud)

小智 7

Tools->Options->Debugging->General,关闭"要求源文件与原始版本完全匹配".不理想,但至少它会达到VS2017源代码中设置的断点.

一旦找到如何正确解决此问题,请通知我.

  • 太棒了,这也让它对我有用.我有完全相同的问题,但没有使用docker.我刚刚想到这可能是由源文件的行结尾不同引起的.我和@ brian-ogden的部署过程几乎完全相同.Git在Linux上执行从\ r \n到\n的自动换行转换,因此dotnet在Linux上构建的源文件在技术上与Windows上的源不同. (2认同)