21

アプリケーションがクラッシュしたときにスタック トレースを取得したい。-rdynamic オプションを使用すると、関数名を含む完全なスタック トレースを取得できることを理解しています。しかし、アプリケーションのパフォーマンスに何らかの影響があるかどうか心配です。

4

1 に答える 1

28

はい、ありますが、これは非常に具体的なものであり、通常は心配する必要はありません。

-rdynamic オプションは、実行時に通常必要とされないシンボルをシンボル テーブルに追加するようリンカーに指示します。これは、シンボル解決のために実行時にダイナミック リンカーが取り除く必要があるシンボルがさらに、場合によってはさらに多く存在することを意味します。

具体的には、GNU ベースのシステムでのシンボル テーブル ルックアップはハッシュを使用して実装されるため、シンボルが増えると、ハッシュの衝突が発生する可能性が高くなります。ハッシュ テーブルで衝突するすべてのシンボルはリストにあるため、実行時リンカーはリストを走査し、memcmp を使用して各シンボル名を比較する必要があります。より多くのシンボルがハッシュで衝突すると、リストが長くなるため、各動的シンボルを解決するのにより多くの時間がかかります。

この状況は、C++ のほうが C++ よりもやや悪く、クラス名のために多数の同一の接頭辞が付いたシンボル名があります。

実際には、これはシンボルが最初に使用されたときにのみ影響するため、アプリケーションが非常に大きく、多くのシンボルが含まれていない限り、それは感じられません.

アプリケーションが非常に大きいというまれなケースでは、プレリンクなどのトリックを使用してオーバーヘッドを克服できます。

于 2012-09-28T08:59:43.743 に答える