Xcode 断点 shell 命令参数长度

Xcode breakpoint shell command argument length

尝试使用 Xcode

中的断点将大字符串传递给 shell 脚本
let value = Array(repeating: "a", count: 1500).joined()
let string = "{\"key\": \"\(value)\"}"

很遗憾,字符串被截断了。这个限制是否记录在案并且可以克服吗?

你问这个问题已经将近一年了,我不确定它是否能解决你的问题,但我最近遇到了类似的问题所以我想分享我的解决方案。

我有两个问题:

  1. LLDB 将我的 shell 脚本的所有参数(以及使用 po foo 在控制台中打印的字符串变量)截断为 1023 个字符。我相信这就是您的问题所涉及的问题。
  2. Xcode 错误地将我的字符串中的逗号 , 混淆为多个参数的分隔符(例如传递 foobarbaz因为如果任何变量包含 ,,脚本的参数将无法正常工作,因为 Xcode 会尝试创建另一个参数)。

所以,首先,LLDB 问题...

似乎默认情况下 LLDB 将打印到控制台(或通过断点参数传递给 shell 脚本)的字符长度限制为大约 1023 个字符。您可以通过在控制台中设置另一个断点 before 使用您的变量的断点和 运行 (lldb) set set target.max-string-summary-length 10000 来轻松地将其更改为更大的值。这可能有点烦人,所以我创建了一个 ~/.lldbinit 文件并将 set set target.max-string-summary-length 10000 放在那里,这样我就不必在控制台中继续设置它。

其次,逗号问题...

在您提供以上屏幕截图的 Edit breakpoint... 菜单中,有一个选项不仅可以提供脚本路径,还可以提供参数。我从你的问题中可以看出你提供了参数@string@。对于我的脚本,我传递了多个参数,Xcode 允许您使用逗号分隔的列表,例如@foo@, @bar@, @baz@。这些参数中的每一个都是一个字符串。

我注意到有时一个或多个字符串如果包含逗号会被截断:,

所以字符串:

{ "num_friends" : "7" }

将按预期传递到我的脚本。但是字符串:

{ "num_friends" : "7", "num_deleted_friends" : "1" }

会截断并且 会作为两个单独的参数 传递到我的脚本。似乎 Xcode 会用 , 拆分任何字符串,即使在使用 @string@ 输入时也是如此。

我在我的脚本中通过简单地使用类似的东西验证了这一点:

for var in "$@"
do
    echo "$var"
    echo "===="
done

其中 $@ 展开以包含每个参数。从这里我可以看到 @string@ 被正确地传递到我的脚本,但在有 , 的地方被分隔为多个参数。因此,如果 @string@ 包含一个逗号,我的脚本将打印:

@"{ \"num_friends\" : \"7\"
====
\"num_deleted_friends\" : \"1\" }"

而不是我预期的是:

@"{ \"num_friends\" : \"7\", \"num_deleted_friends\" : \"1\" }"

所以这似乎是 Xcode 如何在断点编辑器 window 中的 @ 表达式中传递字符串的错误。

我粗略的解决方案是用另一个字符替换任何逗号,然后在我的脚本中再次替换它们。可能有更好的方法来执行此操作,但我不需要它来满足我的需要。