Leak/Address 没有 LD_PRELOAD 的共享库中的消毒剂

Leak/Address sanitizer in a shared library without LD_PRELOAD

我想在我的共享库上使用 Clang 的 leak/address 清理器,它是在运行时从 JVM 或 dotnet (Linux) 加载的,所以我无法重新编译二进制文件。

使用 LD_PRELOAD 会产生非常嘈杂的输出,JVM 本身会报告很多(可能是误报?)泄漏。当 LD_PRELOADing for dotnet 时,消毒剂彻底崩溃。

有没有什么方法可以将消毒剂静态 link 到共享库中(或者动态地 LD_PRELOAD)?

首先,您不能静态 link 消毒剂运行时库到您的库中。它必须被预加载以拦截 std 分配器(malloc,等等),否则会发生故障(在 Asan 启动时有一个特殊检查确保 libasan 被预加载)。

JVM 中的噪声输出很可能是合法错误。 使用 LD_PRELOAD 会产生非常嘈杂的输出,JVM 本身会报告很多(可能是误报?)泄漏。

The sanitizer outright crashes when LD_PRELOADing for dotnet.

是真正的崩溃还是诊断出的内存错误?可以在 Asan tracker 中报告崩溃。 应该向 dotnet 项目报告内存错误,但您仍然可以在错误后使用继续执行模式继续执行(grep for "continue-after-error" in Asan FAQ)。