3

関数名を指定して、呼び出し階層を「一番上まで」報告したいと思います。

例えば、

# ./find.pl functionName
functionName
caller
    caller2
    ...
        callerN

上記の出力では、callerN が「最下位レベル」の functionName 関数を呼び出す「最上位」関数であることがわかります。

私はこれを達成しようとしてきましたが、実装には常に欠陥があります。私が信頼できるほど信頼できるものではありません。

すでにこれを行うものはありますか?

ありがとうございました

4

3 に答える 3

3

NYTProfは、関数呼び出しを非常にきめ細かく検査できるデバッグ パッケージです。HTML に出力して、詳細な (ランタイム) プロファイルを表示できます。要件に応じて、出力できるコール グラフも参照すると役立つ場合があります。

コード例:

#!/usr/bin/perl
use strict;
use warnings;

&say_hi;

sub say_hi {
    print &hello;
}
sub hello {
    return "Hello world!\n";
}

呼び出し:

$ perl -d:NYTProf hello.pl

nytprof.out現在のディレクトリで呼び出されるファイルを生成し、nytprof次を解析できます。

$ nytprof nytprof.out --open

これにより、 というディレクトリが作成nytprofされ、プロファイリング結果ページでブラウザが自動的に開きます。興味深い部分は、ダウンロードできるグラフかもしれません (ただし、それらはnytprofディレクトリにもあります)。これらの呼び出しグラフは、プログラムのどの部分がどの関数を呼び出すかについての洞察を提供する可能性のあるレベルで編成されています。この単純なプログラムのコール グラフは次のようになります。

簡単な hello world プログラムの呼び出しグラフ

PS: グラフはドット ファイルとして提供されます。から SVG を作成するには、次のgraph.dotように言います。

$ dot -Tsvg -o graph.svg graph.dot

詳細はdotマニュアルをご覧ください。

于 2012-12-19T10:16:47.147 に答える
1

コードを実際に実行できる場合は、caller()関数、またはカプセル化されたバージョンのDevel::Stacktraceを使用できます。

コード分​​析に依存している場合... LscharfのPPIとGraphVizの組み合わせが役立つ場合があります。しかし、それが現在のものであるかどうか、または上記の池上で言及されているような無数のエッジケースのいずれかをキャッチするかどうかはわかりません。

于 2012-12-18T09:55:30.000 に答える
1

コールスタックを出力するuse Carpことができます。cluck詳細については、ドキュメントを参照してください。

use strict;
use warnings;

use Carp qw(cluck);

⫕

sub callstack {
    cluck "waaah";
}

sub subsub {
    &callstack;
}

出力:

$ perl /tmp/test.pl
waaah at /tmp/test.pl line 10
    main::callstack called at /tmp/test.pl line 14
    main::subsub called at /tmp/test.pl line 7
于 2012-12-18T11:43:25.870 に答える