调试 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();
按照以下步骤操作:
- 让您的项目或解决方案保持打开状态。
- 运行 您的应用要命中断点。
- Select 您在 即时调试器 .
中的项目
经过多方研究和试错,发现SSIS包在64位机器上调试时会忽略Script Task中的断点。修复它 -
- 转到解决方案资源管理器
- 右键单击您的 SSIS 项目节点 > 属性
- 在配置属性 > 调试 > 调试选项 > 中将
Run64BitRunTime
设置为 False
。
进行此更改后,断点像魔术一样命中。
我继承了一个 SSIS 包,不幸的是上面的答案没有帮助。
最后我发现脚本任务的调试模式构建属性勾选了优化代码。确保未勾选此项,因为对我来说 visual studio 会启动脚本调试并在不久后关闭而不会中断。
相当晦涩但值得一提。
除了 Jeff 的建议之外,还将平台目标更改为 "x86"(在脚本属性的“构建”选项卡中。这最终让我在 64 位系统上再次调试。
我们最近遇到了同样的问题。对我们来说,解决方案是确保将 脚本任务项目 标记为 运行,并将平台目标设置为 x86。
- 编辑脚本任务
- 单击项目和 select 属性
- Select 将平台目标设置为 x86
更新:伙计们,我又失去了设置断点的能力(a request to MS)
我以前的修复如下。
现在我正在使用日志记录和跟踪而不是调试。
C# 新功能(在 C# 4.0 之后)被指责为终止 SSIS 脚本任务的调试。
为了 return 断点功能,我执行以下操作。
- 删除 C# 新功能
- 运行我的脚本任务一次,成功。 IE。没有崩溃。
- 从我的脚本任务中重新打开 Vsta 项目并在那里放置断点。
最后,您必须在脚本任务上看到一个红色圆圈。
(在 VS 2017 中测试。)
注。我不得不提一下,即使您只使用 "Execute Task" 而不是 "Execute Package"!
,调试也能正常工作
删除 C# 新功能
要删除 C# 新功能,我可以建议您两种方法。
首先,将 Vsta 项目属性限制为 C# 4.0(迁移的包可能不支持此功能)。
- 双击您的 "Script Task" 打开 "Script Task Editor"。
- 点击"Edit Script..."按钮打开Visual Studio。
- 在 "Solution Explorer" select 项目中单击键盘上的 F4 键。
- 在打开"Properties"window在"C# Language Level"选择"C# 4.0"
- 构建您的项目并修复编译错误。
其次,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),调试现在可以正常工作。
我正在开发 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();
按照以下步骤操作:
- 让您的项目或解决方案保持打开状态。
- 运行 您的应用要命中断点。
- Select 您在 即时调试器 .
经过多方研究和试错,发现SSIS包在64位机器上调试时会忽略Script Task中的断点。修复它 -
- 转到解决方案资源管理器
- 右键单击您的 SSIS 项目节点 > 属性
- 在配置属性 > 调试 > 调试选项 > 中将
Run64BitRunTime
设置为False
。
进行此更改后,断点像魔术一样命中。
我继承了一个 SSIS 包,不幸的是上面的答案没有帮助。
最后我发现脚本任务的调试模式构建属性勾选了优化代码。确保未勾选此项,因为对我来说 visual studio 会启动脚本调试并在不久后关闭而不会中断。
相当晦涩但值得一提。
除了 Jeff 的建议之外,还将平台目标更改为 "x86"(在脚本属性的“构建”选项卡中。这最终让我在 64 位系统上再次调试。
我们最近遇到了同样的问题。对我们来说,解决方案是确保将 脚本任务项目 标记为 运行,并将平台目标设置为 x86。
- 编辑脚本任务
- 单击项目和 select 属性
- Select 将平台目标设置为 x86
更新:伙计们,我又失去了设置断点的能力(a request to MS)
我以前的修复如下。
现在我正在使用日志记录和跟踪而不是调试。
C# 新功能(在 C# 4.0 之后)被指责为终止 SSIS 脚本任务的调试。
为了 return 断点功能,我执行以下操作。
- 删除 C# 新功能
- 运行我的脚本任务一次,成功。 IE。没有崩溃。
- 从我的脚本任务中重新打开 Vsta 项目并在那里放置断点。
最后,您必须在脚本任务上看到一个红色圆圈。
(在 VS 2017 中测试。)
注。我不得不提一下,即使您只使用 "Execute Task" 而不是 "Execute Package"!
,调试也能正常工作删除 C# 新功能
要删除 C# 新功能,我可以建议您两种方法。
首先,将 Vsta 项目属性限制为 C# 4.0(迁移的包可能不支持此功能)。
- 双击您的 "Script Task" 打开 "Script Task Editor"。
- 点击"Edit Script..."按钮打开Visual Studio。
- 在 "Solution Explorer" select 项目中单击键盘上的 F4 键。
- 在打开"Properties"window在"C# Language Level"选择"C# 4.0"
- 构建您的项目并修复编译错误。
其次,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),调试现在可以正常工作。