15

私は非常に大規模なアプリケーションに取り組んでおり、現在の実行ポイントまで (例外ではなく) 定期的に呼び出しスタック全体をログに記録したいと考えています。ここでのアイデアは、私が現在の状態に至るまでの正確なコード パスのマップが必要だということです。私は madExcept を使用して作業しており、jclDebug を使用してツールを使用しており、呼び出しスタックの一部を取得できますが、アプリケーションで行われたすべてのメソッド/プロシージャ/関数呼び出しをログに表示することはできないようです。

プロジェクトでスタック フレームを有効にし、デバッグ情報などを有効にしました。コール スタックに含まれていない個々のメソッドのスタック フレームをオンにしてみましたが、役に立ちませんでした。

私がやろうとしていることは可能ですか?コード パスをログに記録するために、数百万行のコード全体にログ コードを追加する必要がないようにしています。

4

5 に答える 5

23

これを行うために、 JCLからJCLDebug を使用します。

以下は、現在の場所のコール スタックを取得し、文字列として返します。

function GetCurrentStack: string;
var
   stackList: TJclStackInfoList; //JclDebug.pas
   sl: TStringList;
begin
   stackList := JclCreateStackList(False, 0, Caller(0, False));
   sl := TStringList.Create;
   stackList.AddToStrings(sl, True, True, True, True);
   Result := sl.Text;
   sl.Free;
   stacklist.Free; 
end;

これを期待どおりに機能させるには、次のような JCL のデバッグ情報でサポートされている方法のいずれかを有効にする必要があります。

  • ターボデバッガ情報
  • JDBG ファイル (MAP ファイルから生成)
  • EXE に挿入された JBDG ファイル。

私は最近、EXE に挿入された JDBG ファイルを、維持しやすい外部 JDBG ファイルのみを出荷するように切り替えました。

次のようなトレースに役立つルーチンもあります。

function ProcByLevel(Level : Integer) : String;

これにより、コール スタック "N" レベル数をさかのぼって現在のメソッド/プロシージャ名を特定できます。

于 2010-02-25T19:48:03.007 に答える
8

madExceptを使用できます- GetThreadStackTrace という名前のメソッドが含まれています。MadExcept は非商用の場合は無料で、それ以外の場合は間違いなく価格に見合う価値があります.

于 2010-02-24T17:37:48.690 に答える
7

応答とコメントから他の回答まで、CALL STACKではなくCALL LOGが必要なようです。必要な情報は、コール スタックには存在しません。

その場合、 SmartInspectAQ Timeなどのツールを調査することをお勧めします。2 つのうち、SmartInspect が最も関連性が高いと思います。AQ Time はよりインタラクティブなプロファイリング ツールですが、SmartInspect にはリモート検査専用の機能があります。

于 2010-02-24T19:52:00.837 に答える
6

メソッドから戻ると、スタックから削除されます。おそらく、あなたの部分呼び出しスタックは、まだ返されていないすべてのメソッドですか?

例えば

DoSomething
begin
    MiniSubMethod
    DomeSomethingMore
    begin
        InnerDoSomething
        begin
            ShowCallStack
        end
    end
end

この状況では、コールスタックは次のようになると思います

InnerDoSomething  
DoSomethingMore  
DoSomething  

DoSomethingMore が呼び出される前に返されたため、MiniSubMethod はスタック上にありません。

FastMM4 には Stack Trace が含まれていると思いますので、試してみてください。

コール スタックだけでなく、何らかのロギング/スタック トレースが必要になることは間違いありません。

于 2010-02-24T15:30:06.333 に答える
1

完全なトレースが必要な場合は、SmartInspectのようなツールが役立つと思います。

コードにロギングを追加する必要がありますが、必要な場合は避けられません。

そのハイライトのいくつか

コンソールへのTCPまたは名前付きパイプを介したリアルタイムの
高性能ライブロギングで監視

リソースの監視と監視
変数値、セッション データ、およびその他のアプリケーション リソースを追跡します。

豊富なロギングとトレース
メッセージ、例外、オブジェクト、ファイル、データベースの結果などを追跡します。

于 2010-02-25T08:01:55.247 に答える