为什么TFS 2012生成代理在尝试将无效XML加载到XDocument时崩溃?

为什么TFS 2012生成代理在尝试将无效XML加载到XDocument时崩溃?,xml,Xml,在解析MSTest结果(.TRX)文件时发现了这个问题:我们有一些单元测试将字符输出到stdout。MSTest将此输出存储在TRX文件的节点中。对此TRX文件调用XDocument.Load()时应抛出,因为这些字符对于XML文档无效。相反,这会触发TFS构建代理崩溃 使用默认TFS 2012工作流“DefaultTemplate.11.1.xaml”,在“TryToCompiletheProject”部分中,添加对代码活动的调用,以执行以下操作: protected override voi

在解析MSTest结果(.TRX)文件时发现了这个问题:我们有一些单元测试将字符输出到stdout。MSTest将此输出存储在TRX文件的
节点中。对此TRX文件调用XDocument.Load()时应抛出,因为这些字符对于XML文档无效。相反,这会触发TFS构建代理崩溃

使用默认TFS 2012工作流“DefaultTemplate.11.1.xaml”,在“TryToCompiletheProject”部分中,添加对代码活动的调用,以执行以下操作:

protected override void Execute(CodeActivityContext context)
{
    string xmlText = @"<stdout>... &#x1D; ...</stdout>";
    XDocument doc = XDocument.Parse(xmlText);
}
为了避免这种崩溃,我捕获生成的异常并抛出一个信息较少的新异常。我不喜欢这样做(松散的堆栈跟踪到问题的实际来源,无法显示原始异常消息),我更愿意学习记录原始异常信息的另一种方法。并避免使TFS生成代理崩溃。

尝试以下方法(未测试):

protected override void Execute(CodeActivityContext上下文)
{
试一试{
字符串xmlText=@“…;…”;
XDocument doc=XDocument.Parse(xmlText);
}捕获(例外情况除外){
抛出新异常(“无法解析XML文档”,例如);
}
}
如果这仍然会使构建过程崩溃(可能ex.Message字符串包含错误的XML),那么请向Microsoft提交一个错误,尝试以下方法(未测试):

protected override void Execute(CodeActivityContext上下文)
{
试一试{
字符串xmlText=@“…;…”;
XDocument doc=XDocument.Parse(xmlText);
}捕获(例外情况除外){
抛出新异常(“无法解析XML文档”,例如);
}
}

如果这仍然会使构建过程崩溃(可能ex.Message字符串包含错误的XML),那么请向Microsoft提交一个bug

尝试使用
ex.ToString()
来确保。更好的做法是,删除try/catch块,让框架处理异常。@约翰森理解:我澄清了我的问题,一旦我能够找到抛出的实际异常,从这个角度看,至少在我看来,就像构建工作流过程(存储为XML)试图写入无效XML时写入错误一样。您能看到生成工作流进程试图写入的消息和其他数据吗?@DaveShaw:即使生成代理没有崩溃,生成(worklow)摘要和日志也不会显示异常消息。除了我已经从事件日志中显示的内容外,我还能从哪里找到你的意思?@GrumpyCurmudgeon,我以为你成功地将调试器附加到了服务器构建过程。你不能捕获异常并查看其中的内容吗。我认为John的答案是一样的。试着使用
ex.ToString()
来确认一下。更好的做法是,删除try/catch块,让框架处理异常。@约翰森理解:我澄清了我的问题,一旦我能够找到抛出的实际异常,从这个角度看,至少在我看来,就像构建工作流过程(存储为XML)试图写入无效XML时写入错误一样。您能看到生成工作流进程试图写入的消息和其他数据吗?@DaveShaw:即使生成代理没有崩溃,生成(worklow)摘要和日志也不会显示异常消息。除了我已经从事件日志中显示的内容外,我还能从哪里找到你的意思?@GrumpyCurmudgeon,我以为你成功地将调试器附加到了服务器构建过程。你不能捕获异常并查看其中的内容吗。我认为约翰的答案是一样的。是的,它仍然崩溃。附加了调试器后,我觉得异常消息中会显示无效字符。谢谢John和@DaveShaw:你们都很有用:如何标记这个问题的答案有什么礼节?谁说的?我还没有回答,所以不要接受我的回答。如果Microsoft有话要说,这相当于一个“答案”,那么您可以自己“回答”这个问题并接受它。微软于2013年4月10日上午6:35发布的MS更新:我们能够重现这个问题。该异常正在由try/catch处理。但是,异常消息包含无法打印的字符。当我们试图将异常写入构建日志时,我们得到了第二个异常。是的,它仍然崩溃。附加了调试器后,我觉得异常消息中会显示无效字符。谢谢John和@DaveShaw:你们都很有用:如何标记这个问题的答案有什么礼节?谁说的?我还没有回答,所以不要接受我的回答。如果Microsoft有话要说,这相当于一个“答案”,那么您可以自己“回答”这个问题并接受它。微软于2013年4月10日上午6:35发布的MS更新:我们能够重现这个问题。该异常正在由try/catch处理。但是,异常消息包含无法打印的字符。当我们尝试将异常写入构建日志时,会出现第二个异常。
The build machine will be stopped because an unhandled exception was thrown.
Type: System.ArgumentException
Message: '', hexadecimal value 0x1D, is an invalid character.
Stack Trace:    at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
   at System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd)
   at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
   at System.Xml.XmlWellFormedWriter.WriteString(String text)
   at System.Xml.XmlWriter.WriteAttributeString(String localName, String value)
   at Microsoft.TeamFoundation.Build.Workflow.Tracking.BuildInformationNode.ToXml(XmlWriter writer)
   at Microsoft.TeamFoundation.Build.Workflow.Tracking.FileTrackingParticipant.FlushToFile(IList`1 nodesToSave, String file)
protected override void Execute(CodeActivityContext context)
{
    try {
        string xmlText = @"<stdout>... &#x1D; ...</stdout>";
        XDocument doc = XDocument.Parse(xmlText);
    } catch (Exception ex) {
        throw new Exception("Can't parse XML Document", ex);
    }
}