開発中にシステムライブラリにデバッグシンボルをリンクするベストプラクティスは何ですか?

開発中にシステムライブラリにデバッグシンボルをリンクするベストプラクティスは何ですか?

私はシステムパッケージのデバッグバージョンをインストールするのが非常に便利なプロジェクト段階にあります。少なくともUbuntuでは、ライブラリにデバッグシンボルを追加するのが冷たいお粥です。ほとんどすべてのパッケージには、有用な-dbgバックトレースに必要なすべてのシンボルを提供するバリエーションがあります。

しかし、私は現在Arch Linuxを使用しています。一般的な合意回避策は、ユーザーmakepkg.confファイルを編集し、デバッグフラグを(C|CXX|CPP|LD)FLAGS。さて、私の考えでは、「ソースベースの展開」には十分に公平ですが、すぐに退屈です。

それでは、システムパッケージにデバッグシンボルを添付する最良の方法は何ですか?他のパッケージング会社はどうなりますか?

stripデバッグシンボルを抽出して外部ファイルに保存することが可能であることがわかります。gdbシステムアプリケーションがファイルを見つけるのに苦労することなく、バックトレース中にこれらのシンボルファイルを選択できますか?包装業者の​​観点から、これはどのように機能しますか?

これは単なる考えですが、chroot開発環境を作り上げるのは良い考えでしょうか? (パッケージのデバッグバージョンとリリースバージョンの間にABIの非互換性があるという問題があります。これは少し痛いです。共有ライブラリにリンクされているすべてのエントリも、シンボルの欠落について不平を言うので、最適化されたバージョンに戻ります。)

答え1

展開する場合源泉パッケージでは、(autotools)仕様はデフォルトのコンパイルデバッグシンボルです。

私はかつて主流だったLinuxディストリビューションもバイナリに保存したと思います。デバッグシンボルを削除すると、ソフトウェアが「最適化」されるという誤解があります。しかし、実際にはそうではありません。デバッグシンボルを含めることによって生じる唯一の違いは、ファイルがディスクから占めるスペースです。一般的な使用中はメモリにロードされないため、メモリ使用量には影響しません。したがって、他にも影響はありません。削除されたバイナリと削除されていないバイナリを分析します。彼らは同じです。

展開パッケージから分割する目的は、インストールの合計サイズが3.8 GBではなく2.5 GBになるように各パッケージのサイズを小さくすることです。公式リポジトリに含めるパッケージを選択した場合、ディストリビューションはそのパッケージをソースからパッケージ化します。彼らはあらかじめ作成されたパッケージを使用しないので、今これを行う(別々のデバッグパッケージを作成する)ことはその点に影響を与えません。

さまざまなディストリビューションに独立してライブラリバイナリパッケージをデプロイする場合、デバッグシンボルがコンパイルされるかどうかは誰も気にせず、ライブラリを使用してプログラムするほとんどの人はこれを必要とします。何らかの奇妙な理由で苦しむ少数の人々はとにかく簡単に取り除かれます。

したがって、プログラマーであり、Linuxユーザーとして私の意見を聞きたい場合は、少なくとも今はそのままにしてください。 「早期最適化」の明白な焦点、特に実際の最適化ではない早期最適化は、見た目には悪いです。つまり、あなたの質問に対する文字通りの答えは次のとおりです。ベストプラクティス開発中にシステムライブラリにデバッグシンボルを添付する方法は次のとおりです。それらをコンパイル」。

つまり、私は気づいたこのページのWRT .debパッケージ昔は、私が私の信仰を証明しようとしたとき、彼らはいつも含まれていました。タグにdpkgが含まれているため、効果がある可能性があります。

答え2

ビルドオプションに以下を追加しますOPTIONS+=(debug !strip)()。/etc/makepkg.confDEBUG_CFLAGS="-g -fvar-tracking-assignments"

これらのどれも無効になりません。どの最適化(https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html)。デバッグシンボルを使用して最適化されたビルドを取得できます。いいえ多くの人が「デバッグビルド」について話しているときの意味は何ですか?これを行うには、-O0または-Og(「デバッグの最適化」)を有効にすることもできます。

デバッグ形式は、レジスタ内の変数をメモリにあふれずに追跡できないため、通常はgdbでデバッグするときにprint some_local提供されます。(optimized out)もちろん、完全なデバッグ形式でも、変数が実際に最適化されており、Cソースコードと一致する値を保持するレジスタやメモリがない状況を実際に変更することはできません。それでも(かなり)信頼性の高いバックトレースが得られ、インライン化されていない関数に関数引数を渡すことができます。


https://wiki.archlinux.org/index.php/Debug__-_Getting_Tracesこれは現在のシンボル情報(debug strip)を。somepkg-debug/usr/lib/debugsomepkg-dbg

もちろん、このデバッグパッケージは既存のバイナリパッケージと一緒には使用できません。多少の違いにより、誤ったデバッグ情報が発生する可能性があるためです。

残念ながら、ビルドされたバイナリパッケージ用のデバッグパッケージを展開するためのストレージ/パッケージシステムはありません。したがって、デバッグシンボルを必要とするパッケージをローカルにコンパイルする必要があります。

利点は、-march=native特にシステムに合わせてバイナリを最適化するための良い機会です。たとえば、より効率的な可変カウントシフト命令、ハードウェア、およびpopcntAVX / AVX2 / FMA / AVX512ベクトル命令のためにBMI2など、CPUでサポートされているすべての機能を有効にします。-march=nativeまた、設定-mtune=nativeこれはいい

ライブラリと同じファイルにデバッグ情報を保持するためのパフォーマンスオーバーヘッドは無視できます。コンテンツ全体が/usr/lib/libc.so.6RAMにロードされず、必要なページのみがマップされます。デバッグ情報はバイナリファイルにまとめられているため、これらのページはディスクに残ります。

関連情報