[DBFLUTE-252] {C#}: 実行ステータスログにおいて呼び出し元情報を出力する Created: 2008-05-12  Updated: 2008-09-25  Resolved: 2008-09-22

Status: Closed
Project: DBFlute
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Improvement Priority: Minor
Reporter: jflute Assignee: jflute
Resolution: Fixed Votes: 0
Labels: None


 Description   

Java版において、例えばDBアクセスが、

 AaaPage → BbbService → XxxBhv

というような順序で呼び出された場合、
実行ステータスのログにおいて以下のように出力される。
(呼び出し元のクラス名・メソッド名:行番号が表示されるようになる)

======================================
                    XxxBhv.selectList()
                    ==============
AaaPage.initialize():23 --> BbbService.select():58 --> ...

C#版でもこうなるようにしたい。

【タスク】
A. Java版の実装を参考にする
B. C#での実現可能性を検討する
C. 実装して組み込んでみる

<A>
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example
をチェックアウトして参考にするのがよい。
allcommon.s2dao.S2DaoInterceptorにて実装している。

<B>
スタックトレースをどれだけ構造的に解析できるか!?
自動生成クラスがDLL参考でも行番号が取得できるか!?
などなど

<C>
Javaのプログラムがどれだけ素直にC#へ移行できるか!?



 Comments   
Comment by jflute [ 2008-09-22 ]

テストケースの環境が特別かもしれないので、
実際のアプリで試してもらうこととする。
探す処理自体はできているようなので解決とする。

Comment by jflute [ 2008-09-22 ]

> B. インナークラスがStackTraceに含まれない
インナークラスというより、テストケースからnewして
実行したクラスが通じてない。。。調査中

Comment by jflute [ 2008-09-22 ]

おおよそできたが、Javaとは違う面もあるので今後微調整が必要かもしれない。
大きくは3つ:

A. Type.NameがNamespaceを含まない
B. インナークラスがStackTraceに含まれない
C. AOPのStackTrace表現が違う

Comment by jflute [ 2008-09-22 ]

Behaviorクラス名などの探し方はJavaと同じにする。

Comment by jflute [ 2008-09-22 ]

デバッグ情報の有無に関わらず動作するようなプログラミングをしたい。
それぞれのメソッドの戻り値に注意して無い場合は処理をスキップするような形にする。
また、最悪のケースの場合に備えて例外発生しても継続するようにする。

StackTrace st = new StackTrace();
for (int i = 0; i < st.FrameCount; i++) {
    MethodBase method = sf.GetMethod();
    if (method == null) {
        break; // End
    }
    ...
}
Comment by jflute [ 2008-05-29 ]

おおおお、ありがとうございます。
ぜひ参考にさせて頂きます。
デバッグ情報OFFのときの処理を気をつけて書かないといけませんね。。。

Comment by Anonymous [ 2008-05-28 ]

StackTrace st = new StackTrace();
for (int i = 0; i < st.FrameCount; i++)
{
StackFrame sf = new StackFrame(i + 1, true);
System.Reflection.MethodBase method = sf.GetMethod();
Console.WriteLine(string.Format("Method:

{0}

.

{1}

File:

{2}

Line:

{3}

", method.DeclaringType.Name, method.Name, sf.GetFileName(), sf.GetFileLineNumber()));
}
にて取得できます。
st.FrameCountはスタックフレームの数です。プログラムの開始クラス(メソッド)(通常はProgram.Main)以前のプロローグコードのスタックも取れてしまいますので、そのあたりは気をつける必要があるかと。
また、当然ですが、ファイル名および行番号はデバック情報をON(fullまたはpdb-only)にする必要があります。デバック情報をOFFにした場合、全スタックトレースを上記コードのように表示しようとすると、取得できない情報があるためか、Exceptionが発生しますので、深読みは危険かと思います。
(デバック情報がOFFの場合、深読みするとsf.GetMethod()でnullが帰ってきます)

Generated at Mon Dec 15 11:19:43 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.