提问人:Kwnstantinos Nikoloutsos 提问时间:7/19/2023 最后编辑:Kwnstantinos Nikoloutsos 更新时间:7/19/2023 访问量:41
LLDB 表达式命令,当附加到其他进程时,print 在控制台中不显示任何内容
LLDB expression command with print not showing anything in console when attached on other process
问:
作为开发人员,我希望能够使用 LLDB 命令。
在我的应用程序中,我有 NotificationServiceExtension 进程,该进程正在处理推送通知的呈现。我正在使用 XCode > Debug 将 LLDB 附加到 NotificationService 进程。expression print(..)
问题是,在NotificationService进程上设置断点并尝试使用以下命令时,我得到:
(lldb) expr print("foo")
() $R12 = {}
当我从我的应用程序进程执行时:
(lldb) expr print("foo")
foo
() $R0 = {}
我错过了什么吗?因此,我无法使用此自定义命令来打印 apns 有效负载。
command regex poj 's/(.+)/expr print(NSString(string: String(data: try! JSONSerialization.data(withJSONObject: %1, options: [.prettyPrinted, .sortedKeys]), encoding: .utf8)!))/'
答:
1赞
Jim Ingham
7/19/2023
#1
表达式赋值器运行您提供给它的代码,“就好像它在停止点已在应用程序中编译一样”。因此,当您运行时:
(lldb) expr print("something\n")
这将进入程序的 stdout,就像在代码中一样。如果要附加到程序,则 stdout 已设置为某个位置,但对于 NotificationService,stdout 很可能是 /dev/null。
但我不明白为什么你需要把它打印到调试对象的标准输出中。如果运行表达式:
(lldb) expr NSString(string: String(data: try! JSONSerialization.data(withJSONObject: %1, options: [.prettyPrinted, .sortedKeys]), encoding: .utf8)!)
结果将是该字符串,它会将内容打印到调试控制台,以便您可以查看它。它还将在“result”变量(即 expr 返回值中的 $R 0)中捕获,您可以使用该变量再次将字符串打印到调试控制台,使用:
(lldb) expr $R0
评论
0赞
Kwnstantinos Nikoloutsos
7/19/2023
我想使用 print() 的原因是,如果我不这样做,输出将包含“\n”字符,并且与使用 print 相比可读性不高。
0赞
Jim Ingham
7/20/2023
您可以编写一个基于 Python 的 lldb 命令来运行表达式,获取生成的字符串,并将换行符之间的位逐个打印到命令结果中。
0赞
Jim Ingham
7/20/2023
当我们向你展示一个字符串时,我们会向你展示用编程语言编写的字符串,因为这是你在代码中编写的内容。但是,如果有一种打印模式可以进行一些最小的渲染(\n 和 \t 主要是......仅仅调用并不是一个好的通用解决方案,因为某些随机字符串可能具有看起来像变量替换的片段,这将导致打印失败。--render
print
评论