我有一个.so文件,用于查找内存泄漏。我在会话中设置LD_PRELOAD env变量,我想在其中执行目标二进制文件。
export LD_PRELOAD=./memleakfinder.so
但是一旦设置了这个环境变量,即使像ls
或ps
之类的简单linux命令也会导致Segmentation fault (core dumped)
。为什么会发生这种情况?我已经重载了malloc()
,calloc()
,realloc()
,free()
,new
,new[]
等版本.so文件。
CentOS6的自动错误报告工具说:
source:coreutils Problem:process /bin/ls was killed by signal 11(SIGSEGV)
。很明显,库注入导致了这里的问题。我怎么能避免它?
答案 0 :(得分:0)
不是导出环境变量,而是将变量添加到要运行/调试的命令中。
例如:
LD_PRELOAD=./memleakfinder.so a.out
只有在调用a.out而不是当前shell中的所有命令时才会加载库。
如果没有看到某些代码,我们无法帮助您确定分段错误的原因。
答案 1 :(得分:0)
尝试覆盖malloc函数时,我遇到了同样的问题。
对我来说,我在函数printf()
的声明中使用了malloc()
(以查看其是否有效)。
当我改用write()
或printf()
时,它起作用了。这是因为某些库函数(例如printf)可能会为其操作分配内存。因此,如果您在库中使用这些功能中的任何一个,则可能会陷入无限递归的风险。