Xcode 使用Chromium嵌入式框架的MacOS Mojave上引发崩溃的AddressSanitarizer

Xcode 使用Chromium嵌入式框架的MacOS Mojave上引发崩溃的AddressSanitarizer,xcode,macos,chromium-embedded,address-sanitizer,Xcode,Macos,Chromium Embedded,Address Sanitizer,我正在尝试使用ASan调试我的插件(动态库)的代码,该插件运行在一个使用Juce和Chromium Embedded Framework(CEF)的大型第三方主机应用程序中。 它在MacOS 10.11(El Capitan)和XCode 8上运行良好,但在MacOS 10.14(Mojave)和XCode 9或11的新MacBook上,同样的应用程序首先以EXC\u断点(code=EXC\u I386\u BPT,subcode=0x0)停止然后以EXC\u BAD\u指令(code=EXC\

我正在尝试使用ASan调试我的插件(动态库)的代码,该插件运行在一个使用Juce和Chromium Embedded Framework(CEF)的大型第三方主机应用程序中。 它在MacOS 10.11(El Capitan)和XCode 8上运行良好,但在MacOS 10.14(Mojave)和XCode 9或11的新MacBook上,同样的应用程序首先以
EXC\u断点(code=EXC\u I386\u BPT,subcode=0x0)停止
然后以
EXC\u BAD\u指令(code=EXC\u I386\u INVOP,subcode=0x0)崩溃

  * frame #0: 0x000000011768fe78 Chromium Embedded Framework`___lldb_unnamed_symbol167560$$Chromium Embedded Framework + 88
    frame #1: 0x000000011768fba5 Chromium Embedded Framework`___lldb_unnamed_symbol167550$$Chromium Embedded Framework + 37
    frame #2: 0x00007fff5c522c99 libsystem_malloc.dylib`malloc_zone_malloc + 103
    frame #3: 0x00007fff5c524191 libsystem_malloc.dylib`malloc_set_zone_name + 84
    frame #4: 0x00000001011d9d2d libclang_rt.asan_osx_dynamic.dylib`wrap_malloc_set_zone_name + 173
    frame #5: 0x0000000102002f1b libdispatch.dylib`_dispatch_client_callout + 8
    frame #6: 0x0000000102004ba9 libdispatch.dylib`_dispatch_once_callout + 87
    frame #7: 0x00007fff3ae6132d QuartzCore`get_malloc_zone(unsigned long) + 43
    frame #8: 0x00007fff3ae6157a QuartzCore`CA::Transaction::set_disable_actions(bool) + 44
    frame #9: 0x00007fff2da3f5a0 AppKit`-[NSView _updateLayerBackedness] + 414
    frame #10: 0x00007fff2da2555e AppKit`-[NSView didChangeValueForKey:] + 65
    frame #11: 0x00000001007e6550 Max`juce::NSViewComponentPeer::NSViewComponentPeer(juce::Component&, int, NSView*) + 640
    frame #12: 0x00000001007e62a2 Max`juce::Component::createNewPeer(int, void*) + 50
在这里,我甚至不知道问题是出在MacOS、ASan、CEF、Juce还是主机应用程序上。
我还试图通过ASan的抑制列表来避免截取上面的函数,但从未让它起作用。非常感谢

默认情况下,Mac上的Chromium构建启用了分配器垫片,这会覆盖malloc区域并导致ASAN出现问题。要禁用它,您必须使用GN选项
使用\u分配器\u shim=false从源生成


或者,您可以使用
is_asan=true
选项构建Chromium以启用asan。

默认情况下,Mac上的Chromium构建已启用分配器垫片,这会覆盖malloc区域并导致asan出现问题。要禁用它,您必须使用GN选项
使用\u分配器\u shim=false从源生成


或者,您可以使用
is_asan=true
选项构建Chromium以启用asan。

谢谢您的提示!我担心Chromium是第三方应用程序(防拷贝)的一部分,所以我不确定如何让它使用自建Chromium(可能是通过DYLD_INSERT_库)?@diemo如果他们使用从下载的默认CEF二进制文件,那么您可以从禁用分配器填充或启用asan的源代码生成相同的CEF版本,并替换该第三方应用程序中的二进制文件。CEF dll库中嵌入了一个版本号信息,这样您就可以检查它使用的是哪个提交,这样您就可以构建完全相同的版本。嗯,otool报告的是801.0.2版本,而CEF的官方版本是86
@executable\u path/。/Frameworks/Chromium embedded Framework.Framework/Chromium embedded Framework(兼容性版本801.0.2,当前版本801.0.2)
另一个谜团是,同一个第三方应用程序,内部有相同的CEF,可以在MacOS 10.11上运行。dylib版本
801.0.2
转换为CEF版本
80.1.2
。您可以在这里找到它:(应用版本过滤器,查看底部的所有版本)。谢谢你的提示!我担心Chromium是(受拷贝保护的)第三方应用程序的一部分,所以我不确定如何使用自建Chromium(可能通过DYLD_INSERT_库)?@diemo如果他们使用从下载的默认CEF二进制文件,那么您可以从源代码中创建相同的CEF版本,禁用分配器填充或启用asan,并替换该第三方应用程序中的二进制文件。CEF dll库中嵌入了版本号信息,以便您可以检查它使用的确切提交,从而可以生成完全相同的版本。嗯,otool报告了801.0.2版,而官方cef位于86
@executable_path/。/Frameworks/Chromium Embedded Framework.Framework/Chromium Embedded Framework(兼容版本801.0.2,当前版本801.0.2)
另一个谜团是,相同的第三方应用程序,内部有相同的CEF,可以在MacOS 10.11上运行。dylib版本
801.0.2
转换为CEF版本
80.1.2
。您可以在这里找到它:(应用的版本过滤器,查看底部的所有版本)。