2017-07-15 11 views
1

gdbserverを使用してリモートプロセスをデバッグしています。私はgdbserverを起動して入力を待っている間にプロセスにgdbserverを付けることができます。gdbserverを起動時にプロセスに接続するにはどうすればよいですか?

しかし、gdbserverが起動されている間、そのプロセスにgdbserverをアタッチしたいと思います。プロセスはシェルスクリプトを介して起動され、このプロセスの開始方法を変更することはできません。つまり、シェルスクリプトを変更してgdbserverを呼び出してプロセスを起動することはできません。

gdbserverを起動するとすぐにこのプロセスにどのようにアタッチできますか?

編集:main()の開始時に待機ループを作成できます。例えば、所定の場所にファイルを見つけるまで待機ループ:

#include <unistd.h> 
int main() { 

    while(access("/home/username/CONTINUE", F_OK) == -1) 
     sleep(1); 

    /* 
      ...all the rest of main() 
    */ 

    return 0; 
} 

我々は、プロセスがこのループでビジーである間、gdbserverを取り付ける必要に応じて、ブレークポイントを設定し、ループを終了するtouch /home/username/CONTINUEを言うことができます。しかし、これは私たちがソースコードにアクセスし、バイナリをコンパイルし、それをターゲットマシンに置くことができるようにする必要があります。私はこれよりも優れた、簡単な方法を探しています。

+0

私はあなたが複雑な考えをしていると信じています:-D。私の答えを見てください。 – user0042

+0

リモートシステムでsystemtapを実行できますか?そうであれば、Tom Tromeyの[preattach](https://github.com/tromey/gdb-helpers/blob/master/gdbhelpers/preattach.stp)を実行して、新しいプロセスを開始するとすぐに停止することができます。ソースコードを変更する必要があります。 –

答えて

2

しかし、これは、ソースコードにアクセスするバイナリをコンパイルし、ターゲットマシン上に置くことができるように私たちを必要とします。私はこれよりも優れた、簡単な方法を探しています。

リモートオペレーティングシステムのようなLinux/UNIX上で作業しているようです。

リモートシステムに管理者権限がある場合は、元の実行可能ファイルの名前を変更して元の実行可能ファイルと同じ名前のシェルスクリプトで置き換えることが考えられます。gdbserver

ターゲットマシンで(実行可能/usr/bin/fooを仮定)のような何か:

root:# cd /usr/bin 
root:# mv foo foo_ 
root:# echo "#!/bin/sh\ngdbserver /dev/com1 foo_ foo.txt" > foo 
root:# chmod a+x foo 

を、それがgdbserverman(1) pageで言うように:

これは、引数を指定してデバッグfoo_にgdbserverをを伝えますfoo.txtと は、/dev/com1経由でGDBと通信します。 gdbserverは、ホストGDBが通信できるように、忍耐強く待っています。


私は全くのオリジナルのプロセスを変更することなく、考えることができ別の方法は、/dev/procディレクトリ(IES)の変化を監視する小さなプログラム可能、および関連するこのようなイベントでgdbserverを付けることができpid。
gdbserverが添付されている場合、そのプロセスは既にmain()にスケジュールされています。


あなたはgdbとの合理的なデバッグのためにとにかくソースコードへのアクセスもを持っている必要があります。場合によっては(dis-)アセンブリコードを取得することもできます。

関連する問題