我正在研究SSIS包。该包具有脚本(C#语言)任务。我需要调试脚本任务。我设定了断点。脚本编辑器(Visual Studio)中的脚本和SSIS包编辑器中的任务都显示红色的断点 - 表示断点已启用。但是,当我调试包时,断点没有命中。
断点没有任何条件,所以我希望每次打包都会打到它。
我在Windows 2003 R2 64位SP2上使用Visual Studio 2008。
经过更多研究和反复试验后,发现SSIS包在64位计算机上进行调试时会忽略脚本任务中的断点。要解决这个问题 -
Run64BitRunTime
设置为False
”中。在进行此更改后,断点就像魔术一样。
无论我做了什么,我的断点都拒绝了。我最后调试并使用异常抛出修复问题。一旦我解决了我遇到的问题,断点就开始了!
所以我的断点只会在代码没有遇到任何运行时问题时才会出现......这很奇怪。
根据我的经验,没关系:
但是有一些非常重要的东西,在任何其他答案中都没有提到:你必须运行整个包。如果运行任务或容器,则将忽略断点。
我在64位计算机上使用Visual Studio 2013。
我只有一个脚本组件没有被击中的断点(我正在做一些CRM的东西而不需要源/目标)。我试图用简单的fetchXML添加一个Source组件(即使我不需要它)。然后它工作了! :-)
我尝试了这里提供的所有答案都没有成功(使用VS2015)。经过一些搜索,我发现这个question that is actually an answer表示较新的C#特性/语法导致调试器无法正确触发。
在他们的例子中(也是我的)使用字符串插值导致断点不被击中。
更换
$"{someVariable} - {someOtherVariable}"
同
string.Format("{0} - {1}", someVariable, someOtherVariable);
为我做了诀窍。
更新:伙计们,我失去了任何设置断点的能力(a request to MS) 我以前的修复方法如下。 现在我正在使用日志记录和跟踪而不是调试。
C#新功能(在C#4.0之后)被指责用于杀死SSIS脚本任务的调试。
要返回断点功能,请执行以下操作。
最后,您必须在脚本任务上看到一个红色圆圈。 (在VS 2017中测试过。)
注意。我必须提一下,即使你只使用“执行任务”而不是“执行包”,调试也能正常工作!
删除C#新功能
要删除C#新功能,我可以通过两种方式为您提供建议。
首先,将Vsta Project属性限制为C#4.0(迁移的软件包可能不支持此功能)。
其次,旧/迁移包中的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问题的其他答案对我没有帮助。
使用System.Diagnostics.Debugger类以编程方式添加断点:
System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();
您可以检查是否附加了调试器:
if (System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
请遵循以下步骤:
就我而言,这些解决方案都没有奏效。我终于知道Resharper是罪魁祸首。卸载后,它开始像魅力一样工作。
在我的例子中,我不得不摆脱C#6的所有功能:字符串插值,空条件运算符(?.
,?()
,?[]
)和表达体成员(=>
)(在你的情况下可能会有更多)。你可以检查所有here。当然,这同样适用于C#7功能。
从其他答案的32/64位更改没有帮助,所以我回滚了那些调试保持正常工作。
我们最近遇到了同样的问题。对我们来说,解决方案是确保脚本任务项目被标记为运行,平台目标设置为x86。
除了Jeff的建议,还要将Platform Target更改为“x86”(在脚本的属性'Build选项卡中。这最终让我在64位系统上再次调试。