gpt4 book ai didi

opengl - Valgrind:libnvidia-glcore.so.346.47 条件跳转或移动取决于未初始化的值

转载 作者:行者123 更新时间:2023-12-01 02:08:13 25 4
gpt4 key购买 nike

当针对我的动态库运行我的测试 c++ 应用程序时,我的动态库与 NVIDIA 的 libGL.so 链接。所以我收到了 Valgrind 报告的以下错误(见下文)。我很想压制它们,但我不确定这是我的问题还是 libnvidia-glcore.so 的问题。部分不确定性源于不完全理解 Valgrind 的输出。我已经在调用 glXCreateContextAttribsARB 时查看了我的代码中哪些变量可能未初始化。但我在那里看不到任何东西。如果它从输出显示到我的问题,我在寻找什么类型的东西?我得到的两个错误是:

==10156== Conditional jump or move depends on uninitialised value(s)
==10156== at 0x7E4CAF4: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7DEE0CD: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7DEEADC: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F75DA1: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F775D3: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7E279BE: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7E27D21: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F760F5: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F3E353: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7A8C9C0: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x4E535F2: opengl_core::render_system::init() (x11_render_system.cpp:92)
==10156== by 0x4040D8: test_render_system::run() (test_x11_render_system.cpp:10)
==10156== Uninitialised value was created by a heap allocation
==10156== at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==10156== by 0x5116428: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x7EECF2E: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7E479C1: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7DC8C31: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x50BF331: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x50EB72A: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x50EEA87: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x50E47D2: glXCreateContextAttribsARB (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x4E52EF8: opengl_core::render_context::init(opengl_core::render_window&, opengl_core::fb_config&) (x11_render_context.cpp:120)
==10156== by 0x4E534D0: opengl_core::render_system::init() (x11_render_system.cpp:65)
==10156== by 0x4040D8: test_render_system::run() (test_x11_render_system.cpp:10)
==10156==
==10156== Conditional jump or move depends on uninitialised value(s)
==10156== at 0x7E4CAF4: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7DEE0CD: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7DF085F: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F4B78B: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F4CFBC: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7E279BE: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7E27D21: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F4BFE0: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F38ED5: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7B20F52: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7F3E2CB: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7A8C9C0: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== Uninitialised value was created by a heap allocation
==10156== at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==10156== by 0x5116428: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x7EECF2E: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7E479C1: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x7DC8C31: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156== by 0x50BF331: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x50EB72A: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x50EEA87: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x50E47D2: glXCreateContextAttribsARB (in /usr/lib64/nvidia/libGL.so.346.47)
==10156== by 0x4E52EF8: opengl_core::render_context::init(opengl_core::render_window&, opengl_core::fb_config&) (x11_render_context.cpp:120)
==10156== by 0x4E534D0: opengl_core::render_system::init() (x11_render_system.cpp:65)
==10156== by 0x4040D8: test_render_system::run() (test_x11_render_system.cpp:10)
==10156==

按要求:
 // src/x11_render_system.cpp
91 m_impl->m_context.make_current(m_impl->m_window);
92 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
93 glClearColor(1.0, 0.0, 0.0, 1.0);
94 glXSwapBuffers(display, window);
95 m_impl->m_context.make_not_current();

最佳答案

由于关键硬件驱动程序(例如 GPU 驱动程序)的工作方式,Valgrind 很容易误报。基本上,这些驱动程序通过由 BIOS 设置的用户空间(虚拟 RAM)访问 GPU 的内存(甚至 寄存器 )(这是工作中的 POSIX mmap)。这样,驱动程序可以通过任意地址访问设备的寄存器,就像任何其他变量一样。

关键是某些设备的寄存器仅用于读取。例如,它们可以反射(reflect)设备的某些状态。因此,只有设备才有理由写入它们(即使 CPU 尝试这样做,它也会失败)。大多数情况下,它在上电时在内部执行此操作,并且不时在状态更改时执行此操作,并在设置映射时反射(reflect)到用户空间。本质上,这些是纯粹的易变变量……甚至比通常的线程到线程概念更易变,顺便说一下,Valgrind 很好地处理了它,因为它模拟了 CPU。

但是 Valgrind 生活在一个确定性的世界(CPU 和 RAM),而这些 GPU 的寄存器完全不属于这个世界。当驱动程序读取它们时,Valgrind 只是认为它正在访问 RAM(由于 mmap),这绝对不是真的。因此,当驱动程序使用读取的数据(某些设备状态)进行相应的分支时,Valgrind 报告说,因为它的世界中没有任何东西写过这些数据。

老实说:专有驱动程序不是开源的,所以很难猜测到底发生了什么,但很可能是类似的。我可以肯定的是,这种情况发生在 Valgrind 和 GPU 驱动程序上(即使是非常小的程序),主要是在初始化期间,每个人都同意这些是误报。因此,您可以放心地忽略它...或在您的项目中为 Valgrind 创建一个抑制文件(让我们将其命名为 valgrind.supp):

{
NVidia-driver
Memcheck:Cond
obj:/usr/lib64/nvidia/libnvidia-glcore.so.346.47
}

然后您使用选项 --suppressions=valgrind.supp 调用 Valgrind,它将不再报告这些误报。

您可能有与此相关的其他驱动程序对象,只需为它们添加条目(您必须重复整个 {...} 并修改对象行以匹配 Valgrind 报告的内容)。由于版本更改,您可能还需要在每次更新驱动程序时更新它们,但我想您可以使用基本的通配符来避免这种情况。

看看 here有关此 Valgrind 功能的更多信息。

关于opengl - Valgrind:libnvidia-glcore.so.346.47 条件跳转或移动取决于未初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com