2012-01-16 30 views
7

Tôi đã tìm ra một vấn đề mà bắt đầu ứng dụng từ kết quả GDB trong một lỗi tra cứu biểu tượng, nhưng bắt đầu từ vỏ hoạt động.Tại sao GDB bắt đầu một trình bao mới và cách tắt hành vi này?

Nó chỉ ra rằng bất cứ khi nào bạn bắt đầu một chương trình từ bên trong GDB nó sẽ bắt đầu một trình bao mới và do đó ghi đè lên tất cả các biến môi trường mà tôi đã đặt trước khi bắt đầu GDB (như LD_LIBRARY_PATH).

Đây không thực sự là hành vi tôi muốn. Ai đó có thể giải thích lý do đằng sau điều này, hoặc cho tôi biết làm thế nào tôi có thể tắt tính năng này?

Trả lời

4

Tôi đoán rằng bạn vô điều kiện đặt LD_LIBRARY_PATH trong số ~/.cshrc hoặc các loại tương tự. Vì vậy, nếu từ dấu nhắc trình bao, bạn thực hiện việc này:

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

kết quả là một số khác ngoài foo. Đừng làm rằng.

Thông thường điều này xảy ra với người dùng CSH, những người đã bỏ qua bảo vệ ~/.cshrc của họ đối với các hệ vỏ không tương tác. Điều này cũng có thể xảy ra với người dùng BASH đã đặt số BASH_ENV của họ.

+0

Tôi vừa gặp lỗi chính xác trong cấu hình của mình. –

1

Khi bạn khởi động gdb từ trình bao, bạn khởi động nó như một quá trình mới, không có cách nào xung quanh đó. Trong các tiến trình Unix mới kế thừa một số môi trường của cha mẹ.

Để đảm bảo một biến được thừa hưởng, nếu bạn đang sử dụng một vỏ bourne-như thế nào, cố gắng xuất khẩu nó:

export LD_LIBRARY_PATH=... 
+0

Tôi đoán rằng vấn đề là OP đặt 'LD_LIBRARY_PATH' của mình thành' ~/.bashrc' hoặc một cái gì đó tương tự, và cài đặt đó * ghi đè * bất cứ điều gì anh ta đặt trước khi gọi GDB,]. –

+0

Bạn đã đóng đinh nó, @EmployedRussian! –

1

Các debuggee (kém trong gdb cách nói) luôn luôn bắt đầu với một sạch môi trường để có được kết quả tái sản xuất nhiều hơn. Để đặt biến ở đó, hãy sử dụng các lệnh

set env VARNAME=VALUE 

trước khi chạy.

+0

Nếu bởi "môi trường sạch" bạn có nghĩa là một cái gì đó khác hơn là một bản sao của môi trường riêng của GDB (cộng với bất cứ lệnh 'set env' đã được thực hiện), họ bạn đang khá nhầm lẫn. –

2

Tôi gặp vấn đề tương tự. Tôi thấy rằng trong inferior.h (mã nguồn của gdb gdb/inferior.h) có một vĩ mô STARTUP_WITH_SHELL, đó cũng là một mảnh bình luận như

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

Sau đó tôi đặt STARTUP_WITH_SHELL là 0 và giảm đi START_INFERIOR_TRAPS_EXPECTED và biên dịch lại gdb của tôi . Sau đó gdb không bắt đầu từ shell nữa.

+1

Hiện tại gdb cho phép bạn làm điều đó bằng cách: 'set startup-with-shell off' –

Các vấn đề liên quan