2012-06-06 27 views
7

Tôi đang cố gắng để lỗi debug như sau đó tôi nhận được khi chạy một số kịch bản Ruby:Debugging lỗi malloc trong 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 

Bất kỳ ý tưởng làm thế nào tôi có thể thực sự thiết lập một breakpoint và gỡ lỗi như vậy ? Tôi muốn xem liệu điều này có phải do bản thân Ruby hay một số extensio gây ra hay không ..

Tôi đang sử dụng Mac OS X 10.7.3 (Lion)ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0].

+1

Điều đó có nghĩa là đặt điểm ngắt bằng cách sử dụng 'gdb' hoặc một số trình gỡ lỗi C khác. Sử dụng một Ruby và các phần mở rộng có gỡ lỗi được kích hoạt (tức là được biên dịch bằng '-g') sẽ hữu ích. –

+1

@muistooshort nếu bạn có thể đi vào các bước về cách thực hiện điều này hoặc cung cấp liên kết, tôi nghĩ rằng tôi có thể sẽ trao câu hỏi cho bạn – babonk

Trả lời

2

Nếu bạn đang sử dụng Ruby 1.9.2+, hãy cài đặt đá quý trình gỡ lỗi (gem install debugger). Có hai cách để gỡ lỗi: trực tiếp bao gồm đá quý debugger hoặc sử dụng mã nhị phân redbug. Giả sử chúng ta có một kịch bản đồ chơi, và chúng ta muốn biết tại sao $blah là 4 sau khi gọi foo() (giả vờ là một thư viện bên ngoài).

Phương pháp 1: Bao gồm debugger

này được thiết lập một breakpoint bằng tay trong mã của bạn:

require 'debugger' 

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

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

puts $blah 

Run này là ruby debug.rb. Điều này sẽ khởi động bạn vào một ruby-debug console:

% 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 

Cách 2: Chạy rdebug

Dưới đây là ví dụ ví dụ kịch bản của chúng tôi, debug.rb:

$blah = 3 

def foo 
    $blah += 1 
end 

def bar 
    $blah += 4 
end 

foo() 
bar() 

puts $blah 

Từ vỏ, thực hiện rdebug debug.rb. Đây là phiên ví dụ:

% 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 

Các lệnh chính là break LINE-NUMBERdisplay VARIABLE. Hy vọng rằng sẽ giúp!

Tài

+0

Vấn đề là babonk cần đặt điểm ngắt trong hàm C ('malloc_error_break') để họ có thể quay lại trình thông dịch hoặc phần mở rộng dựa trên C để tìm ra ai đang giải phóng con trỏ hai lần. –

+0

@muistooshort: babonk đang chạy tập lệnh Ruby, vì vậy tôi giả định lỗi là từ thư viện bên ngoài sử dụng phần mở rộng C. Có vẻ như thiết lập một số điểm ngắt trước khi cuộc gọi thư viện sẽ hữu ích hơn việc gỡ lỗi phần mở rộng C của một ai đó. Tuy nhiên, nếu đó là mong muốn, [tin nhắn ruby-talk] (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/18105) cho thấy cách thực hiện. – jmdeldin

2

Đây là những gì giải quyết vấn đề của tôi khi tôi nhìn thấy thông điệp của OP:

Tôi nhận được thông báo bởi vì tôi đã sai lầm với con đường, cố gắng để có được rvm hoặc gem để cài đặt nội dung nào đó và tôi đã thực sự bỏ qua quyền. Sau đó, tôi nhận được cùng một thông điệp mà OP đang báo cáo. Đối với tôi, điều duy nhất đã làm là đi đến số Disk Utility của Mac OS X, chọn âm lượng của tôi ở ngăn bên trái (Macintosh HD), rồi bấm Repair Disk Permissions.

Sau khi hoàn tất, tôi có thể mở thành công và khởi động một cửa sổ đầu cuối mới.