2015-11-07 98 views
14

我正在为FFmpeg打补丁,需要调试我的代码。我正在加载外部库,为了测试不同的库版本,我将它们放在不同的文件夹中。要选择我想使用哪一个,我一直在使用DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg,这工作正常。但是当我在lldb内尝试它时,它崩溃说dyld: Library not loadedReason: image not found。这用于Xcode 7.1之前的工作,但我刚刚升级并停止工作。为什么lldb不再转发我的环境变量了?


这里是我的MVCE:

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

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

运行此程序如下产生输出:

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

这看起来还好。但是,当我尝试使用LLDB失败:

$ 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) 

尝试设置环境变量中LLDB工作:

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) 

LLDB版本(它在Xcode 7.1的):

$ lldb --version 
lldb-340.4.110 

问题:这是一个有意为之的新功能吗?或者这是lldb中的一个新bug(或者我完全疯了,这个从来没有用过)?我很积极lldb用于转发DYLD_LIBRARY_PATH环境变量,所以它不再是什么?


编辑:这是在OS X 10.11.1上。

+1

由Jason Molenda(他似乎是lldb开发人员之一)确认[此处](https://www.mail-archive.com/[email protected]/msg00779.html)。 –

回答

23

如果这是在El Capitan(OS X 10.11)上,那么它几乎肯定是系统完整性保护的副作用。从System Integrity Protection Guide: Runtime Protections文章:

当一个进程开始时,内核检查主要看 可执行文件是否受到保护磁盘上或与一个特殊的系统 授权签署。如果其中任何一个为真,那么将标记设置为表示其被保护以防修改。 ...

...任何动态连接器(dyld) 环境变量,如DYLD_LIBRARY_PATH,当 启动保护程序被清除。

/usr/bin中的所有内容都以此方式保护。因此,当调用/ usr/bin/lldb时,将清除所有DYLD_ *环境变量。

它应该从内部Xcode.app或命令行工具运行LLDB,就像这样:

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

我不相信LLDB的副本是受保护的。/usr/bin/lldb实际上只是一个在Xcode或命令行工具中执行版本的蹦床,所以你最终会运行同样的事情。但/ usr/bin/lldb受保护,所以在运行时会清除DYLD_ *环境变量。

否则,您必须在Greg Clayton所示的链接中设置lldb中的环境变量。或者,您可以禁用系统完整性保护,尽管它有很好的用途。

+0

是的,这是在OS X 10.11.1上。那很有意思。感谢您的明确解释! – Cornstalks

+2

谢谢。这也解决了我的问题(在El Capitan)。我已经创建了别名“alias lldb =/Applications/Xcode.app/Contents/Developer/usr/bin/lldb”来缓解打字。 –