2012-01-16 4 views
7

GDBからアプリケーションを起動するとシンボル検索エラーが発生するが、シェルから起動すると問題が発生していた。なぜGDBは新しいシェルを起動するのですか?この動作を無効にする方法は?

GDB内からプログラムを起動するたびに、新しいシェルが起動され、GDBを起動する前に設定したすべての環境変数(例えばLD_LIBRARY_PATH)を上書きすることになります。

これは実際に私が望む動作ではありません。誰かがこれの背後にある根拠を説明することができますか、またはこれをオフにする方法を教えてください?

答えて

4

あなたはを無条件でに設定しています。~/.cshrcなどにはLD_LIBRARY_PATHと設定されています。だから、シェルからあなたがこれを行うよう求めている場合:

export LD_LIBRARY_PATH=foo # or for csh: 
setenv LD_LIBRARY_PATH foo 
$SHELL -c 'echo $LD_LIBRARY_PATH' 

結果がfoo以外のものです。 は、です。

これは通常、非対話型シェルに対して~/.cshrcを保護することを怠ったCSHユーザーに発生します。 BASH_ENVを設定したBASHユーザーにも発生する可能性があります。

+0

私はちょうど私の設定でこの正確な間違いに遭遇しました。 –

1

シェルからgdbを起動すると、新しいプロセスとして起動されますが、その方法はありません。 Unixでは、新しいプロセスが親の環境の一部を継承します。

あなたはボーンのようなシェルを使用している場合、それを輸出しようと、変数が継承されていることを確認するには、次の

export LD_LIBRARY_PATH=... 
+0

私はOPが彼の 'LD_LIBRARY_PATH'を'〜/ .bashrc'などに設定し、その設定が* GDBを呼び出す前に設定したものを上書きするということは間違いありません。 –

+0

あなたはそれを釘付けにしました、@EmployedRussian! –

1

デバッグは(GDB用語で劣る)は、常に清潔で開始されますより再現性のある結果を得るために、そこに変数を設定するには、実行する前に

set env VARNAME=VALUE 

コマンドを使用してください。

+0

"クリーンな環境"とは、GDB自身の環境のコピー(さらに 'set env'コマンドが実行されたもの)以外のものを意味する場合、あなたは間違いです。 –

2

私は同じ問題を抱えています。私は0としてSTARTUP_WITH_SHELLを設定し、START_INFERIOR_TRAPS_EXPECTED を減算し、私はgdbを再コンパイル後

/* If STARTUP_WITH_SHELL is set, GDB's "run" 
    will attempts to start up the debugee under a shell. 
    This is in order for argument-expansion to occur. E.g., 
    (gdb) run * 
    The "*" gets expanded by the shell into a list of files. 
    While this is a nice feature, it turns out to interact badly 
    with some of the catch-fork/catch-exec features we have added. 
    In particular, if the shell does any fork/exec's before 
    the exec of the target program, that can confuse GDB. 
    To disable this feature, set STARTUP_WITH_SHELL to 0. 
    To enable this feature, set STARTUP_WITH_SHELL to 1. 
    The catch-exec traps expected during start-up will 
    be 1 if target is not started up with a shell, 2 if it is. 
    - RT 
    If you disable this, you need to decrement 
    START_INFERIOR_TRAPS_EXPECTED in tm.h. */ 
#define STARTUP_WITH_SHELL 1 
#if !defined(START_INFERIOR_TRAPS_EXPECTED) 
#define START_INFERIOR_TRAPS_EXPECTED 2 
#endif 

としてコメントの作品もあり、inferior.h(GDB gdb/inferior.hのソースコード) にマクロSTARTUP_WITH_SHELLがあることを見つけます。その後、gdbはもうシェルから始まらなかった。

+1

現在のgdbでは 'set startup-with-shell off'コマンドを実行できます。 –

関連する問題