2012-09-28 13 views
19

アプリケーションがクラッシュしたときにスタックトレースを取得したい。私は、-rdynamicオプションを使用すると、関数名で完全なスタックトレースを取得できることを理解しています。しかし、私のアプリケーションのパフォーマンスに影響が及ぶかどうかは懸念されます。gcc/g ++に-rdynamicリンカオプションを追加するとパフォーマンスに影響しますか?

答えて

19

はい、ありますが、非常に具体的で、通常は懸念されるものではありません。

-rdynamicオプションは、通常、実行時に不要なシンボルテーブルにシンボルを追加するようリンカに指示します。これは、動的リンカが実行時にシンボル解決のためにウィードする必要がある、もっと多くの、もっと多くのシンボルがあることを意味します。

具体的には、GNUベースのシステムでのシンボルテーブル参照はハッシュを使用して実装されるため、より多くのシンボルを持つと、ハッシュ衝突が発生する可能性が高くなります。ハッシュテーブル内で衝突するすべてのsymolがリストにあるので、実行時リンカーはリストを走査し、各シンボル名をmemcmpで比較する必要があります。より長いリストを持つハッシュの意味では、より多くのシンボルが衝突するため、各ダイナミックシンボルを解決するのにもっと時間がかかります。

この状況は、C++ではCの方がやや悪く、クラス名のために同じプレフィックスが付いたシンボル名が多数あります。

実際には、記号が使用されるのは初めてであり、アプリケーションが非常に大きく、多くの記号が含まれていない限り、それは感じられません。

ごくまれに、アプリケーションが大きい場合は、prelinkingのようなトリックを使用してオーバーヘッドを克服できます。

関連する問題