我正在尝试使用TCL查找守护程序写入的内存泄漏问题,并且在OSX上运行的守护程序继续监视SAN系统的系统。
谷歌搜索网后,我发现TCL专家说我必须用TCL_MEM_DEBUG编译专门定义的 makefile(在CFLAGS中使用-DTCL_MEM_DEBUG)。然后Tcl将使用'memory'命令记录内存使用状态。根据TCL的手册页,要启用内存调试,应该从头开始重新编译Tcl 定义了TCL_MEM_DEBUG(例如,通过将--enable-symbols = mem标志传递给 构建时配置脚本)。这也将编译为非 存根命令Tcl_InitMemory将内存命令添加到Tcl。
所以,我从SourceForge下载了源代码tcl8.6.1-src.tar.gz。提取到目录并更改为macosx子目录。但在使用以下命令编译后
sudo ./configure --enable-symbols=mem
sudo make
sudo make install NATIVE_TCLSH="/usr/local/bin/tclsh8.6"
虽然创建了新的tclsh(v8.6),但'memory'命令仍然无法正常工作。在深入研究过程之后,我发现在config.log
中创建了一些错误消息configure: failed program was:
| /* confdefs.h. */
|
| #define PACKAGE_NAME "tcl"
| #define PACKAGE_TARNAME "tcl"
| #define PACKAGE_VERSION "8.6"
| #define PACKAGE_STRING "tcl 8.6"
| #define PACKAGE_BUGREPORT ""
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
我也找不到find命令找到'confdefs.h'文件。我怎么了?
这是我的MBP环境
MacBookPro8,2内存:4 GB,15英寸,2011年初,OS X 10.9.1(13B42)
declare -x DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
declare -x PATH="/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Applications/Server.app/Contents/ServerRoot/usr/bin:/Applications/Server.app/Contents/ServerRoot/usr/sbin"
如何解决问题? 或者是否有任何地方可以下载带有TCL_MEM_DEBUG启用的tcl包?
答案 0 :(得分:3)
首先,您需要确保安装了正常的编译器。如果您还没有,请从Apple Store获取Xcode,因为它包含一个理智的命令行编译器。 (在配置期间失败的测试是检查编译器是否表现得很好;你的不是!)
完成了吗?好。
接下来,只安装到磁盘上的某些位置需要sudo
(但默认位置/usr/local
是其中一个位置)。你不应该配置或编译它。我将用于在OSX上构建和安装启用调试的Tcl的命令序列是:
cd $the_unpacked_tcl_dir
cd unix
./configure --enable-symbols=mem
make
sudo make install
Tweakables /注释:
--prefix=/the/base/install/dir
的{{1}}位置tclsh
和/the/base/install/dir/bin
中的Tcl共享库配置了位置。如果您选择的地点默认是可写的,则不需要/the/base/install/dir/lib
。sudo
和make
之间运行测试套件。使用make install
执行此操作。 不以管理用户身份运行make test
;这使得一些测试失败(例如,检查不可写入文件被检测到并报告为不可写的那些)。make test
代替all
来启用更多调试选项,尤其是与字节码编译器相关的选项。mem
可能会大大降低性能,禁用更高级的C编译器选项,导致使用不同的内存跟踪,并为字节码引擎添加额外的开销以启用指令级跟踪。如果你想要速度,根本不使用它。--enable-symbols
,则应在make
之后和make clean
之前运行./configure
。 (您可以通过执行make
来结合这些步骤;默认的make clean all
目标是make
。)请注意,我在OSX(现在的Mountain Lion)上使用了基于调试的Tcl版本;此是经过测试的配置。无论发生什么是不 Tcl的错误。