xcode 为什么lldb不再转发我的环境变量了?

evrscar2  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(100)

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

编辑:这是在OS X 10. 11. 1上。

hpxqektj

hpxqektj1#

如果这是在El Capitan(OS X 10.11)上,那么几乎可以肯定这是系统完整性保护的副作用。
当一个进程启动时,内核会检查主可执行文件是否在磁盘上受到保护,或者是否有特殊的系统授权签名。如果有一个是真的,则会设置一个标志来表示它受到保护,不能被修改。
...启动受保护进程时,任何动态链接器(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

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

xxb16uws

xxb16uws2#

一旦启动lldb,就可以在其中设置环境变量。

$ lldb
(lldb) help env
Shorthand for viewing and setting environment variables.  Expects 'raw' input (see 'help raw-input'.)

Syntax: 
_regexp-env                  // Show environment
_regexp-env <name>=<value>   // Set an environment variable

'env' is an abbreviation for '_regexp-env'
(lldb)

所以

lldb ./a.out
(lldb) env DYLD_LIBRARY_PATH=/path/to/lib/dir
(lldb) r

应该可以用。测试了

$ lldb --version
lldb-1400.0.38.17
Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51)

相关问题