【问题标题】:Why doesn't lldb forward my environment variable anymore?为什么 lldb 不再转发我的环境变量?
【发布时间】:2016-02-08 19:12:51
【问题描述】:

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


这是我的 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 中的一个新错误(或者我完全疯了,这从来没有用过)?我很肯定 lldb 用于转发 DYLD_LIBRARY_PATH 环境变量,那它为什么不再呢?


编辑:这是在 OS X 10.11.1 上。

【问题讨论】:

  • 由 Jason Molenda(似乎是 lldb 开发人员之一)确认 here

标签: c xcode lldb


【解决方案1】:

如果这是在 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_* 环境变量。

否则,您将不得不在 lldb 中设置环境变量,如图所示 in this thread:

(lldb) process launch --environment DYLD_LIBRARY_PATH=<mydylibpath> -- arg1 arg2 arg3

或使用简短的 -v 选项:

(lldb) process launch -v DYLD_LIBRARY_PATH=<mydylibpath> -- arg1 arg2 arg3

或者,您可以禁用系统完整性保护,尽管它有很好的用途。

【讨论】:

  • 是的,这是在 OS X 10.11.1 上。那很有意思。感谢您的明确解释!
  • 谢谢。这也解决了我的问题(在 El Capitan 上)。我创建了一个别名alias lldb=/Applications/Xcode.app/Contents/Developer/usr/bin/lldb 来减轻打字负担。
  • 但我已禁用 sip,但我仍然遇到此问题。诡异的。该死的,我应该设置 gdb,我猜这是另一个废话
  • @MuhsinFatih 使用其他技术之一调用 lldb 是否有效?
  • 无论出于何种原因,在 lldb-1001.0.12.1/macOS 10.14.5 上设置环境变量 process launch -v 对我都不起作用。相反,我必须在启动进程之前通过env 明确设置环境。然后就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2022-01-27
  • 2019-06-19
  • 1970-01-01
相关资源
最近更新 更多