web-dev-qa-db-ja.com

GDBを使用して、シェルスクリプトから呼び出されたC ++プログラムをデバッグします

非常に複雑なシェルスクリプトがあり、その中でGDBを介してデバッグしたいC++プログラムを呼び出します。このc ++プログラムには多くのブランチと多くの環境変数設定があるため、このc ++プログラムをシェルから分離することは非常に困難です。

このシェルスクリプトでGDBを呼び出す方法はありますか? gdbでは、C++プログラムを直接呼び出す必要があるようです。

29
Vendetta

実行できるオプションは2つあります。

  1. シェルスクリプト内で直接GDBを呼び出します。これは、標準入力と標準出力がリダイレクトされていないことを意味します。

  2. シェルスクリプトを実行してから、次のようにデバッガーを既に実行中のC++プロセスに接続します。gdb progname 1234 どこ 1234は、実行中のC++プロセスのプロセスIDです。

プログラムの実行を開始する前に何かを行う必要がある場合は、オプション1の方が適しています。それ以外の場合は、オプション2の方が適切です。

16
diverscuba23

@ diverscuba23で言及されているオプションに加えて、次のことができます。

gdb --args bash <script>

(それがbashスクリプトであると仮定します。それ以外の場合はそれに応じて適応します)

17
Vishal

おそらく、スクリプトを変更して常にgdbを呼び出す(そして後でこれを元に戻す)か、gdbを呼び出すオプションを追加します。これはほとんどの場合、最も簡単な解決策になります。

次に簡単なのは、実行可能ファイルを一時的に移動し、移動したプログラムでgdbを実行するシェルスクリプトに置き換えることです。たとえば、プログラムを含むディレクトリでは、次のようになります。

$ mv program _program
$ (echo "#!/bin/sh"; echo "exec gdb $PWD/_program") > program
$ chmod +x program
3
Fred Nurk

Pidを出力して30秒スリープするようにc ++アプリケーションを変更します(おそらく環境または引数に基づいて)。 gdbを使用して実行中のインスタンスにアタッチします。

2
Erik

スクリプトにgdbを一時的に追加できますか?

1