macos – 使用Quartz渲染时,Graphviz在Mac上崩溃

通过在Mac OS High Sierra上安装Graphviz并运行以下命令可以重现此问题:

dot -v -Tpng:quartz /path/to/graph.dot -o /path/to/out.png 

graph.dot必须包​​含以下(最小)图形结构才能重现该错误:

digraph {
 imgnode[image="/path/to/some-image.png", label=""];
}

如下面的tracelog所示,当dot尝试将图像加载到图形中时会引发错误.
当使用gvloadimage_quartz在生成的图形PNG中嵌入some-image.png时,错误发生在libgvplugin_quartz中:

源代码:
第130行的https://gitlab.com/graphviz/graphviz/blob/master/plugin/quartz/gvloadimage_quartz.c.

升级Graphviz,Quartz或Mac OS似乎没有任何影响,所以问题是:为什么会出现这个错误以及如何修复它?是由我造成的错误还是Graphviz或Mac OS中的错误?我似乎无法在网上找到任何解决方案,除了一段时间没有活动的错误报告:https://github.com/Homebrew/homebrew-core/issues/18684

Dot tracelog:

dot[11528:2474068] +[__NSCFConstantString length]: unrecognized selector sent to class 0x7fffa240c578
dot[11528:2474068] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[__NSCFConstantString length]: unrecognized selector sent to class 0x7fffa240c578'
*** First throw call stack:
(
 0   CoreFoundation                      0x00007fff4811200b __exceptionPreprocess + 171
 1   libobjc.A.dylib                     0x00007fff6ececc76 objc_exception_throw + 48
 2   CoreFoundation                      0x00007fff481aac14 +[NSObject(NSObject) doesNotRecognizeSelector:] + 132
 3   CoreFoundation                      0x00007fff480883f0 ___forwarding___ + 1456
 4   CoreFoundation                      0x00007fff48087db8 _CF_forwarding_prep_0 + 120
 5   CoreFoundation                      0x00007fff48025914 CFStringCompareWithOptionsAndLocale + 68
 6   ImageIO                             0x00007fff4a976ad0 _ZN17IIO_ReaderHandler15readerForUTTypeEPK10__CFString + 52
 7   ImageIO                             0x00007fff4a94ac94 _ZN14IIOImageSource14doBindToReaderEv + 434
 8   ImageIO                             0x00007fff4a94b30d _ZN14IIOImageSource18createImageAtIndexEmP13IIODictionary + 39
 9   ImageIO                             0x00007fff4a93906b CGImageSourceCreateImageAtIndex + 237
 10  libgvplugin_quartz.6.dylib          0x0000000108ef648b memory_data_consumer_get_byte_pointer + 699
 11  libgvc.6.dylib                      0x0000000108e26afa gvloadimage + 250
 12  libgvc.6.dylib                      0x0000000108e24e58 gvrender_usershape + 1080
 13  libgvc.6.dylib                      0x0000000108e4cd5a html_port + 4186
 14  libgvc.6.dylib                      0x0000000108e492cc emit_html_label + 524
 15  libgvc.6.dylib                      0x0000000108e50569 emit_label + 57
 16  libgvc.6.dylib                      0x0000000108e5f187 find_user_shape + 10151
 17  libgvc.6.dylib                      0x0000000108e3edda getObjId + 2778
 18  libgvc.6.dylib                      0x0000000108e435ae emit_graph + 3998
 19  libgvc.6.dylib                      0x0000000108e45a51 gvRenderJobs + 6673
 20  dot                                 0x0000000108e1dc95 dot + 11413
 21  libdyld.dylib                       0x00007fff6f8dc115 start + 1
 22  ???                                 0x0000000000000004 0x0 + 4
)
libc++abi.dylib: terminating with uncaught exception of type NSException
最佳答案
TL;博士:
您需要使用pango插件安装graphviz.

brew reinstall graphviz --with-pango

说明:
在带图像的图形中,graphviz / dot正在尝试使用pango插件.你可能已经安装了pango和它的libs,但是如果你这样做了,graphviz就不知道了.

你可以看看/usr/local/Cellar / graphviz /< version> / lib / graphviz / config6.如果您没有以下行,则graphviz没有启用pango:

libgvplugin_pango.6.dylib cairo {
    render {
        cairo 10
    }
    textlayout {
    textlayout 10
    }
    loadimage {
        png:cairo 1
        png:lasi 2
        png:ps 2
    }
    device {
        png:cairo 10
        ps:cairo -10
        pdf:cairo 10
        svg:cairo -10
    }
}

要检查graphviz是否有pango库:
ls -l /usr/local/Cellar/graphviz/2.40.1/lib/libgvplugin_pango*

如果你得到:

no matches found: /usr/local/Cellar/graphviz/2.40.1/lib/libgvpluhin_pango*

运行brew重新安装graphviz –with-pango以使用pango安装graphviz. Brew将为您设置一切.

如果graphviz已经有pango库,你可以将上面的行添加到你的config6文件中(即/usr/local/Cellar / graphviz /< version> / lib / graphviz / config6).

我实际上在3月12日提出了这个问题,因为我的同事遇到了同样的问题.以上所有内容都是我与我的经理一起调试此问题的原因,后者遇到了同样的问题.我没有这个问题,因为我严格使用MacPorts进行包管理,MacPorts默认包含pango.希望这可以帮助.

编辑:bug report mentioned in the question提供相同的解决方案.

转载注明原文:macos – 使用Quartz渲染时,Graphviz在Mac上崩溃 - 代码日志