如何从源代码编译TCL以在tclsh中启用内存命令

时间:2014-01-07 04:37:31

标签: macos memory-leaks tcl

我正在尝试使用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包?

1 个答案:

答案 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 /注释:

  1. 您可以在某些位置安装Tcl,前提是您为--prefix=/the/base/install/dir的{​​{1}}位置tclsh/the/base/install/dir/bin中的Tcl共享库配置了位置。如果您选择的地点默认是可写的,则不需要/the/base/install/dir/lib
  2. 您可以(也许应该)在sudomake之间运行测试套件。使用make install执行此操作。 以管理用户身份运行make test;这使得一些测试失败(例如,检查不可写入文件被检测到并报告为不可写的那些)。
  3. 您可以使用make test代替all来启用更多调试选项,尤其是与字节码编译器相关的选项。
  4. 完全使用mem可能会大大降低性能,禁用更高级的C编译器选项,导致使用不同的内存跟踪,并为字节码引擎添加额外的开销以启用指令级跟踪。如果你想要速度,根本不使用它
  5. 如果您之前尝试过--enable-symbols,则应在make之后和make clean之前运行./configure。 (您可以通过执行make来结合这些步骤;默认的make clean all目标是make。)
  6. 请注意,我在OSX(现在的Mountain Lion)上使用了基于调试的Tcl版本;此经过测试的配置。无论发生什么是 Tcl的错误。