我需要在运行时为进程设置LD_LIBRARY_PATH,LD_PRELOAD和一些环境变量,并使用Valgrind检测内存泄漏。
有人可以建议一种方法来为valgrind中的进程设置或传递这些变量吗?
答案 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
更容易 - 你不必记得找到历史中环境的命令。)