2015-11-07 13 views
14

Tôi đang làm việc trên một bản vá cho FFmpeg và cần phải gỡ lỗi mã của tôi. Tôi đang tải một thư viện bên ngoài, và để kiểm tra các phiên bản thư viện khác nhau, tôi có chúng trong các thư mục khác nhau. Để chọn cái nào tôi muốn sử dụng, tôi đã sử dụng DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg và hoạt động không sao. Nhưng khi tôi thử trong phạm vi lldb, sự cố xảy ra là dyld: Library not loadedReason: image not found. Điều này được sử dụng để làm việc trước Xcode 7.1, nhưng tôi vừa mới nâng cấp và nó ngừng hoạt động.Tại sao lldb không chuyển tiếp biến môi trường của tôi nữa?


Dưới đây là MVCE tôi:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    char* str = getenv("DYLD_LIBRARY_PATH"); 
    if (str) puts(str); 
    else  puts("(null)"); 
    return 0; 
} 

Chạy chương trình này như sau sẽ cho kết quả:

$ ./a.out 
(null) 
$ DYLD_LIBRARY_PATH=/tmp ./a.out 
/tmp 

Điều đó có vẻ ổn. Nhưng khi tôi cố gắng sử dụng LLĐB nó không thành công:

$ DYLD_LIBRARY_PATH=/tmp lldb ./a.out 
(lldb) target create "./a.out" 
Current executable set to './a.out' (x86_64). 
(lldb) run 
Process 54255 launched: './a.out' (x86_64) 
(null) 
Process 54255 exited with status = 0 (0x00000000) 

Đang cố gắng để thiết lập các biến môi trường bên trong LLĐB hoạt động:

lldb ./a.out 
(lldb) target create "./a.out" 
Current executable set to './a.out' (x86_64). 
(lldb) env DYLD_LIBRARY_PATH=/tmp 
(lldb) run 
Process 54331 launched: './a.out' (x86_64) 
/tmp 
Process 54331 exited with status = 0 (0x00000000) 

phiên bản LLĐB (đó là từ Xcode 7.1):

$ lldb --version 
lldb-340.4.110 

Câu hỏi: Đây có phải là một "tính năng mới" có ý định hay là một lỗi mới trong lldb (hoặc tôi hoàn toàn điên rồ và điều này không bao giờ được sử dụng để hoạt động)? Tôi khá lldb tích cực được sử dụng để chuyển tiếp các biến môi trường DYLD_LIBRARY_PATH, do đó, làm thế nào đến nó không còn nữa?


Chỉnh sửa: Đây là trên OS X 10.11.1.

+1

Đã xác nhận [tại đây] (https://www.mail-archive.com/[email protected]/msg00779.html) bởi Jason Molenda (người có vẻ là một trong những nhà phát triển lldb). –

Trả lời

23

Nếu đây là trên El Capitan (OS X 10.11), thì nó gần như chắc chắn là một tác dụng phụ của Bảo vệ toàn vẹn hệ thống. Từ System Integrity Protection Guide: Runtime Protections bài viết:

Khi một quá trình được khởi động, kiểm tra hạt nhân để xem liệu chính thực thi được bảo vệ trên đĩa hoặc được ký kết với một hệ thống đặc biệt hưởng. Nếu đúng, thì cờ sẽ được đặt để biểu thị rằng nó là được bảo vệ chống sửa đổi. …

… Bất kỳ liên kết động nào (dyld) biến môi trường, chẳng hạn như DYLD_LIBRARY_PATH, sẽ bị xóa khi khởi chạy quy trình được bảo vệ.

Mọi thứ trong/usr/bin đều được bảo vệ theo cách này. Do đó, khi bạn gọi/usr/bin/lldb, tất cả các biến môi trường DYLD_ * sẽ bị xóa.

Nó sẽ làm việc để chạy LLĐB từ bên trong Xcode.app hoặc các công cụ dòng lệnh, như vậy:

DYLD_LIBRARY_PATH=whatever /Applications/Xcode.app/Contents/Developer/usr/bin/lldb <whatever else> 

Tôi không tin rằng bản sao của LLĐB được bảo vệ./usr/bin/lldb thực sự chỉ là một tấm bạt lò xo thực hiện phiên bản trong Xcode hoặc Command Line Tools, vì vậy cuối cùng bạn đang chạy cùng một thứ. Nhưng/usr/bin/lldb được bảo vệ để các biến môi trường DYLD_ * bị xóa khi chạy nó.

Nếu không, bạn sẽ phải đặt biến môi trường bên trong lldb như được hiển thị bởi Greg Clayton trong chuỗi mà bạn đã liên kết. Hoặc, bạn có thể tắt Bảo vệ tính toàn vẹn của hệ thống, mặc dù nó phục vụ một mục đích tốt.

+0

Vâng, đây là trên OS X 10.11.1. Nó thật thú vị. Cảm ơn lời giải thích rõ ràng! – Cornstalks

+2

Cảm ơn. Điều này giải quyết vấn đề của tôi quá (trên El Capitan). Tôi đã tạo một bí danh 'alias lldb =/Applications/Xcode.app/Contents/Developer/usr/bin/lldb' để giảm bớt việc gõ. –

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