Google Filament 渲染引擎分段错误

Posted

技术标签:

【中文标题】Google Filament 渲染引擎分段错误【英文标题】:Google Filament rendering engine segmentation fault 【发布时间】:2020-03-12 22:24:40 【问题描述】:

我正在尝试通过静态链接到适当的库来从 Filament 库编译示例应用程序“Suzanne”。示例应用程序和库都是从最新的源代码编译而来的。我正在用 clang++ 编译。

但是,当我编译并运行该应用程序时,我得到一个segmentation faultvalgrind 给出以下输出:

==31202== Process terminating with default action of signal 11 (SIGSEGV)
==31202==  Access not within mapped region at address 0x8
==31202==    at 0x46A485: size (__hash_table:809)
==31202==    by 0x46A485: bucket_count (__hash_table:1197)
==31202==    by 0x46A485: std::__1::__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, void*>*> std::__1::__hash_table<std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::__unordered_map_hasher<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::__unordered_map_equal<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >::find<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (__hash_table:2334)
==31202==    by 0x461CA7: find (unordered_map:1205)
==31202==    by 0x461CA7: image::KtxBundle::getMetadata(char const*, unsigned long*) const (KtxBundle.cpp:274)
==31202==    by 0x463D26: image::KtxBundle::getSphericalHarmonics(filament::math::details::TVec3<float>*) (KtxBundle.cpp:290)
==31202==    by 0x420E69: IBL::loadFromKtx(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (in /home/joel/Documents/KiwiTest/filament-suzanne/out/suzanne)
==31202==    by 0x42162D: IBL::loadFromDirectory(utils::Path const&) (in /home/joel/Documents/KiwiTest/filament-suzanne/out/suzanne)
==31202==    by 0x41A41C: FilamentApp::loadIBL(Config const&) (in /home/joel/Documents/KiwiTest/filament-suzanne/out/suzanne)
==31202==    by 0x415D19: FilamentApp::run(Config const&, std::__1::function<void (filament::Engine*, filament::View*, filament::Scene*)>, std::__1::function<void (filament::Engine*, filament::View*, filament::Scene*)>, std::__1::function<void (filament::Engine*, filament::View*)>, std::__1::function<void (filament::Engine*, filament::View*, filament::Scene*, filament::Renderer*)>, std::__1::function<void (filament::Engine*, filament::View*, filament::Scene*, filament::Renderer*)>, unsigned long, unsigned long) (in /home/joel/Documents/KiwiTest/filament-suzanne/out/suzanne)
==31202==    by 0x40A1D4: main (in /home/joel/Documents/KiwiTest/filament-suzanne/out/suzanne)
==31202==  If you believe this happened as a result of a stack
==31202==  overflow in your program's main thread (unlikely but
==31202==  possible), you can try to increase the size of the
==31202==  main thread stack using the --main-stacksize= flag.
==31202==  The main thread stack size used in this run was 8388608.

任何关于可能导致此问题的原因以及我可以做些什么来解决此问题的想法将不胜感激。

【问题讨论】:

您是否尝试过使用调试器单步执行代码以找到引发段错误的行?除非这是静态链接后出现的新问题,否则很可能是您的代码有问题 是的,我一定会尝试的。问题是,我只是使用 他们的 示例应用程序,它在与 cmake 一起构建整个源代码时编译文件。我不知道为什么静态链接应该改变什么?.. 有趣...这很奇怪...可能发生的事情是它包含了错误的标题,因此定义了错误的大小。您的计算机上是否有此应用的多个版本? 这很好,因为最初我使用的是较旧的预编译版本的库。我会看看是否检查... 成功了!谢谢!! 【参考方案1】:

错误已解决(由 TheGoldKnight23 提供):正在使用的头文件已过时。

【讨论】:

以上是关于Google Filament 渲染引擎分段错误的主要内容,如果未能解决你的问题,请参考以下文章

Win7 VS2017编译PBR渲染引擎google/filament

我的渲染技术进阶之旅Google开源的基于物理的实时渲染引擎Filament源码分析:Android版本的Filament第一个示例:sample-hello-triangle

我的渲染技术进阶之旅Google开源的基于物理的实时渲染引擎Filament源码分析:Android版本的Filament第一个示例:sample-hello-triangle

我的渲染技术进阶之旅Google开源的基于物理的实时渲染引擎Filament源码分析:在android中如何使用filament命令将.obj或者.fbx文件转换为.filamesh文件?

我的渲染技术进阶之旅基于Filament渲染引擎绘制一个不停旋转的彩色矩形

我的渲染技术进阶之旅基于Filament渲染引擎绘制一个不停旋转的彩色矩形