2012-01-26 13 views
4

デバッグされたプログラムからgdbを制御できますか?私はgdb_sendcmd("bt")のようなAPIを使って理想的にこれを助けるライブラリを期待していますが、ソケット経由でローカルgdbに接続するなどの方法で暮らすことができます。デバッグされたプログラムからgdbにコマンドを送信

プライマリユースケースでは、データブレークポイントをプログラムで追加して、次に特定のメモリアドレスが変更されたときを監視します。ターゲット言語は、当然C言語です。それに該当するものはC++やObjective-Cで再利用できます。


Answer from Employed Russian私の直接の問題を解決したが、私はまだ、私はGDBは、デバッグプログラムからプログラムコマンドを実行することができます方法を知ってみたいです。私は、GDBのための余分な起動コマンドを書くのではなく、添付されたコマンドでブレークポイントを作成するのではなく、単にプロジェクトにコードを追加するだけで、デバッグを高速化できます。

プログラムでコマンドを実行する方法があるのであれば、私はまだそれを聞いてみたい;)

+0

私はこれができないと確信しています。 GDB用のスクリプトをPythonで書くこともできますが、ブレークポイントが当たったときに自動的にそれらを呼び出す方法、あなたが求めているメモリウォッチを作成する方法は私には分かりません。 –

+0

多くのCPUアーキテクチャでは、データブレークポイント、データウォッチポイント、ブレークを引き起こす命令などでHWがサポートされています。 – TJD

+0

@TJD正確には、gdbでプログラムでデータブレークポイントを設定する方法や、他のコマンドを実行してください。 –

答えて

2

GDBによって書き出されたPythonインタフェースは、多くのことを行うことができます。

import gdb 

CMD_FCT = "gdb_run" 
CMD_NAME = "str" 

class GdbRunBreakpoint(gdb.Breakpoint): 
    def __init__(self): 
     gdb.Breakpoint.__init__(self, CMD_FCT, internal=1) 
     self.silent = True 

    def stop(self): 
     cmd = gdb.parse_and_eval(CMD_NAME).string() 
     gdb.execute(cmd) 
     return False 
GdbRunBreakpoint() 

(ちょうどあなたの.gdbinitファイルからソースにそれをファイルに比べて、書き込み、および)

を、アプリケーション側:たぶん、このような何かはあなたの要件に合う

void gdb_run(char *str) {} 


int main() { 
    gdb_run("where"); 
} 

Iコードはまっすぐだと思いますが、https://stackoverflow.com/a/8884512/341106で述べたように、stopコールバックではすべてが許可されているわけではありませんが、GDBは中間状態ですが、多くのことが期待どおりに機能します。

編集:言うまでもなく、アプリがデバッグシンボルでコンパイルされていない場合は、これは機能しません。

+0

これは実際にはOS Xで動作することができないにもかかわらず、答えを受け入れています。これはおそらくXcode 4が6.3.5で出荷されているためです。したがって、Pythonはおそらくサポートされていません。 '.gdbinit:1:ソースコマンドファイルのエラー: helper.py:3:ソースコマンドファイルのエラー:未定義コマンド:" import "。 "ヘルプ"を試してください。私は何が起こっているのか理解しています、そして、それはまさに私が望んでいたようです。ありがとう! –

+1

@Ivanああ、6.3は少し古いです、2004年11月彼らのウェブサイトによると、Pythonのサポートは5年後に導入されました;) – Kevin

1

は、デバッグプログラムからGDBを制御することが可能ですか?

いいえプログラムがそれを実行し、すべてのブレークポイントを無効にした場合、どのようにデバッグしますか?

プライマリユースケースでは、データブレークポイントをプログラムで追加して、次に特定のメモリアドレスが変更されたときを監視します。

これは、多くの場合、このような文脈で起動します:foo()のN番目の呼び出しで、(ローカルまたはグローバル)変数barが突然上書きされます、そして、あなたは犯人を見つけたいです。

それが本当に問題であれば、barの値が(まだ初期化された直後の)良好であることを知っている行にブレークポイントを設定します。そのブレークポイントの無視カウント(ignoreコマンドを使用)をN-1に設定し、ブレークポイントがヒットしたらウォッチポイントをbarに設定します。

あなたも、ブレークポイントにコマンドを付けることができます。

commands 1 # assuming this was the first breakpoint 
watch bar 
continue 
end 

ので、ウォッチポイントが自動的に添付されています。

+1

gdbを駆動することを許可されているプログラム(および可能であればブレークポイントを無効にする)は、開発中に私にとって問題ではありません。ブレークポイントを無効にした関数呼び出しを挿入したので、簡単に削除することもできます。 *ただし*、ブレークポイントにコマンドを付けるあなたの考えは面白く聞こえて、私の問題を解決します。私はまだ誰かがプログラムでコマンドを実行する方法を知っているかどうかを見たいと思う。 –

関連する問題