如何记录在Xcode中显示为运行时问题的警告?

Rob*_*b N 22 xcode ios ios11 xcode9

Xcode 8或9开始显示运行时问题.您会在窗口顶部看到一个紫色图标,并在Issue Navigator中看到一个列表,旁边是构建时间问题,如编译警告和错误.

在此输入图像描述

在此输入图像描述

我见过的运行时问题是由系统库创建的.有没有办法让我自己的应用程序代码生成这些?

saa*_*jha 5

是的!如果您执行消毒程序捕获的操作(例如启用了 Thread Sanitizer 的后台线程执行某些 UI 操作),您就会看到这些内容。布局不明确并在视图调试器中暂停也是导致这种情况发生的一种方法。不管怎样,在苹果的库中看到这种情况发生并不是一件好事\xe2\x80\xa6

\n\n

更新:我研究了这些警告是如何被击中的,LLDB 本质上是在 Sanitizer 动态库内的一组魔术函数(、、、、)上设置了一个断点,这些函数在问题发生时被__asan::AsanDie()调用__tsan_on_report。如果您定义这些函数的您自己的版本并调用它们,您将收到显示的警告。首先,在项目中的某个位置创建符号:__ubsan_on_report__main_thread_checker_on_report

\n\n
void __main_thread_checker_on_report(char *message) {\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您可以随意触发它,只需将此代码放在应用程序中的任何位置即可(您可能希望将其隐藏在宏后面):

\n\n
((void (*)(char *))dlsym(dlopen(NULL, RTLD_LAZY), "__main_thread_checker_on_report")))("This will show up as a warning")\n
Run Code Online (Sandbox Code Playgroud)\n\n

不用说,如果您选择使用它,这几乎肯定不会与实际的消毒剂很好地配合。您可能应该根据您是否使用消毒剂有条件地编译上述内容。

\n

  • 我认为,问题的重点是能够随意“手动”生成自定义运行时问题。 (7认同)