在Mac OS X上调试Ruby中的malloc错误

我正在尝试调试运行一些Ruby脚本时遇到的以下错误:

ruby(47333,0x7fff72aee960) malloc: *** error for object 0x7f98b6a6e3f0: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug 

知道如何实际设置这样的断点和调试吗? 我想看看这是由Ruby本身还是一些扩展引起的。

我正在使用Mac OS X 10.7.3 (Lion)ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]

如果您使用的是Ruby 1.9.2+,请安装调试器gem( gem install debugger )。 调试有两种方法:直接包含debugger gem或使用redbug二进制文件。 让我们假装我们有一个玩具脚本,我们想知道为什么$blah在调用foo()之后是4(假装它是一个外部库)。

方法1:包括debugger

这是在您的代码中手动设置断点:

 require 'debugger' $blah = 3 def foo $blah += 1 end def bar $blah += 4 end foo() debugger() # opens rdb bar() puts $blah 

ruby debug.rb运行它。 这将启动您进入ruby-debug控制台:

 % ruby debug.rb debug.rb:15 bar() (rdb:1) list [10, 19] in debug.rb 10 $blah += 4 11 end 12 13 foo() 14 debugger() => 15 bar() 16 17 puts $blah (rdb:1) display $blah 1: $blah = 4 

方法2:运行rdebug

这是我们的示例示例脚本debug.rb

 $blah = 3 def foo $blah += 1 end def bar $blah += 4 end foo() bar() puts $blah 

从shell中,执行rdebug debug.rb 。 这是一个示例会话:

 % rdebug debug.rb (rdb:1) list 1,20 [1, 20] in /mnt/hgfs/src/stackoverflow/debug.rb => 1 $blah = 3 2 3 def foo 4 $blah += 1 5 end 6 7 def bar 8 $blah += 4 9 end 10 11 foo() 12 bar() 13 14 puts $blah (rdb:1) break 12 Breakpoint 1 file /mnt/hgfs/src/stackoverflow/debug.rb, line 12 (rdb:1) display $blah 1: $blah = (rdb:1) continue Breakpoint 1 at /mnt/hgfs/src/stackoverflow/debug.rb:12 1: $blah = 4 /mnt/hgfs/src/stackoverflow/debug.rb:12 bar() (rdb:1) display $blah 2: $blah = 4 

关键命令是break LINE-NUMBERdisplay VARIABLE 。 希望有所帮助!

资源

  • ruby-debug文档
  • 调试器gem

当我看到OP的消息时,这就解决了我的问题:

我得到了消息,因为我弄乱了路径,试图让rvmgem安装一些东西,我设法真正搞砸了我的权限。 然后我得到OP正在报告的同样的消息。 对我来说,唯一能做的就是转到Mac OS X的Disk Utility ,在左窗格中选择我的音量(Macintosh HD),然后单击Repair Disk Permissions

完成后,我能够成功打开并启动一个新的终端窗口。