2016-04-06 8 views
2

すべてのローカル変数の名前を取得する方法はありますか?私が知っているGDB:すべてのローカル変数の名前を取得するにはどうしたらいいですか?

プリント名とローカル変数の値が、私は自動的に関数の実行のいくつかの点で、すべて地元の人々の値を比較したいと思います(と巨大な存在であるローカル情報この関数のローカル変数の数は、手作業で1つずつ行うのは面倒です...)

ありがとう!

答えて

4

地元の人と2つの時点で比較する方法が本当に必要なように聞こえます。これを行うにはいくつかの方法があります。

低技術の方法の1つは、info localsで変数をダンプすることです。 set logging機能を使用してファイルにダンプできます。commandsがロギング、ダンプ、ロギングを無効にし、最後にcontinueで終了するブレークポイントを設定することで、これらを完全に自動化できます。

この方法では、結果を比較するために別のスクリプトを作成します。

もう1つの方法は、gdbのPythonスクリプト機能を使用することです。ここでローカル変数を取得するのは簡単です:gdb.selected_frame()で選択したフレームを取得します。フレームのブロック(frame.block())を取得します。ブロックの変数を取得するためにブロックのローカルを繰り返し処理し、関数の境界に達するまでブロックを歩きます(gdb.Block.superblockを参照)。

見つけたシンボルを評価したり無視したりすることができます(たとえば、一部のサブセットのみを比較したい場合など)。そして、収集した値をどのように比較するかを決めることができます。

このアプローチでは、すべての作業は別の比較スクリプトなしでgdbで行われます。

+0

ありがとうございます、私は現在Pythonのアプローチを試みており、うまくいくようです!関数の境界に達するかどうかを知る方法は不思議です。 'block.function!= None'は再帰を止める正しい方法ですか? – severine

+0

うん、そうだよ。関数がインライン化されていれば非 '非'関数が表示されることがあります。したがって、最初の非インライン関数まで歩行を拡張したい場合があります。 –

関連する問題