2017-02-14 24 views
0

私は小さなC++プログラムmy-programを持っています。私がmy-programを直接実行するときC++:linuxシェルスクリプトでgdbを実行

./my-program arg1 

すべてが問題ありません。私は何の誤りもありません。私が直接このスクリプトを実行すると

#!/bin/sh 
my-program $1 

::私はmy-script.shを持っているだけでなく

./my-script.sh arg1 

私はすべてのエラーを得ることはありません。

my-script.shを他のLinuxプロセスから実行すると問題が発生します。この場合私は時々(!)Segmentation faultエラーを取得します。私がやった:私は、C++コンパイラに-gスイッチを追加し、my-script.shを編集し、それがなったので:gdb-script

#!/bin/sh 
gdb -batch -x gdb-script --args my-program $1 

私が書いた:

run 

をしかし、私はまだどのラインを見つけることができません原因:Segmentation faultエラー。エラーが発生した後、スタックトレースをいくつかのファイルに出力するにはどうすればよいですか?または、このエラーの原因となるプログラム内の場所を取得する方法がありますか?

+1

あなたの "gdb-script"ファイルに 'bt'(または' backtrace'または 'where')を追加しますか? - スレッドがたくさんある場合は、すべてのスレッドのすべてのスタックを印刷するためにもっと多くのことをしたいと思うかもしれません - 私はそのコマンドが何であるか分かりませんが、実行できることは分かっています。 –

+0

valgrindで実行してみてください。 –

答えて

1

my-script.shが他のLinuxプロセスから実行されているときに問題が発生します。

スクリプトは、いくつかのミスが含まれています

  1. my-programが存在するディレクトリがあなたの$PATH上にある場合にのみ動作します。

  2. my-programに引数を正しく渡しません。特に、最初の引数だけが渡され、その引数にスペースが含まれていると、単語に分割され、my-programが呼び出されるまでに複数の引数になります。

    #!/bin/sh 
    exec $(dirname "$0")/my-program "[email protected]" 
    

    がどのように私はDGB印刷エラーの後にいくつかのファイルにスタックトレースすることができます。これを修正するには

は、ような何か?

gdb-scriptwhereコマンドを追加します。

1

お使いのシステムで設定コアダンプのためのいくつかの制限を持っているかどうかをチェックすることができます:

ulimit -c 

それが「0」である場合は、生成されたコアダンプを取得することはできません。 セット:

ulimit -c unlimited 

そして限り、あなたは「セグメンテーションフォールト」を取得するなどのプログラムを実行します。コアダンプファイルを生成する必要があります。

関連する問題