2

C++ プロジェクトのデバッグ情報をリモートの場所に転送してテストする方法を作成しようとしています。現在の開発サイクルでは、コードに小さな変更を加えると、バイナリ全体 (サイズは 100 MB で、ほとんどがデバッグ情報) を転送する必要があります。

現在、これに対処するための私のアプローチは、-gsplit-dwarf を使用してオブジェクト ファイルからデバッグ情報を分割し (デバッグ情報なしのサイズは私の接続で管理可能です)、現在実行中のビルドのコピーに対してデバッグ ファイルを比較することです。リモートボックス。

目的は、プロジェクトのデバッグ ファイル用の一連のパッチを用意して、新しいコードをリモート ロケーションでデバッグできるようにすることです。リモートの場所とローカル マシン間の接続は低速であるため、パッチのサイズを最小限に抑えることが最も重要ですが、ツールの実行時間とのバランスを取る必要もあります。可能性のある解決策として bsdiff と xdelta を調べたところ、xdetla は高速ですが大きすぎ、bsdiff はサイズの点で完璧ですが、実行時間とメモリ要件が希望よりも少し高いという難問に遭遇しました。

不足しているツールやアプローチはありますか、それとも間違った方法で進んでいますか? おそらくbsdiffとxdeltaに代わるものはありますか? gbdserver のようなツールは、実際のデバッグに関するいくつかの要件のために、この状況では機能しないことを私は知っています。bsdiff を変更すると、パフォーマンスが向上しますか? 実際、私が使用しているアプローチが適切である場合、ビルドのコピーをリモート マシンに保持して比較するための良い方法は何でしょうか。

4

1 に答える 1

0

最も簡単な方法は、「strip」を使用して debuginfo を別の「.debug」ファイルにコピーしてから、再度「strip」を使用して、デプロイする実行可能ファイルからデバッグ情報を削除することです。「strip」マニュアルでは、これを行う方法について説明しています。「--only-keep-debug」オプションを探してください。

これを行った後、さまざまな方法で個別のデバッグ情報について gdb に伝えることができます。最も良い方法は、「build-id」機能を使用することです。これは、最新の Linux ディストリビューションが行うことです。ただし、他の方法もあります。gdb マニュアルには、個別のデバッグ ファイルに関するセクション全体があります。

ここでの重要な点は、削除された実行可能ファイルで gdb を起動すると、個別のデバッグ情報が自動的に検出されることです。このデータはすべてローカルである可能性があるため、デバッグ情報をデプロイする必要はありません。

これを行ってもデバッグ情報を縮小したい場合は、「dwz」ツールを参照してください。これはドワーフのコンプレッサーです。ただし、これは通常、デバッグ情報をどこかに出荷する予定がある場合にのみ問題になります。ディストリビューションは、デバッグ情報を簡単にダウンロードできるようにするために使用しますが、通常のユーザーは実際にはその必要性を認識しません。

于 2014-07-30T21:55:56.703 に答える