调试SSIS脚本任务 - 启用了断点但它没有命中

时间:2017-01-04 18:03:13

标签: debugging ssis breakpoints

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

断点没有任何条件,所以我希望每次打包都会打到它。

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

15 个答案:

答案 0 :(得分:25)

经过更多研究和反复试验后,发现在64位计算机上进行调试时,SSIS包会忽略脚本任务中的断点。解决它 -

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

    进行此更改后,断点就像魔法一样。

答案 1 :(得分:16)

我尝试了这里提供的所有答案都没有成功(使用VS2015)。经过一些搜索后,我发现这个question that is actually an answer表示较新的C#特性/语法导致调试器无法正确触发。

在他们的例子中(也是我的)使用字符串插值导致断点不被击中。

更换

$"{someVariable} - {someOtherVariable}"

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

为我做了诀窍。

答案 2 :(得分:11)

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

C#新功能(在C#4.0之后)被指责用于杀死SSIS脚本任务的调试。

要返回断点功能,请执行以下操作。

  1. 删除C#新功能
  2. 成功运行我的脚本任务一次。即没有崩溃。
  3. 从我的脚本任务中重新打开Vsta项目并在那里放置断点。
  4. 最后,您必须在脚本任务上看到一个红色圆圈 (在VS 2017中测试过。)

    enter image description here

    注意即可。我不得不提一下,即使你只使用“执行任务”而不是“执行包”,调试也能正常工作!

    删除C#新功能

    要删除C#新功能,我可以通过两种方式为您提供建议。

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

    1. Dobule单击“脚本任务”以打开“脚本任务编辑器”。
    2. 单击“编辑脚本...”按钮以打开Visual Studio。
    3. 在“解决方案资源管理器”中选择项目,然后单击键盘上的F4键。
    4. 在“C#语言级别”中打开的“属性”窗口中选择“C#4.0”
    5. 构建项目并修复编译错误
    6. 其次,旧/迁移包中的Vsta项目可能无法显示上述“C#语言级别”属性。
      因此,您可以将代码放在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问题的其他答案对我没有帮助。

答案 3 :(得分:5)

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

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

您可以检查调试器是否已连接:

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

请按照以下步骤操作:

  1. 保持您的项目或解决方案的开放。
  2. 运行您的应用以点击断点。
  3. 即时调试程序中选择您的项目。Just-In-Time Debugger snapshot

答案 4 :(得分:5)

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

最后我发现脚本任务的调试模式的构建属性已经勾选了优化代码。确保没有勾选,因为对我来说,visual studio会启动脚本调试,并在不打破后立即关闭。

Make sure Optimize code is not ticked

相当模糊,但值得一提。

答案 5 :(得分:4)

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

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

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

答案 8 :(得分:2)

除了Jeff的建议外,还要将Platform Target更改为“x86”(在脚本的属性'Build选项卡中。这最终让我在64位系统上再次调试。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

无论我做了什么,我的断点都没有被击中。我最后调试并使用异常抛出修复问题。一旦我解决了我遇到的问题,断点就开始了!

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

答案 11 :(得分:0)

根据我的经验,这没关系:

  • 如果Run64BitRuntime为true或false
  • 如果您构建包的32或64位版本

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

我在64位计算机上使用Visual Studio 2013.

答案 12 :(得分:0)

我只有一个脚本组件,没有命中任何断点(我正在做一些CRM东西,不需要源/目标)。 我试图用简单的fetchXML添加Source组件网(即使我不需要它)。 然后成功了! :-)

答案 13 :(得分:0)

我发现,通过复制脚本组件任务,也可以复制整个VSTA项目。这就是您所期望的,但是我没有想到的是,例如程序集名称也被复制。 运行然后执行任务可以正常工作,但是运行整个程序包实际上仅运行复制的第一个脚本,并导致在击中行处理功能之前引发异常。 这也是我未达到断点的原因。

答案 14 :(得分:0)

我花了一整天的时间来解决这个问题,这里提到的解决方案都没有对我有用。

就我而言,现有项目的目标是 SQL Server 2016,它默认使用 ScriptLanguage Microsoft Visual c# 2015。这不允许在 VS 2019 中进行调试。我必须将项目定位到 SQL Server 2019 才能进行调试。当然,我不打算签入版本更改。只是为了调试脚本。脚本运行后,我会将目标版本恢复为 SQL Server 2016。

希望这可以为某人节省时间。