Visual Studio Code断点警告:源代码与原始版本不同

21

我对Visual Studio Code非常陌生。我正在尝试调试一个已经存在的应用程序,该应用程序是我通过Git克隆的。我的文件都还没有修改。我已经下载了微软扩展程序“C# for Visual Studio Code(由OmniSharp驱动)”。 应用程序启动并将我带到主页(http://localhost:5000/)。 但它没有在startup.cs中停止我的断点。

当我查看应用程序正在运行时,它不是红色的圆点,而是一个空心的灰色断点。悬停在上面会告诉我:“源代码与原始版本不同。要使此断点能够被触发:请将“requireExactSource”:false添加到launch.json中并重新启动调试。” 我无法理解这个。

我正在使用:

  • Visual Code 1.17.1
  • Shell 1.7.7
  • renderer 58.0.3029.110
  • node 7.9.0
  • 架构 x64

我还在使用dotnet版本1.0.3


你已经解决了这个问题吗? - Sedat Kapanoglu
抱歉 @SedatKapanoglu,我没有得到解决方案。 - Sniipe
9个回答

68

当我将我的项目从.NET Core 2.0升级到2.1时,发生了这种情况。问题在于我忘记编辑launch.json以将二进制路径从netcoreapp2.0更改为netcoreapp2.1,因此VS Code在错误的位置查找二进制文件。编辑路径解决了问题。

编辑:我建议VS Code团队采用基于变量的方法来彻底解决这个问题,比如在路径中使用类似$TargetRuntime而不是像netcoreapp2.1等一样硬编码。


3
在我的情况下,我将RuntimeIdentifier添加到了我的csproj文件中。VSCode无法定位正确的二进制文件。感谢您指引我朝着正确的方向! - Jeremi
2
此答案仍然适用于从.NET Core 5.x升级到.NET Core 6.0。有关“launch.json”的更多详细信息:要更改的行是"configurations" -> "program" - Mycah

2

这是对升级从.Net Core 3.0到3.1的razor web应用程序的已接受答案的后续:

  1. 将.csproj文件/Project/PropertyGroup/TargetFramework更改为netcoreapp3.1
  2. 如前所述:更改launch.json配置[0].program为workspaceFolder/bin/Debug/netcoreapp3.1/MyApp.dll
  3. 从workspaceFolder/bin/Debug/中删除netcoreapp3.0和netcoreapp3.1文件夹
  4. 在终端中运行:dotnet build
  5. F5进行调试并击中断点

2
这可能由于几个原因导致,我的情况是一个简单而愚蠢的错误。我在主文件夹中创建了一个解决方案,然后添加了一个新文件夹,并在其中创建了一个webapp。我配置了launch.json和task.json,它工作得很好,直到我尝试调试修改时。
我的问题是我忘记将webapp项目添加到解决方案中,所以当解决方案尝试构建它时失败了。
所以对我来说,解决方案就是将我的项目添加到解决方案中。
如果这不是你的情况,请尝试找出为什么你的项目没有被构建,或者为什么它指向其他目录。

1

我遇到了这个问题。删除所有的bin/obj/文件夹然后重新构建并没有解决它。我的launch.json二进制路径program:是我的确切DLL。

解决方法是修改我的.cs源文件,然后重新构建。某些东西已经过时了,可能是 vscode 自动保存了.cs文件,或者dotnet build在其他地方缓存了某些东西。


1

我遇到了同样的问题,在检查了 lunch.json 文件后,我发现程序文件夹指向了:

// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net6.0/ShoppingCartApi.dll",

后来我意识到将目标框架更新为Net7.0,因此在构建项目时输出文件夹已更改为:"${workspaceFolder}/bin/Debug/net7.0/ShoppingCartApi.dll"

更新lunch.json文件的新路径后,调试器又可以正常工作了。

// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net7.0/ShoppingCartApi.dll",

1

我对Visual Studio Code也比较新,也遇到了同样的问题。幸运的是,我成功解决了这个问题。

首先,在调试模式下,Visual Studio Code给了我正确的提示,就是你提到的那个:

断点警告:源代码与原始版本不同。要让此断点被命中:将“"requireExactSource": false”添加到launch.json并重新启动调试。-

因此,为了理解,建议您阅读此VisualStudioCode-LaunchConfigurations

正如上面链接中的文档所述:

位于工作区(项目根文件夹)或用户设置或工作区设置中.vscode文件夹中的launch.json文件。

因此,如果您编辑该文件并执行调试提示中的操作,即:

将“"requireExactSource": false”添加到launch.json并重新启动调试。-

我的launch.json现在看起来像这样:

configurations": [
    {
        "name": ".NET Core Launch (web)",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "build",
        // If you have changed target frameworks, make sure to update the program path.
        "program": "${workspaceFolder}/DotNetCoreAngularAPp/bin/Debug/netcoreapp2.1/DotNetCoreAngularApp.dll",
        "args": [],
        "cwd": "${workspaceFolder}/DotNetCoreAngularAPp",
        "stopAtEntry": false,
        "requireExactSource": false,

最后一行显示了添加的语句。现在,您应该能够进行调试。 希望这可以帮到您。

4
在这种情况下,调试本身可能是无用的,因为您可能会调试一个过时的二进制文件。 OP 应该专注于解决差异背后的根本原因。 - Sedat Kapanoglu
@SedatKapanoglu 我同意你的观点,但是根据原始问题:
我的文件都没有被修改。
理论上来说,由于这些文件没有被修改,源代码和二进制代码之间不应该存在差异。因此,即使根本原因没有解决,他仍然能够进行调试,这是主要目标。无论如何,正如你所说,“差异”的根本原因应该得到解决。
- Sebastian Inones

0

我之前也遇到了同样的问题,只需要执行以下两个步骤就可以解决了。

  1. 在菜单栏中选择“生成”
  2. 依次选择“清理解决方案”和“重新生成解决方案”

0
我曾经遇到过同样的问题。请检查.vscode/launch.json中的配置,并确定"preLaunchTask"。然后打开.vscode/tasks.json,确保该任务存在,并且其工作区目标在"args"中指向您的项目文件。在我的情况下,我有两个Web项目,但只有一个构建任务。

这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Ethan

0
在我的情况下,这是由于以下原因发生在一个net7.0项目中:
我的最终目标是将我的应用程序发布为一个自包含的单个文件。我阅读了微软的.NET CLI文档,并在"MSBuild属性"部分中找到了以下内容:
发布单个文件 将应用程序打包为特定于平台的单个文件可执行文件。有关单文件发布的更多信息,请参阅单文件捆绑器设计文档。 我们建议您在项目文件中指定此选项,而不是在命令行中指定。
而且,要获得单个文件的结果,您必须定义一个RuntimeIdentifier。
所以...根据这一切,我在我的csproj中添加了以下内容:
<PropertyGroup>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

通过添加<RuntimeIdentifier>win-x64</RuntimeIdentifier>,构建输出结果从"bin{Configuration}{TargetFramework}"变为"bin{Configuration}{TargetFramework}{RuntimeIdentifier}",例如:

在添加<RuntimeIdentifier>win-x64</RuntimeIdentifier>之前,输出从bin\debug\net7.0变为bin\debug\net7.0\win-x64

在进行这些csproj更改之后,如果我继续修改源代码并尝试调试,我会收到警告"断点警告:源代码与原始版本不同"。

通过清理所有二进制文件并重新构建项目,我最终得到了一个解释: app

最后,不要忘记修改launch.json / configurations / program中的内容: "${workspaceFolder}/bin/Debug/net7.0/MyProject.dll"改为"${workspaceFolder}/bin/Debug/net7.0/win-x64/MyProject.dll"
所以,在我看来,dotnet publish配置应该只与发布操作(命令)相关,而不应影响项目本身。

--

感谢您的阅读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接