【问题标题】:valgrind, gcc 6.2.0 and "-fsanitize=address"valgrind、gcc 6.2.0 和“-fsanitize=address”
【发布时间】:2017-06-24 01:29:32
【问题描述】:

最近,在使用“-fsanitize=address”进行编译时,我得到了 使用 valgrind 运行应用程序时出现执行异常 即

“ASan 运行时不在初始库列表中排在第一位”

我有点不知道 valgrind 到底做了什么。命令 'ldd file.exe' 提供

    linux-gate.so.1 =>  (0xb7755000)
    libasan.so.3 => /usr/lib/i386-linux-gnu/libasan.so.3 (0xb7199000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6fdf000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6fd8000)
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb6fcf000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6fb2000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6f5c000)
    /lib/ld-linux.so.2 (0x80092000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6f3e000)

有什么提示吗?

【问题讨论】:

  • 它可以与LD_PRELOAD=libasan.so 一起使用吗?
  • 不,我收到“错误:ld.so:无法预加载来自 LD_PRELOAD 的对象 'libasan.so'(无法打开共享对象文件):忽略。”
  • LD_PRELOAD=libasan.so.3 怎么样(如果失败,LD_PRELOAD=/usr/lib/i386-linux-gnu/libasan.so.3)?

标签: gcc valgrind address-sanitizer


【解决方案1】:

您将无法在 Valgrind 下运行经过清理的代码。即使您解决了预加载 libasan 的问题,您也会遇到冲突的地址空间要求(即在启动 Valgrind 时保留 Asan 影子内存也需要的内存区域)并且这无法解决,因为两个地址都是在 Valgrind 和 libasan 中硬编码。 Asan 和 Tsan 或 Asan 和 Msan 也存在类似问题(即它们不能同时启用)。由于消毒剂高度专业化以实现其令人印象深刻的性能数字,因此不太可能解决此问题。

【讨论】:

  • 是的,从我的项目中的 CMAKE_CXX_FLAGS_DEBUG 中删除 -fsanitize=address 可以让 Valgrind 正确启动。感谢您的回答。
  • @korst1k 请注意,ASan 和 Valgrind 可能会发现不同的错误集,因此建议在两者下运行您的测试套件。
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2015-09-17
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多