Valgrind:libnvidia

编程入门 行业动态 更新时间:2024-10-27 22:32:32
Valgrind:libnvidia-glcore.so.346.47条件跳转或移动取决于未初始化的值(Valgrind: libnvidia-glcore.so.346.47 Conditional jump or move depends on uninitialised value)

当我的动态库运行我的测试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();

When running my test c++ app against my dynamic library which links against NVIDIA's libGL.so I am getting the following errors (see below) reported by Valgrind. I am tempted to suppress them, but I am not sure if this is my issue or something libnvidia-glcore.so has. Part of the unsurety stems form not fully understanding Valgrind's output. I have looked into what variables might be uninitialized in my code in the call to glXCreateContextAttribsARB but I do not see any there. If it appears from the output to by my issue what types of things am I looking for? The two errors I am getting are:

==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==

As per request:

// 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();

最满意答案

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

关键是某些设备的寄存器只能被读取。 例如,它们可以反映设备的某些状态。 因此,只有设备有理由写它们(即使CPU试图这样做,它也会失败)。 大多数情况下,它在内部加电时会发生这种情况,并且在状态发生变化时会不时发生,并且在设置映射时会反映到用户空间。 从本质上讲,这些是纯粹的volatile变量...比通常的线程更易于传递它的线程概念,顺便说一下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报告的内容)。 您可能还需要在每次更新驱动程序时更新它们,因为版本更改,但我想您可以使用基本通配符来避免这种情况。

在这里查看有关Valgrind功能的更多信息。

Valgrind is quite prone to false positive with critical hardware drivers (such as GPU drivers) due to the way they work. Basically, these drivers access the GPU's memory (and even registers) through user space (virtual RAM) which is setup by the BIOS (this is POSIX mmap at work). This way, the driver can access device's registers through arbitrary addresses, like any other variable.

The point is that some device's registers are only meant to be read. For example, they could reflect some status of the device. Thus, only the device have a reason to write them (and even if the CPU tried to do this, it would fail). Most of the time, it does so internally at power up, and from time to time when status change, and it reflects to user space when mapping is setup. In essence, these are pure volatile variables... even more volatile than the usual thread to thread conception of it, which by the way is well handled by Valgrind since it emulates CPU.

But Valgrind lives in a determinist world (CPU and RAM) and these GPU's registers are completely out of this world. When the driver read them, Valgrind simply think it is accessing RAM (due to mmap), which is definitely not true. Thus, at the point the driver use the read data (some device status) to branch accordingly, Valgrind reports because nothing in its world ever wrote this data.

Let's be honest: proprietary drivers are not open-source, so it's hard to guess what is really happening, but it is likely something similar. What I can tell for sure is that this is happening with Valgrind and GPU drivers since ages (even with very small programs), mainly during initializations and everybody agrees these are false positives. Thus, you can safely ignore it... or create a suppression file for Valgrind in your project (let's name it valgrind.supp):

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

Then you call Valgrind with the option --suppressions=valgrind.supp and it will no longer report these false positive.

You may have other driver objects related to this, just add entries for them (you'll have to repeat the whole {...} and modify the object line to match what Valgrind reports). You may also have to update them everytime you update your driver since the version changes, though I guess you can use basic wildcards to avoid this.

Take a look here for more infos on this Valgrind feature.

更多推荐

本文发布于:2023-07-22 20:45:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1223285.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Valgrind   libnvidia

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!