すべてのローカル変数の名前を取得する方法はありますか?私が知っているGDB:すべてのローカル変数の名前を取得するにはどうしたらいいですか?
プリント名とローカル変数の値が、私は自動的に関数の実行のいくつかの点で、すべて地元の人々の値を比較したいと思います(と巨大な存在であるローカル情報この関数のローカル変数の数は、手作業で1つずつ行うのは面倒です...)
ありがとう!
すべてのローカル変数の名前を取得する方法はありますか?私が知っているGDB:すべてのローカル変数の名前を取得するにはどうしたらいいですか?
プリント名とローカル変数の値が、私は自動的に関数の実行のいくつかの点で、すべて地元の人々の値を比較したいと思います(と巨大な存在であるローカル情報この関数のローカル変数の数は、手作業で1つずつ行うのは面倒です...)
ありがとう!
地元の人と2つの時点で比較する方法が本当に必要なように聞こえます。これを行うにはいくつかの方法があります。
低技術の方法の1つは、info locals
で変数をダンプすることです。 set logging
機能を使用してファイルにダンプできます。commands
がロギング、ダンプ、ロギングを無効にし、最後にcontinue
で終了するブレークポイントを設定することで、これらを完全に自動化できます。
この方法では、結果を比較するために別のスクリプトを作成します。
もう1つの方法は、gdbのPythonスクリプト機能を使用することです。ここでローカル変数を取得するのは簡単です:gdb.selected_frame()
で選択したフレームを取得します。フレームのブロック(frame.block()
)を取得します。ブロックの変数を取得するためにブロックのローカルを繰り返し処理し、関数の境界に達するまでブロックを歩きます(gdb.Block.superblock
を参照)。
見つけたシンボルを評価したり無視したりすることができます(たとえば、一部のサブセットのみを比較したい場合など)。そして、収集した値をどのように比較するかを決めることができます。
このアプローチでは、すべての作業は別の比較スクリプトなしでgdbで行われます。
ありがとうございます、私は現在Pythonのアプローチを試みており、うまくいくようです!関数の境界に達するかどうかを知る方法は不思議です。 'block.function!= None'は再帰を止める正しい方法ですか? – severine
うん、そうだよ。関数がインライン化されていれば非 '非'関数が表示されることがあります。したがって、最初の非インライン関数まで歩行を拡張したい場合があります。 –