5

私たちのシステムではLINQを非常に広く使用しています。特に LINQ-to-objects。そのため、場所によっては、メモリ内の LINQ クエリがいくつかの巨大な式から構築されることになります。問題は、式にバグがある場合に発生します。そのため、NullReferenceException が発生し、スタック トレースはどこにも ([Lightweight Function] に) つながりません。例外は、LINQ によって生成された動的メソッド内でスローされました。

そのような動的メソッドをデバッグする簡単な方法はありますか? それとも、WinDBG を学ぶために自分自身を犠牲にする必要がありますか? :-)

4

3 に答える 3

3

独自の式を作成してコンパイルする場合、または AsQueryable を使用する場合は、はい。LINQ で生成されたメソッドをデバッグするのは非常に面倒です。

実際のメソッドの小さな断片を使用することで、多少の手間を省くことができます- 少なくとも有用なものがスタック トレースに表示されます...

もう 1 つの考慮事項は次のとおりです。1 つの巨大な式を使用するのではなく、もう少しデイジー チェーン接続を行うことができれば、(スタック トレースから) どこで失敗しているかをより多く把握できる可能性があります。欠点はパフォーマンスです。Where(foo).Where(bar) は 2 つのデリゲート呼び出しですが、Wh​​ere(foo && bar) は 1 つです。

1 つのオプションは、拡張メソッドのデバッグ バージョンを交換することです。IQueryable<T>残念ながら、とが同じ名前空間にあるため、少し不便Queryableです...これは機能しますが...

最初に出力:

>Where: x => ((x % 2) = 0)
<Where: x => ((x % 2) = 0)
>Count
'WindowsFormsApplication2.vshost.exe' (Managed): Loaded 'Anonymously Hosted DynamicMethods Assembly'
<Count

コード:

using System;
using System.Diagnostics;
using System.Linq.Expressions;

namespace Demo
{
    using DebugLinq;
    static class Program
    {
        static void Main()
        {
            var data = System.Linq.Queryable.AsQueryable(new[] { 1, 2, 3, 4, 5 });
            data.Where(x => x % 2 == 0).Count(); 
        }
    }
}
namespace DebugLinq
{
    public static class DebugQueryable
    {
        public static int Count<T>(this System.Linq.IQueryable<T> source)
        {
            return Wrap(() => System.Linq.Queryable.Count(source), "Count");
        }

        public static System.Linq.IQueryable<T> Where<T>(this System.Linq.IQueryable<T> source, Expression<Func<T, bool>> predicate)
        {
            return Wrap(() => System.Linq.Queryable.Where(source, predicate), "Where: " + predicate);
        }
        static TResult Wrap<TResult>(Func<TResult> func, string caption)
        {
            Debug.WriteLine(">" + caption);
            try
            {
                TResult result = func();
                Debug.WriteLine("<" + caption);
                return result;
            }
            catch
            {
                Debug.WriteLine("!" + caption);
                throw;
            }
        }
    }
}
于 2008-10-29T08:38:05.987 に答える
1

LINQ to Objects を使用している場合、動的メソッドが作成されることは期待できません。LINQ to SQL などでそれらを期待しています。これが見られる例を教えてください。

LINQに関しては、デバッグのヒントはあまりありませんが、MSはこれが問題点であることを知っていると確信しています. VS2010 CTPを試してみて、それがより良いかどうかを確認することをお勧めしますか? 確かに、差し迫った問題を解決するためではなく、VSを改善するためです。

于 2008-10-29T08:25:00.397 に答える
0

もともとHaiboLuoによって開発され、RoyOsheroveによってさらに発展した動的メソッドのデバッグビジュアライザーを見てください

于 2009-05-20T23:03:31.867 に答える