8

インライン関数はスタック トレースなどから除外される可能性があるため、デバッグが難しくなる可能性があることは誰もが知っています。しかし、gdb 内からインライン関数を呼び出したいとします。その名前と引数はわかっています。私はそれができるはずだと思いますが、私はこれを得ます:

Cannot evaluate function -- may be inlined

使用nmしている共有ライブラリのシンボルをリストしていたのですが、呼び出したい関数がそこにないことがわかりました。大きな驚きはありません。私が望むのは、これらのインライン関数の目に見える定義を生成する方法です。現在、インライン定義を含むヘッダー ファイルにアクセスできますが、それらのヘッダーを実際に変更することはできません。おそらく、翻訳単位で見られるすべてのインライン関数の定義を発行するようにコンパイラに指示する方法はありますか? または、gdb のインライン関数の呼び出しと結果の検査を容易にする他のトリックはありますか?

Linux で GCC 4.7.2 と GDB 7.5.1 を使用しています。また、本番環境からコア ダンプをデバッグしているため、最適化されていないビルドに実際に切り替えることはできません (開発中は、最適化をオフにするだけで済みます。そうすれば、作業は簡単になります)。

4

2 に答える 2

1

この状況では、GCC オプションを使用してプロジェクトをビルドする-gdwarf-2と役立つ場合があります。

GDB ドキュメントの11.1 インライン関数によると:

gdb がインライン化された関数をサポートするには、コンパイラがインライン化に関する情報をデバッグ情報に記録する必要があります — dwarf 2 形式を使用する gcc がこれを行い、他のいくつかのコンパイラもこれを行います。dwarf 2 を使用する場合、gdb はインライン関数のみをサポートします。4.1 より前のバージョンの gcc は、2 つの必須属性 ('DW_AT_call_file' および 'DW_AT_call_line') を発行しません。gdb は、以前のバージョンの gcc ではインライン化された関数呼び出しを表示しません。代わりに、インライン関数の引数とローカル変数を呼び出し元のローカル変数として表示します。

3.9 プログラムまたは GCC をデバッグするためのオプションも参照してください。

于 2014-02-26T01:55:10.527 に答える