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

Hap*_*own 27 debugging ssis breakpoints

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

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

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

Hap*_*own 29

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

  1. 转到解决方案资源管理器
  2. 右键单击SSIS项目节点>"属性"
  3. 在配置属性>调试>调试选项>设置Run64BitRunTimeFalse.

SSIS项目配置设置

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


PTD*_*PTD 22

我尝试了这里提供的所有答案都没有成功(使用VS2015).经过一些搜索,我发现这个问题实际上是一个答案,表明较新的C#特性/语法导致调试器无法正确触发.

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

更换

$"{someVariable} - {someOtherVariable}"
Run Code Online (Sandbox Code Playgroud)

string.Format("{0} - {1}", someVariable, someOtherVariable);
Run Code Online (Sandbox Code Playgroud)

为我做了诀窍.


it3*_*3xl 12

更新:大家好,我失去了设置断点的任何能力(对MS的请求)
我以前的修复方法如下.
现在我正在使用日志记录和跟踪而不是调试.


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

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

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

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

在此输入图像描述

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

删除C#新功能

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

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

  1. Dobule单击"脚本任务"以打开"脚本任务编辑器".
  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
Run Code Online (Sandbox Code Playgroud)

此非完整列表的变通方法:

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

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

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


And*_*rew 6

就我而言,我必须得到从C#6去掉所有功能:串插,空条件运算符(?.?()?[])和表达健全成员(=>)(有可能是更多的在你的情况下)。您可以在此处检查所有内容。当然,C#7功能也是如此。

其他答案的32/64位更改无济于事,因此我回滚了这些内容,并且调试工作正常。


Sha*_*ehr 5

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

System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();
Run Code Online (Sandbox Code Playgroud)

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

    if (System.Diagnostics.Debugger.IsAttached)
        System.Diagnostics.Debugger.Break();
Run Code Online (Sandbox Code Playgroud)

请遵循以下步骤:

  1. 保持您的项目或解决方案打开.
  2. 运行您的应用程序以达到断点.
  3. Just-In-Time Debugger中选择您的项目.即时调试器快照


Jef*_*eff 5

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

最后,我发现脚本任务的调试模式构建属性已打勾了优化代码。确保没有打勾,因为对我而言,Visual Studio会启动以进行脚本调试,并在不中断的情况下立即关闭。

确保没有勾选优化代码

相当模糊,但值得一提。


Ben*_*att 5

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

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


小智 5

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

  • 仅禁用 Resharper 的调试器集成也有效。ReSharper -> 选项 -> 产品和功能,然后取消勾选“调试器集成”框。 (2认同)