Я пытаюсь отладить ошибки, подобные следующим, которые я получаю при запуске некоторых скриптов 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].
Ответ 1 · рейтинг 2 · jmdeldin
Если вы используете Ruby 1.9.2+, установите гем отладчика (gem install debugger). Есть два способа отладки: непосредственное включение гема debugger или использование двоичного файла redbug. Давайте представим, что у нас есть игрушечный скрипт, и мы хотим знать, почему $blah равно 4 после вызова foo() (представьте, что это внешняя библиотека).
Способ 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
Из оболочки выполните 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-NUMBER и display VARIABLE. Надеюсь, это поможет!
Ресурсы
Ответ 2 · рейтинг 2 · Matthew Turner
Вот что решило мою проблему, когда я увидел сообщение OP:
Я получил сообщение, потому что я перепутал пути, пытаясь заставить rvm или gem установить что-то, и мне удалось действительно испортить мои разрешения. Затем я получил то же самое сообщение, о котором сообщает OP. Для меня единственное, что это сделало, это перейти к Mac OS X Disk Utility, выбрать мой том на левой панели (Macintosh HD), а затем нажать Repair Disk Permissions.
После его завершения я смог успешно открыть и запустить новое окно терминала.