Отладка ошибок malloc в Ruby на Mac OS X

Я пытаюсь отладить ошибки, подобные следующим, которые я получаю при запуске некоторых скриптов 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].


person bgcode    schedule 06.06.2012    source источник
comment
Это означает, что установите точку останова с помощью gdb или другого отладчика C. Было бы полезно использовать Ruby и расширения с включенной отладкой (т.е. скомпилированные с -g).   -  person mu is too short    schedule 07.06.2012
comment
@muistooshort, если бы вы могли рассказать о том, как это делается, или предоставить ссылку, я думаю, что, скорее всего, задам вам вопрос   -  person bgcode    schedule 07.06.2012


Ответы (2)


Если вы используете 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. Надеюсь, это поможет!

Ресурсы

person jmdeldin    schedule 07.06.2012
comment
Проблема в том, что babonk должен установить точку останова в функции C (malloc_error_break), чтобы они могли вернуться к интерпретатору или расширению на основе C, чтобы понять, кто освобождает указатель дважды. - person mu is too short; 08.06.2012
comment
@muistooshort: babonk запускает скрипт Ruby, поэтому я предполагаю, что ошибка связана с внешней библиотекой, которая использует расширение C. Звучало так, будто установка некоторых точек останова перед вызовом библиотеки была бы более полезной, чем отладка чьего-то расширения C. Однако, если это необходимо, этот ruby-talk message показывает, как это сделать. - person jmdeldin; 08.06.2012

Вот что решило мою проблему, когда я увидел сообщение OP:

Я получил сообщение, потому что я перепутал пути, пытаясь заставить rvm или gem установить что-то, и мне удалось действительно испортить мои разрешения. Затем я получил то же самое сообщение, о котором сообщает OP. Для меня единственное, что это сделало, это перейти к Mac OS X Disk Utility, выбрать мой том на левой панели (Macintosh HD), а затем нажать Repair Disk Permissions.

После его завершения я смог успешно открыть и запустить новое окно терминала.

person Matthew Turner    schedule 17.09.2013