Class: RubyDebug

Inherits:
ArcadiaExt show all
Includes:
Autils
Defined in:
ext/ae-ruby-debug/ae-ruby-debug.rb

Instance Attribute Summary collapse

Attributes inherited from ArcadiaExt

#arcadia

Instance Method Summary collapse

Methods included from Autils

#full_in_path_command, #is_windows?

Methods inherited from ArcadiaExt

#conf, #conf_array, #exec, #float_frame, #frame, #frame_def_visible?, #frame_visible?, #initialize, #maximize, #maximized?, #resize

Constructor Details

This class inherits a constructor from ArcadiaExt

Instance Attribute Details

#rdcObject (readonly)

Returns the value of attribute rdc.



1385
1386
1387
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1385

def rdc
  @rdc
end

#rdsObject (readonly)

Returns the value of attribute rds.



1384
1385
1386
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1384

def rds
  @rds
end

Instance Method Details

#break_name(_file, _line) ⇒ Object



1479
1480
1481
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1479

def break_name(_file,_line)
  "#{_file}:#{_line}"
end

#breakpoint_add(_file, _line) ⇒ Object



1502
1503
1504
1505
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1502

def breakpoint_add(_file,_line)
  breakpoint_add_live(_file,_line)
  @static_breakpoints << {:file=>_file,:line=>_line}
end

#breakpoint_add_live(_file, _line) ⇒ Object



1483
1484
1485
1486
1487
1488
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1483

def breakpoint_add_live(_file,_line)
  if @rdc && @rdc.is_alive?
    @breakpoints[breakpoint_suf(_file,_line)] = @rdc.set_breakpoint(_file, _line.to_i)
    #@rdv.break_list_add(_file,_line) if @rdv
  end
end

#breakpoint_del(_file, _line) ⇒ Object

private :breakpoint_add



1508
1509
1510
1511
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1508

def breakpoint_del(_file,_line)
  breakpoint_del_live(_file,_line)
  @static_breakpoints.delete_if{|b| (b[:file]==_file && b[:line]==_line)}
end

#breakpoint_del_live(_file, _line) ⇒ Object



1490
1491
1492
1493
1494
1495
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1490

def breakpoint_del_live(_file,_line)
  if @rdc && @rdc.is_alive?
    @rdc.unset_breakpoint(@breakpoints.delete(breakpoint_suf(_file,_line)))
    #@rdv.break_list_del(_file,_line) if @rdv
  end
end

#breakpoint_free_liveObject



1497
1498
1499
1500
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1497

def breakpoint_free_live
  @breakpoints.clear
  #@rdv.break_list_free if @rdv
end

#debug(_filename = nil) ⇒ Object



1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1549

def debug(_filename=nil)
  if _filename && !debugging?
    begin
      self.debug_begin
      @arcadia['pers']['run.file.last']=_filename
      @rds = RubyDebugServer.new(self,@arcadia) if @rds.nil?
      @rds.start_session(_filename, conf('server.host'), conf('server.port'))
      #Arcadia.new_msg(self,@rds.to_s)
      
      @rdc = RubyDebugClient.new(self, conf('server.host'), conf('server.port'), conf('server.timeout')) if @rdc.nil?
      @rdv = RubyDebugView.new(self) if @rdv.nil?
      self.frame.show
      @rdv.start_process(_filename)
      if @rdc.start_session
        @static_breakpoints.each{|_b|
          #Arcadia.console(self,'msg'=>" breakpoint_add #{_b[:file]}:#{_b[:line]}")
          breakpoint_add_live(_b[:file], _b[:line])
        }
        if @static_breakpoints.length > 0 && conf("auto_resume_break_on_first_line")!='no'
          @rdv.debug_send(:resume)
        end
      end
    rescue Exception => e
      Arcadia.console(self, 'msg'=>"---> "+e.to_s+ ' ' + e.backtrace[0], 'level'=>'debug')
    end
  end
end

#debug_beginObject



1544
1545
1546
1547
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1544

def debug_begin
  breakpoint_free_live
  #DebugContract.instance.debug_begin(self)
end

#debug_currentObject



1536
1537
1538
1539
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1536

def debug_current
  Arcadia.process_event(StartDebugEvent.new(self, 'file'=>@raised_file)) if @raised_file!=nil
  #debug(@raised_file) if @raised_file!=nil
end

#debug_freeObject



1588
1589
1590
1591
1592
1593
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1588

def debug_free
  self.frame.free
  self.frame(1).free
  @rdc = nil
  @rdv = nil
end

#debug_lastObject



1531
1532
1533
1534
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1531

def debug_last
  Arcadia.process_event(StartDebugEvent.new(self, 'file'=>$arcadia['pers']['run.file.last']))
  #debug($arcadia['pers']['run.file.last'])
end

#debug_quitObject



1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1595

def debug_quit
#p "in debug quit @rdc.is_alive?=#{@rdc.is_alive?}"
  if @rdc 
    if @rdc.is_alive?
      Thread.new{
        Tk.messageBox('icon' => 'info', 
        						'type' => 'ok',
      						 'title' => '(Arcadia) Debug',
      						 'message' => "Debug in course, stop it before exit")
      }
    else
      begin
        debug_free
      rescue Exception => e
        Arcadia.console(self, 'msg'=>"debug_quit:---> "+e.to_s+ ' ' + e.backtrace[0], 'level'=>'debug')
        #Arcadia.new_debug_msg(self, "debug_quit:---> "+e.to_s)
        #@arcadia['shell'].outln("debug_quit:---> "+e.to_s )
      end
    end
  end
end

#debugging?Boolean

debug(@raised_file) if @raised_file!=nil

Returns:

  • (Boolean)


1540
1541
1542
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1540

def debugging?
  !@rdc.nil? && @rdc.is_alive?
end

#eval_expression(_exp) ⇒ Object

def do_editor_event(_event)

  case _event.signature 
    when EditorContract::BREAKPOINT_AFTER_CREATE
      self.breakpoint_add(File.expand_path(_event.context.file), _event.context.line)
    when EditorContract::BREAKPOINT_AFTER_DELETE
      self.breakpoint_del(File.expand_path(_event.context.file), _event.context.line)
    when EditorContract::BUFFER_AFTER_RAISE
      @raised_file=_event.context.file
    when EditorContract::EVAL_EXPRESSION
      eval_expression(_event.context.text)
  end
end


1458
1459
1460
1461
1462
1463
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1458

def eval_expression(_exp)
  res = @rdc.debug_eval(_exp) if @rdc && @rdc.is_debugging_ready?
  hash = Hash.new
  hash[_exp]=res 
  @rdv.show_expression(_exp, hash) if res 
end

#on_before_build(_event) ⇒ Object



1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1386

def on_before_build(_event)
  if RubyWhich.new.which("rdebug") != []
    #ArcadiaContractListener.new(self, EditorContract, :do_editor_event)
    Arcadia.attach_listener(self, BufferEvent)
    @breakpoints = Hash.new
    @static_breakpoints = Array.new
  else
    Arcadia.console(self, 'msg'=>"Warning: Extension ae-ruby-debug depend upon rdebug command (install it or update system path!)", 'level'=>'error')
    #Arcadia.new_error_msg(self, "Warning: Extension ae-ruby-debug depend upon rdebug command (install it or update system path!)")
  end
  Arcadia.attach_listener(self, DebugEvent)
end

#on_buffer(_event) ⇒ Object



1403
1404
1405
1406
1407
1408
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1403

def on_buffer(_event)
  case _event
    when BufferRaisedEvent
      @raised_file=_event.file
  end
end

#on_build(_event) ⇒ Object



1399
1400
1401
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1399

def on_build(_event)
  #Arcadia.attach_listener(self, DebugEvent)
end

#on_debug(_event) ⇒ Object



1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1410

def on_debug(_event)
  case _event
    when StartDebugEvent
      _filename = _event.file
      _filename = @arcadia['pers']['run.file.last'] if _filename == "*LAST"
      if File.exist?(_filename)
        debug(_filename)
      else
        Arcadia.dialog(self,
          'type'=>'ok',
          'title'=>'File not exist',
          'msg'=>"File #{_filename} not exist!")
      end
    when StepDebugEvent
      if (_event.command == :quit_yes)
        @rds.quit_confirm_request = true
      end
      @rdc.send(_event.command) if @rdc.is_alive?
      
      #p "on_debug -> Thread.current=#{Thread.current}"

      #p "on_debug --> @rdc.is_alive?=#{@rdc.is_alive?}"
      #p "on_debug --> @rds.is_alive?=#{@rds.is_alive?}"
    when SetBreakpointEvent
      self.breakpoint_add(File.expand_path(_event.file), _event.row)
    when UnsetBreakpointEvent
      self.breakpoint_del(File.expand_path(_event.file), _event.row)
    when EvalExpressionEvent
      eval_expression(_event.expression)
    when StopDebugEvent
      self.debug_quit
  end
end

#on_exit_query(_event) ⇒ Object



1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1515

def on_exit_query(_event)
  if @rdc && @rdc.is_alive?
    query = (Tk.messageBox('icon' => 'question', 'type' => 'yesno',
    'title' => '(Arcadia) Debug',
    'message' => "Debug in course, do you want to exit?")=='yes')
    if query
      debug_quit
      _event.can_exit=true
    else
      _event.can_exit=false
    end
  else
    _event.can_exit=true
  end
end

#rdebug_server_update(_state) ⇒ Object



1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
# File 'ext/ae-ruby-debug/ae-ruby-debug.rb', line 1577

def rdebug_server_update(_state)
  case _state
    when RubyDebugServer::RDS_QUIET
      @rdc.kill if @rdc
      #p "@rdc.is_alive?=#{@rdc.is_alive?}"
      #p "rdebug_server_update -> Thread.current=#{Thread.current}"
      #@rdv.command_enabled(false)
      #debug_free
  end
end