0

私が取得している例外のスタックトレースは次のとおりです。

/* snip */
at SomeSystemMethod()
at Namespace.Adapters.ListAdapterBase`1.GetObjects(String where)
at Namespace.Processes.MyProcess.Run()
/* snip */

これは、ListAdapterBase が抽象的であり、メソッド GetObjects が直接ではなく、子クラスの別のメソッドによって呼び出されるため、2 行目以降に何かが欠けているようです。

public class ActualStateList : ListAdapterBase<ActualState>
{
    /* snip */
    public List<ActualState> GetByUserId(int userId)
    {
        return GetObjects(string.Format(
            WHERECLAUSE_BYUSERID, userId));
    }
    /* snip */
}

ActualStateList.GetByUserId()だから私の最初の質問は、スタックトレースに別の子クラスまたはメソッドの呼び出しがないのはどうしてですか?

次に、このRun()メソッドは ListAdapterBase の 4 つの子クラスを使用していますが、どのクラスで例外が発生したかを調べることはできますか? ListAdapterBase の背後にある数字は、どういうわけか正確に子クラスの 1 つにつながるのでしょうか?

4

2 に答える 2

3

最初の質問:GetByUserIdリリースビルドにインライン化されている可能性が高いため、スタックトレースから欠落していません。デバッグビルドを使用すると、そのメソッドが表示されます。

2番目の質問:取得しているStackTraceから、どの子クラスが使用されているかを推測することはできません。番号(`1)はのクラス名の一部であり、ListAdapterBaseこのクラスに1つのジェネリック引数があることを示しています。

ただし、1つの考え:JITはインライン化できるため、GetByUserId特定のことを知っています。

  • JITは、virtualメソッドがインライン化されていないため、コンパイル時にどの子クラスが使用されているかを認識しています。
  • 呼び出す子クラスのみGetObjectsが、使用される特定の子クラスの候補になります
  • 単純なメソッドGetObjectsで呼び出される子クラスのみが候補になります。

これらのポイントは、特定の子クラスを見つけるのに役立つ場合があります。

Runpdbファイルを追加すると、例外をスローしたメソッドの行番号が表示されるため、さらに役立つ可能性があります。リリースビルドでもpdbファイルを追加できます。

于 2012-09-19T10:51:29.507 に答える
0

ダニエルが言ったGetByUserIdように、メソッドはコンパイラによってインライン化されているようです。そのため、スタックトレースにはメソッドが表示されません。

`1afterは、1つの型引数を持つジェネリック型であることを意味します。ListAdapterBaseもちろん、すべての派生クラスには1つの型引数があるため、ここでは役に立ちません。スタックトレースだけでは、どれであるかを見つけることはできません。

于 2012-09-19T10:53:22.543 に答える