3

重複の可能性:
コードの図式関数呼び出しグラフを取得するためのツール

私は長い間C++関数をdllで(Windows上で)書きました... api を書き、関数ポインタを使用して関数を呼び出す人もいれば、単にそれを呼び出した人もいました..

関数の呼び出し元 (CODE PATHS) が誰であるかを知りたい。関数へのすべての API 呼び出しのスタックを分析したいと考えています。

簡単にできる方法はありますか?つまり、呼び出し元 (CODE PATHS) を検索するとき、途中で関数ポインターが存在するため、基本的に手動で多くの作業を行う必要があります。同じためのオープンソースソリューションがある場合は、共有してください..

スタックを表示するためにブレークポイントを使用したり、自分で関数を記述したりしたくありません。これは、呼び出しパスがヒットした場合に結果に表示されるようなものだからです..しかし、呼び出しパスがヒットしない場合はどうなりますか? したがって、関数 X が呼び出されたときにのみ、私を呼び出す関数 X を知ることができます。しかし、常にそうであるとは限りません

4

2 に答える 2

3

Linuxの場合は @Magnus の回答があり、Windowsの場合はこれを読むことができます。

C++ でコール スタックを取得するのは簡単ではありません。コール スタックをメモリ アドレスとして取得するのにそれほど多くのコードは必要ありませんが、それらを関数名にマップするのは非常に難しい場合があります (各モジュールの各アドレスで関数を解決する必要があるため)。

幸いなことに、それを行うための Windows 関数があります: Debug Help LibraryStackWalk64 (接尾辞は気にしないでください。32 ビットと 64 ビットの両方で動作します)。そこでは、既知のすべてのプラットフォームでフルスタックを解決するために必要なすべての関数を見つけることができます (存在する場合はデバッグ情報を使用して、関数名を解決し、装飾を解除します)。-64

完全な動作例については、CodeGuruのこの記事を参照してください。

于 2013-01-16T10:18:20.417 に答える
2

実行時に関数のすべての呼び出し元を見つけることが主な関心事である場合は、valgrind スイートの一部として callgrind または cachegrind を調べることができます。接続を視覚化する GUI ツールがいくつかあり、他の多くの問題にも役立ちます。

ここを参照してください: http://valgrind.org/

編集:より正確には、このツール: http://valgrind.org/info/tools.html#callgrind

于 2013-01-16T10:03:08.747 に答える