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

问题描述 投票:24回答:12

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

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

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

debugging ssis breakpoints
12个回答
25
投票

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

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

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


0
投票

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

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


0
投票

根据我的经验,没关系:

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

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

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


0
投票

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


16
投票

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

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

更换

$"{someVariable} - {someOtherVariable}"

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

为我做了诀窍。


12
投票

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


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

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

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

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

enter image description here

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

删除C#新功能

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

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

  1. 双击“脚本任务”以打开“脚本任务编辑器”。
  2. 单击“编辑脚本...”按钮以打开Visual Studio。
  3. 在“解决方案资源管理器”中,选择项目并单击键盘上的F4键。
  4. 在“C#语言级别”中打开的“属性”窗口中选择“C#4.0”
  5. 构建项目并修复编译错误。

其次,旧/迁移包中的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问题的其他答案对我没有帮助。


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.Just-In-Time Debugger snapshot中选择您的项目

5
投票

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

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

Make sure Optimize code is not ticked

相当模糊,但值得一提。


4
投票

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


3
投票

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

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


3
投票

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

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

2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.