调试 SSIS 脚本任务 - 断点已启用但未命中

Debugging SSIS Script task - Breakpoint is enabled but it does not hit

我正在开发 SSIS 包。该包有一个脚本(C#语言)任务。我需要调试脚本任务。我设置了断点。脚本编辑器 (Visual Studio) 中的脚本和 SSIS 包编辑器中的任务都以红色显示断点 - 表示断点已启用。但是,当我调试包时,断点没有命中。

断点没有条件,所以我希望每次程序包运行时它都会命中。

我在 Windows 2003 R2 64 位 SP2 上使用 Visual Studio 2008。

使用System.Diagnostics.Debugger class以编程方式添加断点:

System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();

您可以检查是否附加了调试器:

    if (System.Diagnostics.Debugger.IsAttached)
        System.Diagnostics.Debugger.Break();

按照以下步骤操作:

  1. 让您的项目或解决方案保持打开状态。
  2. 运行 您的应用要命中断点。
  3. Select 您在 即时调试器 .
  4. 中的项目

经过多方研究和试错,发现SSIS包在64位机器上调试时会忽略Script Task中的断点。修复它 -

  1. 转到解决方案资源管理器
  2. 右键单击您的 SSIS 项目节点 > 属性
  3. 在配置属性 > 调试 > 调试选项 > 中将 Run64BitRunTime 设置为 False

进行此更改后,断点像魔术一样命中。

我继承了一个 SSIS 包,不幸的是上面的答案没有帮助。

最后我发现脚本任务的调试模式构建属性勾选了优化代码。确保未勾选此项,因为对我来说 visual studio 会启动脚本调试并在不久后关闭而不会中断。

相当晦涩但值得一提。

除了 Jeff 的建议之外,还将平台目标更改为 "x86"(在脚本属性的“构建”选项卡中。这最终让我在 64 位系统上再次调试。

我们最近遇到了同样的问题。对我们来说,解决方案是确保将 脚本任务项目 标记为 运行,并将平台目标设置为 x86。

  1. 编辑脚本任务
  2. 单击项目和 select 属性
  3. Select 将平台目标设置为 x86

更新:伙计们,我又失去了设置断点的能力(a request to MS)
我以前的修复如下。
现在我正在使用日志记录和跟踪而不是调试。


C# 新功能(在 C# 4.0 之后)被指责为终止 SSIS 脚本任务的调试。

为了 return 断点功能,我执行以下操作。

  1. 删除 C# 新功能
  2. 运行我的脚本任务一次,成功。 IE。没有崩溃。
  3. 从我的脚本任务中重新打开 Vsta 项目并在那里放置断点。

最后,您必须在脚本任务上看到一个红色圆圈。
(在 VS 2017 中测试。)

。我不得不提一下,即使您只使用 "Execute Task" 而不是 "Execute Package"!

,调试也能正常工作

删除 C# 新功能

要删除 C# 新功能,我可以建议您两种方法。

首先,将 Vsta 项目属性限制为 C# 4.0(迁移的包可能不支持此功能)。

  1. 双击您的 "Script Task" 打开 "Script Task Editor"。
  2. 点击"Edit Script..."按钮打开Visual Studio。
  3. 在 "Solution Explorer" select 项目中单击键盘上的 F4 键。
  4. 在打开"Properties"window在"C# Language Level"选择"C# 4.0"
  5. 构建您的项目并修复编译错误

其次,old/migrated 包中的 Vsta 项目可能不会显示上述 "C# Language Level" 属性.
所以你可以把你的代码放在 Visual Studio 2010 的一个假项目中并在那里编译它。

运行一次成功

修复 C# 后,您必须 运行 脚本任务成功一次。
您可能希望将 return 语句放在 Main() 方法的开头以防止任何实际执行。
抱歉,这并不总是有效,我不明白为什么,但你肯定需要首先修复你的 C#。
至少 你会得到一个有效的脚本任务,并且可以用老式的方式调试它(Dts.Events... 的日志、异常等)

TL;DR

当 C# 新功能强制脚本任务以成功完成状态静默失败时,我什至遇到了严重的情况。

例如,将以下内容添加到您的脚本任务中。

string Bug { get; } // Only getter properties.
//...
var str = $"Now is {DateTime.Now}"; // String Interpolation in C#
//...
var dummy = val?.ToUpper(); // ?. and ?[] null-conditional Operators

此不完整列表的解决方法:

string Bug { get; set; }
//...
var str = string.Format("Now is {0}", DateTime.Now);
// etc.

我也在做,我在 Visual Studio 2010 中构建了我的 C# 代码。它根本不编译新的 .NET 功能,也不允许 .NET Framework 4.0 以上的版本。到目前为止,还不错。

当然,这个 SO 问题的其他答案对我没有帮助。

我尝试了这里提供的所有答案但没有成功(使用 VS2015)。经过更多搜索后,我发现这个 question that is actually an answer 指出较新的 C# 功能/语法导致调试器无法正确启动。

在他们的示例(以及我的示例)中,使用字符串插值导致断点未命中。

正在替换

$"{someVariable} - {someOtherVariable}"

string.Format("{0} - {1}", someVariable, someOtherVariable);

对我有用。

编辑

看来此问题现在已通过 SQL Server Integration Services Projects 修复,但您需要 运行 VS2019 才能下载它。

在我的例子中,我不得不摆脱 C# 6 中的所有功能:字符串插值、空条件运算符(?.?()?[])和 expression-bodied 成员 (=>) (在你的情况下可能会有更多)。您可以检查所有 here。当然,这同样适用于 C# 7 的特性。

来自其他答案的 32/64 位更改没有帮助,所以我回滚了那些并且调试工作正常。

无论我做什么,我的断点都不会命中。我最终只使用异常抛出来调试和修复问题。一旦我解决了我遇到的问题,断点就开始出现了!

所以我的断点只会在代码没有遇到任何运行时问题时命中...这很奇怪。

根据我的经验,没关系:

  • 如果 Run64BitRuntime 是真还是假
  • 如果您构建包的 32 位或 64 位版本

但是有一点非常重要,在任何其他答案中都没有提到:你必须运行整个包裹。如果您 运行 任务或容器,断点将被忽略。

我在 64 位机器上使用 Visual Studio 2013。

就我而言,none 这些解决方案有效。我终于知道 Resharper 是罪魁祸首。卸载后,它开始像魅力一样工作。

我只有一个脚本组件,没有遇到断点(我正在做一些 CRM 的事情而不需要 source/target)。 我试图用一个简单的 fetchXML 添加一个 Source componenet(即使我不需要它)。 然后它起作用了! :-)

我发现通过复制脚本组件任务,整个 VSTA 项目也会被复制。这是你所期望的,但我没想到的是,例如程序集名称也被复制了。 运行 然后 Execute Task 工作正常,但是 运行 整个包实际上只运行复制的第一个脚本,并导致在命中行处理函数之前抛出异常。 这也是我没有被击中断点的原因。

Microsoft 发布了 SQL Server Integration Services Projects 的更新 v3.2,它解决了 Roslyn 和 .Net 4.5 之后引入的其他 C# 语言功能的问题。 C# 功能。
坏消息 - 此修复仅适用于 Visual Studio 2019,您必须升级您的 VS 才能使用它。

我在这上面花了一整天,NONE 这里提到的解决方案对我有用。

在我的例子中,现有项目针对 SQL Server 2016,默认为 ScriptLanguage Microsoft Visual c# 2015。这不允许在 VS 2019 中进行调试。我必须将项目定位到 SQL Server 2019 进行调试工作。当然,我不会签入版本更改。它只是为了调试脚本。脚本运行后,我将把目标版本恢复到 SQL 服务器 2016。

希望这能为某人节省时间。

我和你有同样的问题@PAS。使用 VS 2019 和目标服务器版本 2016。 刚发现如果将 Visual Studio 中的 SSIS(进入扩展-> 管理扩展)升级到最新版本(现在是 3.15),调试现在可以正常工作。