2012-06-29 6 views
10

私はgdbを通常1または2のプロジェクトに使用しています。私。私はgdb --args prog argsを呼び出します。 gdbは私がデバッグしているプログラムと同じttyで動作します。gdbが添付されるのを待つ

しかし私の最近のプロジェクトでは、dtachユーティリティが変更されています。これは画面のようなプログラムなので、ttyは別の場所にリダイレクトされるので、gdbのアタッチ機能を使用する必要があります。

gdb添付の問題は、pidを添付するためにプログラムを最初に実行する必要があるため、当初からは接続できないことです。

gdbが接続されるまで、ある時点でプログラムを待機させる方法はありますか?

gdbserverは私がcygwinにあるので使用できません。また、私はpause()を使ってみましたが、それをやめようとしたときに掛かってしまっただけです。

+0

私の悪いを含め、gdbserverをはcygwinの上で動作しないことを不満をメーリングリストでのメッセージは、9年前からでした。昨夜それをコンパイルし、それは正常に動作します。何らかの理由でgdbserverバイナリはcygwinリポジトリに含まれていません。cygwin上の狭いユースケースが原因です。また、gdbデバッグスタブを使用してgdbを最初からプログラムにフックする方法もあります。とにかく答えをありがとう。 – rhlee

答えて

1

プラットフォームによっては、デバッガの待機命令またはトラップがある場合があります。

移植性が高く、ソケットへの接続やFIFOへのデータの書き込みなど、いくつかの外部条件を満たす場合にプログラムを待機させることができます。その後、接続を確立したり、第3の端末からダミーデータを送信したりすることができます。

また、プログラムに無限ループを置いて、デバッガで修正するいくつかの揮発性変数の値をテストして、デバッグを続行できるようにすることもできます。

cygwinプログラムでwindows apisを使用することができますが、いくつかのWeb検索ではプログラムがデバッグされているかどうかを検出するものがあると思われるので、に戻るまでループする可能性があります。

12

この問題を解決する方法は次のとおりです。私は他の人がこのトリックをやっているのを見ました。

プログラムを停止してデバッガの接続を待つ場所を選んでください。ほとんどのプログラムでは、これが始まりですが、いくつかのinit作業があれば、それを終えてからやり直したいかもしれません。これに似たループに入れ

:あなたは成功したプロセスに接続したら

#ifdef DEBUG 

int i = 0; 

while (i == 0) 
{ 
    usleep(100000); // sleep for 0.1 seconds 
} 

#endif // DEBUG 

、あなたはループを切断し、通常のことができますされ、変数iの値を変更するためにデバッガを使用することができます実行を続行します。

1に変数を変更するGDBコマンドは:set var i = 1

私はすべての時間を行うもう一つ:私は何も(「ノーオペレーション」)を行わないnop()と呼ばれる短い関数を定義します。それから私はnop()のどこかに電話をかけて休憩し、中にブレークポイントを入れますnop()

注:デバッグビルドを-O0でビルドすると、コンパイラは変数を最適化しません。最適化されたビルドでこのトリックが必要な場合は、変数をvolatileと宣言する必要があります。

+0

'i'変数を設定してループを解除するシグナルハンドラをインストールするソリューションが必要ですか? – To1ne

9

少なくともLLDBでプロセスを作ることは、自分自身にSIGSTOPを送信してトリックを行うべきです。 Debugger continueコマンドはSIGCONTを発行します。これはGDBでも有効です。またはSIGSTOPの代わりにSIGINTを試してください。

は、ヘッダ、その後

#include <signal.h> 
#include <csignal> // or C++ style alternative 

raise(SIGSTOP) 
+0

gdbコマンド 'info signals'はシグナルのリストを出力し、プログラムに渡されるかどうかを表示します。次に、コマンド 'handle'を使って動作を変更することができます。 –

関連する問題