Xcode 断点 shell 命令参数长度
Xcode breakpoint shell command argument length
尝试使用 Xcode
中的断点将大字符串传递给 shell 脚本
let value = Array(repeating: "a", count: 1500).joined()
let string = "{\"key\": \"\(value)\"}"
很遗憾,字符串被截断了。这个限制是否记录在案并且可以克服吗?
你问这个问题已经将近一年了,我不确定它是否能解决你的问题,但我最近遇到了类似的问题所以我想分享我的解决方案。
我有两个问题:
- LLDB 将我的 shell 脚本的所有参数(以及使用
po foo
在控制台中打印的字符串变量)截断为 1023 个字符。我相信这就是您的问题所涉及的问题。
- Xcode 错误地将我的字符串中的逗号
,
混淆为多个参数的分隔符(例如传递 foo
、bar
和 baz
因为如果任何变量包含 ,
,脚本的参数将无法正常工作,因为 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 中的 @
表达式中传递字符串的错误。
我粗略的解决方案是用另一个字符替换任何逗号,然后在我的脚本中再次替换它们。可能有更好的方法来执行此操作,但我不需要它来满足我的需要。
尝试使用 Xcode
中的断点将大字符串传递给 shell 脚本let value = Array(repeating: "a", count: 1500).joined()
let string = "{\"key\": \"\(value)\"}"
很遗憾,字符串被截断了。这个限制是否记录在案并且可以克服吗?
你问这个问题已经将近一年了,我不确定它是否能解决你的问题,但我最近遇到了类似的问题所以我想分享我的解决方案。
我有两个问题:
- LLDB 将我的 shell 脚本的所有参数(以及使用
po foo
在控制台中打印的字符串变量)截断为 1023 个字符。我相信这就是您的问题所涉及的问题。 - Xcode 错误地将我的字符串中的逗号
,
混淆为多个参数的分隔符(例如传递foo
、bar
和baz
因为如果任何变量包含,
,脚本的参数将无法正常工作,因为 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 中的 @
表达式中传递字符串的错误。
我粗略的解决方案是用另一个字符替换任何逗号,然后在我的脚本中再次替换它们。可能有更好的方法来执行此操作,但我不需要它来满足我的需要。