如何在使用LD_PRELOAD加载库时配合Valgrind运行程序?
解决Valgrind与LD_PRELOAD插桩库共存的问题
你遇到的问题本质是Valgrind的执行逻辑导致的:
- 直接执行
valgrind LD_PRELOAD=foo.so ./run_program时,Valgrind会把LD_PRELOAD=foo.so当作要运行的程序,自然找不到这个"文件" - 执行
LD_PRELOAD=foo.so valgrind ./run_program时,这个环境变量是传给Valgrind进程本身的,而非它启动的目标程序./run_program,所以插桩库不会生效
有两种可靠的解决方法:
方法1:使用Valgrind的--preload选项
这个选项专门用来指定要预加载到目标程序中的库,命令格式如下:
valgrind --preload=foo.so ./run_program
方法2:使用Valgrind的--env选项传递环境变量
通过--env把LD_PRELOAD变量传递给目标进程,命令格式:
valgrind --env=LD_PRELOAD=foo.so ./run_program
如果你的插桩库不在系统默认的库搜索路径里,需要先指定库的绝对路径,或者先设置LD_LIBRARY_PATH(同样用--env传递):
valgrind --env=LD_LIBRARY_PATH=/path/to/your/lib --env=LD_PRELOAD=foo.so ./run_program
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

