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

时间:2012-12-04 16:18:41

标签: valgrind memcheck mkstemp

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

==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_269e37a6
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_d6b675e7
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_db46c594
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_51cd683d
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_86662832
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_226a8983
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_bb94a700
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_532d4b39
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_de4a957e
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_fcc23adf
==30533== VG_(mkstemp): failed to create temp file: /tmp/valgrind_proc_30533_cmdline_f41d332c
valgrind: Startup or configuration error:
valgrind:    Can't create client cmdline file in /pathtomyproject/
valgrind: Unable to start up properly.  Giving up.

有些进程(可能是其中的1/3)会以错误

结束
==30482== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
==30482==
==30482== 1 errors in context 1 of 1:
==30482== Jump to the invalid address stated on the next line
==30482==    at 0x4C6: ???
==30482==    by 0x4005D2E: open_verify (dl-load.c:1914)
==30482==    by 0x4006362: open_path (dl-load.c:2175)
==30482==    by 0x4008799: _dl_map_object (dl-load.c:2407)
==30482==    by 0x400CFE1: openaux (dl-deps.c:65)
==30482==    by 0x400F175: _dl_catch_error (dl-error.c:178)
==30482==    by 0x400D6BD: _dl_map_object_deps (dl-deps.c:258)
==30482==    by 0x400350C: dl_main (rtld.c:1826)
==30482==    by 0x4015B23: _dl_sysdep_start (dl-sysdep.c:244)
==30482==    by 0x4005364: _dl_start (rtld.c:338)
==30482==    by 0x40016B7: ??? (in /lib/x86_64-linux-gnu/ld-2.15.so)
==30482==    by 0x4: ???
==30482==    by 0x7FF0007C6: ???
==30482==    by 0x7FF0007DD: ???
==30482==    by 0x7FF0007E2: ???
==30482==    by 0x7FF0007E9: ???
==30482==    by 0x7FF0007EE: ???
==30482==  Address 0x4c6 is not stack'd, malloc'd or (recently) free'd

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

我在网上找不到关于这个bug的任何信息,但也许在这里某处知道一些关于它的信息?

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

1 个答案:

答案 0 :(得分:2)

错误来自:

// coregrind/m_libcfile.c

/* Create and open (-rw------) a tmp file name incorporating said arg.
   Returns -1 on failure, else the fd of the file.  If fullname is
   non-NULL, the file's name is written into it.  The number of bytes
   written is guaranteed not to exceed 64+strlen(part_of_name). */

Int VG_(mkstemp) ( HChar* part_of_name, /*OUT*/HChar* fullname )
{
   HChar  buf[200];
   Int    n, tries, fd;
   UInt   seed;
   SysRes sres;
   const HChar *tmpdir;

   vg_assert(part_of_name);
   n = VG_(strlen)(part_of_name);
   vg_assert(n > 0 && n < 100);

   seed = (VG_(getpid)() << 9) ^ VG_(getppid)();

   /* Determine sensible location for temporary files */
   tmpdir = VG_(tmpdir)();

   tries = 0;
   while (True) {
      if (tries++ > 10)
         return -1;
      VG_(sprintf)( buf, "%s/valgrind_%s_%08x",
                    tmpdir, part_of_name, VG_(random)( &seed ));
      if (0)
         VG_(printf)("VG_(mkstemp): trying: %s\n", buf);

      sres = VG_(open)(buf,
                       VKI_O_CREAT|VKI_O_RDWR|VKI_O_EXCL|VKI_O_TRUNC,
                       VKI_S_IRUSR|VKI_S_IWUSR);
      if (sr_isError(sres)) {
         VG_(umsg)("VG_(mkstemp): failed to create temp file: %s\n", buf);
         continue;
      }
      /* VG_(safe_fd) doesn't return if it fails. */
      fd = VG_(safe_fd)( sr_Res(sres) );
      if (fullname)
         VG_(strcpy)( fullname, buf );
      return fd;
   }
   /* NOTREACHED */
}

如您所见,如果有超过10个进程共享相同的pidppid,则该代码将失败。目前尚不清楚如何创建20个valgrind流程 - 它们通常共享pid

您可以通过

解决问题
  • 创建Valgrind实例,使它们不共享相同的pid
  • TMPDIR设置为每个Valgrind实例的不同目录。