为什么我不能在 CudaFy 库的 c# 代码中设置断点?
Why can't I set breakpoints in the c# code from the CudaFy library?
我下载了一个名为CudaFy的开源库,现在已经使用了一段时间。该项目似乎已被放弃,所以当我 运行 遇到问题时,我会自己解决它们。大多数情况下这不是问题,但项目中的一个 c# 库拒绝让我设置断点,使调试变得非常困难。
如果我尝试在 运行 应用程序之前设置断点,则会添加红点,但是一旦我 运行 应用程序,圆圈就会被挖空,并且永远不会重新启用。我知道我尝试设置断点的代码正在执行,因为我可以将其更改为显示的内容(例如 throw new Exception("foo")
)。
查看 VS 输出 window,我看到:
'Opt.exe' (CLR v4.0.30319: Opt.exe): Loaded 'C:\vss\cudafy2\Opt\bin\x64\Debug\CUDA.NET.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Symbols for the module 'CUDA.NET.dll' were not loaded.
很明显这是一条线索。但是,查看项目设置,它肯定不是通过优化构建的。我已经打开优化并再次关闭,我已经摆弄了 CSPROJ 文件但没有任何帮助。
我已经尝试过 RebuildAll、清理文件夹、大声辱骂以及用拳头敲打 table。都无济于事。
环境:
- Windows 7 x64
- Visual Studio 2017 (15.8.0 P5)
- 建筑Debug/x64
- 框架 4.7.2
我将此作为问答式答案发布,因为 google 和 SO 都让我失望了。但是现在我已经找到了答案,所以我将其发布,希望它能对下一个人有所帮助。
这个技巧原来是在相关库的 assembly.cs 文件中。它包含这一行:
[assembly: System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
我已经阅读了此属性的 docs,但我仍然不太明白它的作用。我也不明白为什么项目觉得有必要添加它。
- 是否有一些功能性原因需要它?如果没有它,事情似乎 运行,但也许有一些模糊的功能需要它?
- 有人只是想让他们的代码不可调试吗?
- 这是否应该 是可调试的但不是由于 VS 或 clr 中的错误?
- 该项目旨在支持多种环境。也许其他一些平台需要它?
我不知道这些问题的答案。但目前,我不需要。注释掉这一行允许再次设置断点,调用它的代码继续到 运行,这就是我所需要的。
如果有人能发光,我会很感兴趣。但与此同时,如果其他人遇到这种情况,现在您有地方可以看看了。
我下载了一个名为CudaFy的开源库,现在已经使用了一段时间。该项目似乎已被放弃,所以当我 运行 遇到问题时,我会自己解决它们。大多数情况下这不是问题,但项目中的一个 c# 库拒绝让我设置断点,使调试变得非常困难。
如果我尝试在 运行 应用程序之前设置断点,则会添加红点,但是一旦我 运行 应用程序,圆圈就会被挖空,并且永远不会重新启用。我知道我尝试设置断点的代码正在执行,因为我可以将其更改为显示的内容(例如 throw new Exception("foo")
)。
查看 VS 输出 window,我看到:
'Opt.exe' (CLR v4.0.30319: Opt.exe): Loaded 'C:\vss\cudafy2\Opt\bin\x64\Debug\CUDA.NET.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Symbols for the module 'CUDA.NET.dll' were not loaded.
很明显这是一条线索。但是,查看项目设置,它肯定不是通过优化构建的。我已经打开优化并再次关闭,我已经摆弄了 CSPROJ 文件但没有任何帮助。
我已经尝试过 RebuildAll、清理文件夹、大声辱骂以及用拳头敲打 table。都无济于事。
环境:
- Windows 7 x64
- Visual Studio 2017 (15.8.0 P5)
- 建筑Debug/x64
- 框架 4.7.2
我将此作为问答式答案发布,因为 google 和 SO 都让我失望了。但是现在我已经找到了答案,所以我将其发布,希望它能对下一个人有所帮助。
这个技巧原来是在相关库的 assembly.cs 文件中。它包含这一行:
[assembly: System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
我已经阅读了此属性的 docs,但我仍然不太明白它的作用。我也不明白为什么项目觉得有必要添加它。
- 是否有一些功能性原因需要它?如果没有它,事情似乎 运行,但也许有一些模糊的功能需要它?
- 有人只是想让他们的代码不可调试吗?
- 这是否应该 是可调试的但不是由于 VS 或 clr 中的错误?
- 该项目旨在支持多种环境。也许其他一些平台需要它?
我不知道这些问题的答案。但目前,我不需要。注释掉这一行允许再次设置断点,调用它的代码继续到 运行,这就是我所需要的。
如果有人能发光,我会很感兴趣。但与此同时,如果其他人遇到这种情况,现在您有地方可以看看了。