hello-world.cc示例似乎泄漏内存

时间:2019-11-22 01:00:50

标签: c++ v8 embedded-v8

刚刚开始尝试将V8嵌入C ++项目中。考虑到该库的复杂性,我认为如果可以将valgrind用作附加的回归测试器,那就不会那么恐怖了。希望定期检查从valgrind进行的运行是否干净,至少可以帮助我至少在某些错误之前发现一些错误。

不幸的是,hello-world.cc示例似乎开箱即用会泄漏一些kB的内存。剥离示例中的内容,即使只是创建和删除一个隔离都不会给我带来明显的影响。

// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "libplatform/libplatform.h"
#include "v8.h"

int main(int argc, char* argv[]) {
  // Initialize V8.
  v8::V8::InitializeICUDefaultLocation(argv[0]);
  v8::V8::InitializeExternalStartupData(argv[0]);

  std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
  v8::V8::InitializePlatform(platform.get());
  v8::V8::Initialize();

  // Create a new Isolate and make it the current one.
  v8::Isolate::CreateParams create_params;
  create_params.array_buffer_allocator =
      v8::ArrayBuffer::Allocator::NewDefaultAllocator();
  v8::Isolate* isolate = v8::Isolate::New(create_params);

  // Dispose the isolate and tear down V8.
  isolate->Dispose();
  v8::V8::Dispose();
  v8::V8::ShutdownPlatform();
  delete create_params.array_buffer_allocator;
  return 0;
}

我看到其他人已经注意到了这一点:https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0

我猜我的问题是:尝试用v8实现无泄漏是值得的,还是该库总是像微弱的库那样总是轻而易举地留下一些位和字节的翻转?或者,如果我(和其他人)在hello-world示例中做错了什么,知道该信息将很有用。

1 个答案:

答案 0 :(得分:1)

V8开发人员在这里。我很确定V8是LSan(LeakSanitizer)清洁的。我们不再对Valgrind进行定期测试(主要是因为它太慢)。

在Valgrind中使用v8_hello_world二进制文件进行的快速测试中,我确实看到了两个泄漏报告。其中之一看起来是故意的:在LSan中它被显式忽略,并且“不是真正的泄漏”,因为该内存旨在在各个隔离区之间共享,因此不允许任何隔离区在拆卸时释放它。您可以尝试在进程退出时释放它,但这并没有明显的好处,它只会安抚消毒剂,并且为此花费了工程和CPU /执行工作。我不确定其他报告,但我怀疑它与之相关。

长话短说:

  • Valgrind很可能缺少(很短的)故意“泄漏”(由于任何原因而被发现或真实发现)的允许清单
  • V8不应泄漏内存;如果确实如此,那就是一个错误
  • 我们主要关心长时间运行的隔离株是否无泄漏,而很少关注单个过程创建和销毁数百万个无泄漏隔离株的情况。我确实认为这也应该起作用,但实际上,如果每个隔离株的泄漏量较小且固定,那么修复该问题的紧迫性就不那么紧急了。
  

其他人已经注意到了这一点:https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0

如果我正确地读取了该线程,则它显然与某人正在观察的内存消耗有关,但是Valgrind并未 将其报告为泄漏。