2012-06-06 14 views
7

Próbuję debugować błędy jak poniżej, które otrzymuję podczas jazdy kilka skryptów Rubydebugowania błędy malloc w Ruby on Mac OS X

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

Jakiś pomysł jak mogę faktycznie ustawić taką pułapkę i debugowania ? Chcę się przekonać, czy jest to spowodowane przez samą Ruby, czy niektóre rozszerzenia.

Używam Mac OS X 10.7.3 (Lion) i ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0].

+1

Oznacza to ustawienie punktu przerwania za pomocą 'gdb' lub innego debugera C. Używanie ruby ​​i rozszerzeń z włączonym debugowaniem (np. Skompilowanym za pomocą opcji -g) byłoby pomocne. –

+1

@muistooshort jeśli mógłbyś pójść krok po kroku, jak to zrobić, lub podać link, myślę, że prawdopodobnie odpowiedziałbym ci na to pytanie – babonk

Odpowiedz

2

Jeśli używasz Ruby 1.9.2+, zainstaluj klej debuggera (gem install debugger). Istnieją dwa sposoby debugowania: bezpośrednio z klejnotem debugger lub przy użyciu pliku binarnego redbug. Udawajmy, że mamy scenariusz z zabawkami i chcemy wiedzieć, dlaczego $blah jest 4 po wywołaniu foo() (udawaj, że jest to biblioteka zewnętrzna).

Metoda 1: Włączenie debugger

To jest ustawienie przerwania ręcznie w kodzie:

require 'debugger' 

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
debugger() # opens rdb 
bar() 

puts $blah 

Run to jako ruby debug.rb. Spowoduje to uruchomienie cię do konsoli 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 

Metoda 2: Uruchomienie rdebug

Oto nasz przykład przykład skrypt, debug.rb:

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
bar() 

puts $blah 

Od powłoki, wykonać rdebug debug.rb. Oto sesja przykład:

% 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 

klawisze są break LINE-NUMBER i display VARIABLE. Mam nadzieję, że pomaga!

Resources

+0

Problem polega na tym, że babonk musi ustawić punkt przerwania w funkcji C ('malloc_error_break'), aby mogli wrócić do interpretera lub rozszerzenia opartego na C, aby określić, kto dwukrotnie zwalnia wskaźnik. –

+0

@muistooshort: babonk uruchamia skrypt Ruby, więc zakładam, że błąd pochodzi z biblioteki zewnętrznej, która używa rozszerzenia C. Brzmiało to jak ustawienie punktów przerwania, zanim wywołanie biblioteki byłoby bardziej użyteczne niż debugowanie czyjegoś rozszerzenia C. Jednakże, jeśli jest to pożądane, [ta wiadomość z wiadomością ruby] (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/18105) pokazuje, jak to zrobić. – jmdeldin

2

oto co rozwiązać mój problem, kiedy zobaczyłem wiadomość PO za:

Dostałem wiadomość, ponieważ miałem pomieszane ze ścieżkami, starając uzyskać rvm lub gem, aby zainstalować coś, i udało mi się naprawdę zakopać uprawnienia. Potem otrzymałem ten sam komunikat, który raportuje OP. Dla mnie jedyną rzeczą, która to zrobiła, było przejście do Mac OS X Disk Utility, wybierz mój głośność w lewym okienku (Macintosh HD), a następnie kliknij Repair Disk Permissions.

Po zakończeniu pracy udało mi się otworzyć i uruchomić nowe okno terminala.