Почему GDB запускает новую оболочку и как отключить это поведение? - PullRequest
7 голосов
/ 16 января 2012

Я выяснил проблему, когда запуск приложения из GDB приводит к ошибке поиска символа, но запуск из оболочки работает.

Оказывается, что всякий раз, когда вы запускаете программу из GDB, она запускает новую оболочку и, таким образом, переопределяет все переменные среды, которые я установил перед запуском GDB (например, LD_LIBRARY_PATH).

Этоне совсем то поведение, которое я хочу.Может кто-нибудь объяснить причину этого или сказать, как я могу это отключить?

Ответы [ 4 ]

5 голосов
/ 16 января 2012

Я предполагаю, что вы безусловно устанавливаете LD_LIBRARY_PATH в вашем ~/.cshrc или подобном.Поэтому, если из командной строки вы сделаете это:

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

, результат будет отличен от foo.Не делайте этого .

Обычно это происходит с пользователями CSH, которые пренебрегали защитой своих ~/.cshrc от неинтерактивных оболочек.Это также может произойти с пользователями BASH, которые установили свои BASH_ENV.

3 голосов
/ 31 декабря 2013

Я встречаю ту же проблему.Я нахожу, что в inferior.h (исходный код gdb gdb / inferior.h ) есть макрос STARTUP_WITH_SHELL, также есть фрагмент комментария как

/* 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

ТогдаЯ установил STARTUP_WITH_SHELL в 0 и уменьшил START_INFERIOR_TRAPS_EXPECTED и перекомпилировал мой GDB.После этого GDB больше не запускался из оболочки.

1 голос
/ 16 января 2012

Отладчик ( подчиненный на языке gdb) всегда запускается с чистой средой для получения более воспроизводимых результатов.Чтобы установить там переменную, используйте команду

set env VARNAME=VALUE

перед запуском.

1 голос
/ 16 января 2012

Когда вы запускаете GDB из оболочки, вы запускаете его как новый процесс, и тут нет пути.В Unix новые процессы наследуют часть среды родительского.

Чтобы убедиться, что переменная наследуется, если вы используете подобную борну оболочку, попробуйте экспортировать ее:

export LD_LIBRARY_PATH=...
...