001 package nl.cwi.sen1.tide.adapters.gdb; 002 003 import java.util.HashMap; 004 import java.util.List; 005 import java.util.Map; 006 007 import nl.cwi.sen1.tide.adapters.DebugAdapterProcess; 008 import nl.cwi.sen1.tide.adapters.DebugAdapterRule; 009 import aterm.ATerm; 010 import aterm.ATermFactory; 011 012 public class GdbProcess extends DebugAdapterProcess implements Runnable { 013 private GdbAdapter adapter; 014 private Thread thread; 015 016 private int pid = -1; 017 private String file; 018 private int line; 019 private int stackLevel; 020 private Map<Integer, DebugAdapterRule> rulesByBreak; 021 private Map<DebugAdapterRule, Integer> breaksByRule; 022 023 private ATermFactory factory; 024 025 public GdbProcess(GdbAdapter adapter, String name) { 026 super(adapter, name); 027 this.adapter = adapter; 028 this.factory = adapter.getFactory(); 029 030 rulesByBreak = new HashMap<Integer, DebugAdapterRule>(); 031 breaksByRule = new HashMap<DebugAdapterRule, Integer>(); 032 } 033 034 public int getPid() { 035 return pid; 036 } 037 public void setPid(int pid) { 038 this.pid = pid; 039 } 040 041 public void setCpe(String file, int line) { 042 this.file = file; 043 this.line = line; 044 } 045 public void setStackLevel(int level) { 046 stackLevel = level; 047 } 048 049 public void handleRuleCreation(DebugAdapterRule rule) { 050 super.handleRuleCreation(rule); 051 List<?> result; 052 053 result = rule.getAction().match("location(pos(<str>,<int>,<int>))"); 054 if (result != null) { 055 String file = (String) result.get(0); 056 int linenr = ((Integer) result.get(1)).intValue(); 057 SetBreakpointCmd cmd = new SetBreakpointCmd(adapter, file, linenr); 058 adapter.evaluate(cmd); 059 Integer brk = new Integer(cmd.getBreakpoint()); 060 breaksByRule.put(rule, brk); 061 rulesByBreak.put(brk, rule); 062 adapter.writeln("disable " + brk); 063 } 064 } 065 066 public void handleRuleDestruction(DebugAdapterRule rule) { 067 super.handleRuleDestruction(rule); 068 Integer brk = breaksByRule.get(rule); 069 if (brk != null) { 070 adapter.writeln("delete " + brk); 071 breaksByRule.remove(rule); 072 rulesByBreak.remove(brk); 073 } 074 } 075 076 public void handleRuleEnabling(DebugAdapterRule rule) { 077 super.handleRuleEnabling(rule); 078 Integer brk = breaksByRule.get(rule); 079 if (brk != null) { 080 adapter.writeln("enable " + brk); 081 } 082 } 083 public void handleRuleDisabling(DebugAdapterRule rule) { 084 super.handleRuleDisabling(rule); 085 Integer brk = breaksByRule.get(rule); 086 if (brk != null) { 087 adapter.writeln("disable " + brk); 088 } 089 } 090 091 public void doResume() { 092 System.out.println("doResume called"); 093 fireRules(DebugAdapterRule.PORT_STARTED); 094 super.doResume(); 095 096 thread = new Thread(this); 097 thread.start(); 098 } 099 100 private void debugMsg(String msg) { 101 System.err.println(msg); 102 } 103 104 public void doBreak() { 105 debugMsg("break not supported (yet!)"); 106 super.doBreak(); 107 108 /* TODO: find out what this is supposed to do 109 try { 110 Runtime.getRuntime().exec("/usr/bin/kill -INT " + pid); 111 } catch (IOException e) { 112 System.err.println( 113 "could not execute '/usr/bin/kill' to kill program: " 114 + e.getMessage()); 115 } 116 */ 117 } 118 119 public ATerm actionCpe() { 120 if (file == null) { 121 debugMsg("current cpe is unknown"); 122 return factory.make("cpe(unknown)"); 123 } 124 debugMsg("current cpe is in file:" + file + ", line: " + line); 125 return factory.make( 126 "location(line(<str>,<int>))", 127 file, 128 new Integer(line)); 129 } 130 131 public ATerm actionSourceVar(ATerm file, ATerm offset, ATerm line, ATerm col, ATerm text) { 132 RetrieveVarCmd cmd = new RetrieveVarCmd(adapter, file, offset, line, col, text); 133 adapter.evaluate(cmd); 134 return cmd.getValue(); 135 } 136 137 public int getStackLevel() { 138 return stackLevel; 139 } 140 141 public void run() { 142 fireRules(DebugAdapterRule.PORT_STARTED); 143 while (getExecState() == STATE_RUNNING) { 144 ContinueCmd cmd = new ContinueCmd(adapter, this); 145 adapter.evaluate(cmd); 146 fireRules(DebugAdapterRule.PORT_STEP); 147 // TODO: find out why this was necessary? 148 // fireLocationRules(file, line, 0, line, -1); 149 } 150 fireRules(DebugAdapterRule.PORT_STOPPED); 151 } 152 153 //} 154 }