【问题标题】:Catching memory leaks from libraries从库中捕获内存泄漏
【发布时间】:2020-01-18 21:17:01
【问题描述】:

对于我当前的项目,我需要(即根据要求)使用“复杂”的内部库。 我很快意识到,这个库有一些内存泄漏,我无法修复,因为我无权访问源代码。

幸运的是,该项目应该使用的唯一工具链是 Visual C++ (2017+)。所以我想知道,是否有办法捕获所有内存分配,最好是在一个块内并手动释放这些内存块?

我在想一些类似的事情

begin_capture();

BadObject* obj = new BadAllocation();

auto allocations = end_capture();

for(const auto& alloc: allocations)
    delete alloc;

是否有任何扩展,特定于 Visual C++ 或特定于平台的库,我可以用来实现这些功能?

【问题讨论】:

  • 即使你能认出它们,你也不知道破坏的规则。你可以deletemalloced 或者 vicky 反之。一般来说,如果您不知道它是什么以及它来自哪里,您需要自行承担风险。
  • @user4581301 感谢您的意见;这是我一定要提防的!

标签: c++ windows memory visual-c++ memory-leaks


【解决方案1】:

唯一的通用解决方案是在单独的进程中运行库,使用共享内存或其他 IPC(套接字等)交换数据,并定期重新启动进程。如果您需要传输状态,您可以启动第二个进程,将数据从第一个传输到第二个(使用任何必要的手段,例如序列化库状态,然后在另一端将其反序列化为库调用以重建数据) ,然后杀死第一个。

否则,坚持将这个“复杂”的库发布到私人 git 存储库(内部或例如在 github 上,并且您的工作肯定使用版本控制......对吗?对吗??[不要哭]),将库源作为第三方子模块添加到项目的存储库中(至少您确实使用版本控制,对吗?git repos 可以是本地的,您肯定知道......),并维护您自己的分支来消除内存错误。真的没有其他办法。 “复杂”的库可能不会做任何超复杂的事情,因为如此低的代码质量通常与技术先进的功能不相称。您可能会在一年内将该库重构为现代 C++,然后忘记整个喧嚣。

如果进行这种神奇的烟雾开发的地方不能遵循基本的行业惯例,例如授权内部用户修复他们使用的代码,那么我建议是时候尽快寻找另一份工作了。现在的很烂。我不是在开玩笑。

【讨论】:

    【解决方案2】:

    通常的方法是使用单独的进程,因此当它退出时,所有内存都会自动释放。

    如果您仍想在此第 3 方库(DLL?)中捕获分配,您需要了解它是如何分配内存的。假设它是用 Visual C++ 编写的,所以所有 malloc/new 都调用 HeapAlloc。在这种情况下,您需要挂钩 HeapAlloc(有一些库:BoxedApp SDKEasyHook 等),检查分配是否在当前线程中进行(顺便说一下,如果库启动新线程并分配内存怎么办?还有吗?),存储在某个列表中并在某个时候释放所有内存。

    总的来说,我认为这是可能的,但使用单独的进程是一种非常安全的方式。

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 2012-01-17
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多