1

この問題は、MSTest の結果 (.TRX) ファイルを解析しているときに発見されました。標準出力に文字を出力する単体テストがいくつかあります。MSTest は、この出力を<stdout>TRX ファイル内のノードに保存します。これらの文字は XML ドキュメントでは無効であるため、この TRX ファイルで XDocument.Load() を呼び出すとスローされるはずです。代わりに、これにより TFS ビルド エージェントがクラッシュします。

デフォルトの TFS 2012 ワークフロー 'DefaultTemplate.11.1.xaml' を使用して、セクション 'TryToCompiletheProject' で、これを行うコード アクティビティへの呼び出しを追加します。

protected override void Execute(CodeActivityContext context)
{
    string xmlText = @"<stdout>... &#x1D; ...</stdout>";
    XDocument doc = XDocument.Parse(xmlText);
}

このワークフローのこの領域には、例外をキャッチし、例外メッセージをログに記録し、ビルドを停止する try/catch があります。代わりに、これにより TFS ビルド エージェントがクラッシュします。

Windows イベント ログで通知:

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)

このクラッシュを回避するために、生成された例外をキャッチし、情報が少ない新しい例外をスローします。私はこれを行うのが好きではありません (問題の実際の原因への緩いスタック トレース、元の例外メッセージを表示できません)、元の例外情報をログに記録する別の方法を学びたいと思っています。また、TFS ビルド エージェントのクラッシュを回避します。

4

1 に答える 1

1

これを試してください(テストされていません):

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);
    }
}

それでもビルド プロセスがクラッシュする場合 (ex.Message 文字列に不正な XML が含まれている可能性があります)、Microsoft にバグを報告してください。

于 2013-04-05T21:22:09.327 に答える