如何在valgrind中为进程设置动态链接库路径和环境变量

时间:2014-07-14 20:13:58

标签: c++ c memory-leaks valgrind

我需要在运行时为进程设置LD_LIBRARY_PATH,LD_PRELOAD和一些环境变量,并使用Valgrind检测内存泄漏。

有人可以建议一种方法来为valgrind中的进程设置或传递这些变量吗?

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,尝试在需要与valgrind使用的库不兼容的库的程序上运行valgrind,并且一直在使用:

valgrind --trace-children=yes env LD_LIBRARY_PATH=your_library_path OTHER_VAR=foo your_program arg1 arg2...

env设置环境,然后execs your_program。我们需要将--trace-children=yes参数传递给valgrind,以便它继续跟踪exec系统调用。如果未设置--trace-children=yes,则valgrind将停止跟踪exec,您将无法从valgrind your_program获得任何有用的输出。

这种方法的一个潜在缺点是valgrind可能会报告env中的任何内存问题。我没有看到来自这个来源的任何误报(env不是一个非常复杂的程序),但它可能会发生。

我没有用LD_PRELOAD尝试过这个问题(但我的用例还没有出现)。 Valgrind确实设置了LD_PRELOAD,因此您可能必须执行以下操作:

valgrind --trace-children=yes env LD_PRELOAD=$LD_PRELOAD:your_preload your_program

答案 1 :(得分:0)

标准机制有什么问题?其中包括:

LD_LIBRARY_PATH=$new_libpath LD_PRELOAD=$new_preload OTHERVAR=otherval valgrind your.program arg1 …

或者:

env LD_LIBRARY_PATH=$new_libpath \
    LD_PRELOAD=$new_preload \
    OTHERVAR=otherval \
    valgrind ./your.program arg1 …

或者:

export LD_LIBRARY_PATH=$new_libpath
export LD_PRELOAD=$new_preload
export OTHERVAR=otherval
valgrind ./your.program arg1 …

前两种机制的优点是它不会影响shell的工作环境。最后一种机制的优点是 影响shell的工作环境(这使得下次运行valgrind更容易 - 你不必记得找到历史中环境的命令。)