问题标签 [memcheck]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1058 浏览

c - Nvidia CUDA - 通过指针传递结构

我在将指向结构的指针传递给设备函数时遇到问题。我想在本地内存中创建一个结构(我知道它很慢,这只是一个例子)并通过指针将它传递给另一个函数。问题是当我使用 memcheck 调试它时,我得到错误:

Program received signal CUDA_EXCEPTION_1, Lane Illegal Address. Switching focus to CUDA kernel 0, grid 1, block (0,0,0), thread (0,0,0), device 0, sm 7, warp 0, lane 0 0x0000000000977608 in foo (st=0x3fffc38) at test.cu:15 15 st->m_tx = 99;

如果我在没有 memcheck 的情况下调试它,它工作正常并给出预期的结果。我的操作系统是 RedHat 6.3 64 位内核 2.6.32-220。我使用 GTX680、CUDA 5.0 并使用 sm=30 编译程序。

我用于测试的代码如下:

有什么建议么?谢谢你的帮助。

0 投票
1 回答
479 浏览

c++ - Qt 内存错误 - 需要 valgrind 跟踪分析帮助

您有任何理论如何调试这种可能有问题的内存访问模式吗?我有预感它可能与我正在经历的某个海森错误有关,但我似乎无法确定它。

这是在 valgrind 下运行的调试构建的片段,带有--track-origins=yes,--leak-check=full

我怎么会滥用 Qt 的 Gui lib,以便它以下列方式表现出来?

0 投票
2 回答
204 浏览

c++ - 如何防止 Valgrind 为每个新线程启动嵌入式 gdbservers?

我在一个产生数千个其他线程的程序上运行 valgrind memcheck。

其他线程不会产生错误,我不在乎它们会发生什么。

然而,Valgrind 坚持每次产生新线程时都在 /tmp 中打开一个命名管道。这不仅浪费,而且实际上破坏了 valgrind。有时 valgrind 不会自行清理,然后具有相同 pid(稍后活动)的未来子代无法生成,因为 valgrind 无法创建具有正确名称的管道(它已经存在)。

我怎样才能阻止 Valgrind 制造所有这些管道!?!

编辑:我已经尝试过的标志:

--child-silent-after-fork=是

以及我已经排除的事情:

--track-children=no(默认值为 no)。

0 投票
1 回答
2987 浏览

valgrind - 运行许多同时的 valgrind 进程时导致 mkstemp 失败的原因是什么?

我正在用 valgrind 测试一些软件。理想情况下,我希望一次打开 20 个或更多 valgrind 实例。但是,如果我并行运行超过 16 个实例,我会开始收到如下消息:

一些进程(可能是其中的 1/3)反而因错误而终止

运行这些调用时,不会在 /tmp 中创建任何文件,但我使用的用户帐户确实具有 /tmp 的读取、写入和执行权限。

我在网上找不到有关此错误的任何信息,但也许这里的某个地方对此有所了解?

编辑:一些进一步的实验表明,事实上,一次最多可以同时运行 5 个进程。

0 投票
2 回答
2561 浏览

cuda - CUDA 竞赛检查、共享内存数组和 cudaDeviceSynchronize()

我最近发现了CUDA 5.0 中可用的cuda-memcheck竞赛检查工具(参见NVIDIA 文档)。该工具可以检测 CUDA 内核中共享内存的竞争条件。cuda-memcheck --tool racecheck

在调试模式下,这个工具没有检测到任何东西,这显然是正常的。但是,在发布模式 (-O3) 中,我会根据问题的参数得到错误。

这是一个错误示例(第 22 行共享内存的初始化,第 119 行的赋值):

========= 错误:在块 (35, 0, 0) 中的共享0x0处检测到潜在的 WAW 危害:========== 在 0x00000890 处写入线程 (32, 0, 0)。 ...h:119:void kernel_test3(Data*) ========= 在 ....h:22:void kernel_test3(Data*)
==的 0x00000048 处写入线程 (0, 0, 0) ======= 当前值:13,传入值:0

  1. 让我惊讶的第一件事是线程ID。当我第一次遇到错误时,每个块包含 32 个线程(ids 0 到 31)。那么为什么线程 id 32 有问题呢?我什至在 上添加了一个额外的检查threadIdx.x,但这并没有改变。
  2. 我使用共享内存作为临时缓冲区,每个线程处理自己的多维数组参数,例如__shared__ float arr[SIZE_1][SIZE_2][NB_THREADS_PER_BLOCK]. 我真的不明白怎么会有任何竞争条件,因为每个线程都处理自己的共享内存部分。
  3. 将网格大小从 64 个块减少到 32 个块似乎解决了这个问题(每个块有 32 个线程)。我不明白为什么。

为了了解发生了什么,我用一些更简单的内核进行了测试。让我向您展示一个产生这种错误的内核示例。基本上,这个内核使用SIZE_X*SIZE_Y*NTHREADS*sizeof(float)B 的共享内存,我每个 SM 可以使用 48KB 的共享内存。

测试.cu

编译

nvcc test.cu --ptxas-options=-v -o test

如果我们运行内核

cuda-memcheck --tool racecheck test

  • kernel_test<32><<<32, 32>>>();: 32 个块,32 个线程 => 不会导致任何明显的竞态检查错误。
  • kernel_test<32><<<64, 32>>>();:64 个块,32 个线程 => 导致 WAW 危害(threadId.x = 32?!)和错误。

========= 错误:在块 (57, 0, 0) 中的共享0x6处检测到潜在的 WAW 危害:
========== 在 0x00000048 处写入线程 (0, 0, 0)。 ...h:403:void kernel_test(void)
========= 在 ....h:403:void kernel_test(void)
====的 0x00000048 处写入线程 (1, 0, 0) ===== 当前值:0,传入值:128

========= 信息:(正在写入相同的数据)在块(47、0、0)中的共享0x0 处检测到潜在的 WAW 危害:
========= 写入线程(32、0、 0) at 0x00000048 in ....h:403:void kernel_test(void)
========= 在 ....h:403:void kernel_test( void)
========= 当前值:0,传入值:0

那么我在这里错过了什么?我在共享内存方面做错了吗?(我仍然是这个的初学者)

** 更新 **

问题似乎来自cudaDeviceSynchronize()when NBLOCKS > 32。为什么会这样?

0 投票
1 回答
1152 浏览

c - 无效的写入大小:memset

valgrind 说在 memset(“###” - 标记行)处写入大小为 1 的无效。请帮助找出这里出了什么问题。在 valgrind 输出的“地址 0x0 不是堆栈,也不是 malloc'd 或 free'd”之后,我可以排除 strtok 负责。这大概是显而易见的……

0 投票
3 回答
22178 浏览

c - 分析 valgrind 输出:“invalid free()”

valgrind 在一个(愚蠢的)身份验证模块上发现了这个奇怪的错误,该模块在堆分配上产生了一些问题。

据我了解,他说我在第 109-110-111 行做了三个无效的 free()。错误应该是我尝试释放比实际分配更多的空间,但我无法决定释放多少空间。我也不明白为什么它指的是第 108 行(这也是一个 free())。

这是来自文档(无效免费):

Memcheck 使用 malloc/new 跟踪程序分配的块,因此它可以准确地知道 free/delete 的参数是否合法。在这里,这个测试程序两次释放了同一个块。与非法读/写错误一样,Memcheck 尝试理解释放的地址。如果像这里一样,地址是以前被释放的地址,你会被告知——使同一块的重复释放很容易被发现。

如果您尝试释放一个不指向堆块开头的指针,您也会收到此消息。

我真的无法想象在其中一种情况下会怎样。

头文件:

0 投票
1 回答
76 浏览

linux - 在 Valgrind/DrMemory 中记录程序状态然后恢复它是否可行?

我有一个在启动时加载大量数据的程序。这会占用相当长的时间,因此在运行Valgrind( memcheck) / DrMemory时会产生开销。所以当用不同的参数多次调用程序时,会占用相当多的时间

我的想法是fork()在数据加载阶段之后立即使用,然后将孩子交给 Valgrind/DrMemory。即使加载阶段在 Valgrind/DrMemory 下运行,开销也只会发生一次,并且所有forked 子进程应该能够从那里使用预加载的数据。

记录程序状态并将其声明为未污染,然后在 Valgrind ( memcheck) 或 DrMemory 中恢复该状态是否可行?

注意:我只对 unixoid 平台感兴趣,将其限制在 Linux 上也可以。

0 投票
0 回答
6071 浏览

c++ - Valgrind 抱怨字节在 std::string 构造函数中丢失

我是 valgrind 的新手,所以这可能会误解输出。Valgrind 似乎认为字节在以下几行中丢失:

事实上,每次以这种方式构造 std::string 时它都会抱怨^^。我无法弄清楚这是否是误报,我复制的方式是否不正确,或者结果是否以某种方式泄露。

有趣的是,它抱怨另一段不使用 mysql++ 的代码,但再次使用了字符串构造函数:

正在构建和推回字符串的线可能会丢失。然后给出 malloc、operator new、std::string 等的详细输出。

从 std::istringstream 复制字符串时,同样的故事再次出现:

这些是误报吗?它与使用 C++0x 有关吗?还是那些可能来自我尚未检测到泄漏的地方的合法泄漏?

编辑

以下是重复出现的 valgrind 警告的示例:

它们几乎都是相同的,唯一的区别是代码中的实际行(即:字符串构造函数行)。

第二种警告是:

这似乎与上面提到的 std::istringstream 代码有关。

0 投票
1 回答
138 浏览

linux - Valgrind 不会检测到明显的错误

我正在从 Zed Shaw 的优秀Learn C the Hard Way中学习C。

我正在使用内核版本 3.9.0-vanillaice amd64(我编译它)和 glibc 2.17(从 Debian 的 repo 安装)运行 Debian Sid。

在书中的练习 4 中

这是我的代码:

Valgrind 应该产生这样的东西:

我的没有提到错误: