annotate src/cli/userinterface.d @ 5:496dfd8f7342 default tip

added: -repeat option for "in", "ov" -run until a line option -run until a function option -break on a function start -n is an alias for ov
author marton@basel.hu
date Sun, 17 Apr 2011 11:05:31 +0200
parents 4a9dcbd9e54f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1 /* Ddbg - Win32 Debugger for the D programming language
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
2 * Copyright (c) 2007 Jascha Wetzel
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
3 * All rights reserved. See LICENSE.TXT for details.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
4 */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
5 module cli.userinterface;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
6
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
7 import breakpoint;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 import dbgprocess;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
9 import dbgthread;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
10 import debugger;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11 import expression.datahandler;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14 import disasm;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15 import codeview.coff;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
16
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
17 import win32.winnt;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
18
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
19 import std.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
20 import std.c.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
21 import std.utf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
22
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
23 interface UserInterface
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
24 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
25 void init(string[] args);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
26 int start();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
27
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
28 bool readCommand();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
29 bool parseCommand(string cmd);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
30 void runCommands(string cmdstr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
31
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32 void debugString(string str);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
33 bool breakpoint(int index, Breakpoint bp, DbgThread thread);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
34 void userInterrupt();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35 void exception(uint threadId, string class_name, string msg, size_t obj_ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
36 void win32exception(uint threadId, EXCEPTION_RECORD* exrec);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
37 void loadedDLL(DLL dll);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 void exitProcess();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39 void singleStep();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
40 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
41
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
42 struct StackTraceEntry
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
43 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
44 uint index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
45 Location loc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
46 uint frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
47 CodeBlock last_known_cb;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
48
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
49 void describe(UserInterfaceBase ui)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
50 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
51 DbgIO.print("#%d ", index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 if ( loc is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 DbgIO.println("<no debug symbols available>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 return;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
55 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
56 if ( index > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
57 DbgIO.print("0x%08x in ", loc.address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
58 if ( loc.scope_sym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
60 ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
61
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62 string argstr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 bool first = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64 foreach_reverse ( argsym; psym.arguments.stack_symbols )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
65 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
66 string name = argsym.name_notype;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67 if ( !first )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 argstr ~= ", ";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70 first = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71 argstr ~= argsym.name_notype;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 try {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73 SymbolValue symval = ui.dbg.handleData(ui.dbg.evaluateExpression(name, frame_level), false);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 argstr ~= " = "~ui.symbolValueToString(symval);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 catch ( Exception e ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
77 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
78 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
79 int end = find(psym.name_type, '('),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
80 start = find(psym.name_type, ' ');
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
81 if ( end < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
82 end = psym.name_type.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
83 if ( start < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 start = 0;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85 if ( end-start < 2 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
86 start = 0;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
87 DbgIO.print("%s (", psym.name_type[start..end]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
88 DbgIO.write(argstr~") ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
89 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
90 else if ( loc.data_sym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 DbgIO.print(loc.data_sym.name_type, " () ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 DbgIO.print("?? () ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
94 if ( loc.codeblock !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
95 DbgIO.print("at %s:%d", loc.file, loc.line);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
96 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
97 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
98 if ( last_known_cb !is null && last_known_cb.segment !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 DbgIO.print("at %s:%d ", last_known_cb.segment.file.name, last_known_cb.line);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100 if ( loc.mod !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 DbgIO.print("from %s", loc.mod.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102 else if ( ui.dbg.process !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
103 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
104 DLL dll = ui.dbg.process.findDLL(loc.address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
105 if ( dll !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
106 DbgIO.print("from %s", dll.image.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
107 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
108 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
109 DbgIO.println("");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
110 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
111 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
112
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
113 abstract class UserInterfaceBase : UserInterface
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
114 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
115 CodeBlock last_codeblock;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116 Module last_module;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117 DLL last_dll;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
118
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
119 Debugger dbg;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
120
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
121 string[] cmdQueue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
122
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
123 void printAsmLine(uint address, string bytes, string asmsource, string symbol, string location, string source);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
124 string symbolValueToString(SymbolValue val);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
125
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
126 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
128 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
129 void unwindStack()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
130 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
131 StackTraceEntry[] entries;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
132
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
133 uint index,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 counter,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136 debug DbgIO.println("Stack: base 0x%x top 0x%x frame 0x%x", dbg.stack.base_ptr, dbg.stack.top_ptr, dbg.stack.frame_ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 Location loc = dbg.images.findLocation(dbg.current_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138 if ( loc is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139 loc = new Location(dbg.current_address, null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140 entries ~= StackTraceEntry(counter++, loc, frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
141
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
142 dbg.stack.firstFrame(index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
143 ubyte[] frame = dbg.stack.prevFrame(index, index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 size_t next_frame=1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
145 while ( frame !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
146 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
147 uint ret_adr = (cast(uint[])frame)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 loc = dbg.images.findLocation(ret_adr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
149 if ( loc is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
150 loc = new Location(ret_adr, null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151 frame = dbg.stack.prevFrame(index, index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152 ++frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 if ( next_frame >= entries.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 entries.length = entries.length*2+1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155 entries[next_frame++] = StackTraceEntry(counter++, loc, frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157 entries.length = next_frame;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 CodeBlock last_known_cb;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
160 foreach_reverse ( ref ste; entries )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
161 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 if ( ste.loc !is null && ste.loc.codeblock !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
163 last_known_cb = ste.loc.codeblock;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
164 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
165 ste.last_known_cb = last_known_cb;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
166 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
167
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
168 foreach ( ste; entries )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
169 ste.describe(this);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
170 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
171
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
172 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
173 Prints an instruction with looked up symbols if existant.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
174 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
175 bool printDisassembly(ud_t* ud_obj)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
176 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
177 // first call
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 if ( ud_obj is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179 last_codeblock = null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
181 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
182
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
183 uint address = cast(uint)ud_insn_off(ud_obj);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 string source, location;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
186 // check whether we have symbols here
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
187 Location loc = dbg.images.findLocation(address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
188 if ( loc.codeblock !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
189 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
190 if ( last_codeblock !is loc.codeblock )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192 last_codeblock = loc.codeblock;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 string[] source_file = dbg.getSourceFile(loc.file);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
194 location = format("%s:%d", loc.file, loc.line);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
195 if ( source_file !is null && loc.line <= source_file.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
196 source = source_file[loc.line-1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
197 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
198 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
199 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
200 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
201 CodeView cv;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
202 CodeBlock cb = dbg.images.findCodeBlockRel(address, cv);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
203 if ( cb !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
204 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
205 if ( last_codeblock !is cb )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
206 last_codeblock = cb;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
207 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
208 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
209 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
210 uint seg;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
211 Module mod = dbg.images.findModule(address, seg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
212 if ( mod !is null && last_module !is mod ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
213 last_module = mod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
214 location = mod.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
215 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
218 DLL dll = dbg.process.findDLL(address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
219 if ( dll !is null && last_dll !is dll ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 last_dll = dll;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
221 location = dll.image.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
222 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
223 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
224 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
225 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
226
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
227 string symbol;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
228 bool is_imm=true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
229 uint jmp_dest = DisAsm.calcJumpDestination(dbg.process, dbg.process.threads[dbg.thread_id], ud_obj, is_imm);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
230 if ( is_imm && jmp_dest>0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
231 symbol = "\t"~describeLocation(jmp_dest, false);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
232
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
233 char* hex = ud_insn_hex(ud_obj);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
234 uint hexlen = strlen(hex);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
235 char* ins = ud_insn_asm(ud_obj);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
236
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
237 printAsmLine(address, hex[0..hexlen], ins[0..strlen(ins)], symbol, location, source);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
238 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
239 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
240
5
marton@basel.hu
parents: 1
diff changeset
241 /**********************************************************************************************
marton@basel.hu
parents: 1
diff changeset
242 prints information about symbol (not recursive)
marton@basel.hu
parents: 1
diff changeset
243 **********************************************************************************************/
marton@basel.hu
parents: 1
diff changeset
244
marton@basel.hu
parents: 1
diff changeset
245 void printSymbol( NamedSymbol ns, uint indent=0)
marton@basel.hu
parents: 1
diff changeset
246 {
marton@basel.hu
parents: 1
diff changeset
247
marton@basel.hu
parents: 1
diff changeset
248 {
marton@basel.hu
parents: 1
diff changeset
249
marton@basel.hu
parents: 1
diff changeset
250
marton@basel.hu
parents: 1
diff changeset
251 char[] indent_str;
marton@basel.hu
parents: 1
diff changeset
252 indent_str.length = indent*2;
marton@basel.hu
parents: 1
diff changeset
253 indent_str[0..indent*2] = ' ';
marton@basel.hu
parents: 1
diff changeset
254 ClassInfo cs = ns.classinfo;
marton@basel.hu
parents: 1
diff changeset
255 if ( cs == ProcedureSymbol.classinfo )
marton@basel.hu
parents: 1
diff changeset
256 {
marton@basel.hu
parents: 1
diff changeset
257 ProcedureSymbol ps = cast(ProcedureSymbol)ns;
marton@basel.hu
parents: 1
diff changeset
258
marton@basel.hu
parents: 1
diff changeset
259 DbgIO.println("%s%s %d arguments",
marton@basel.hu
parents: 1
diff changeset
260 indent_str, ps.name_type, ps.arguments.symbols.length
marton@basel.hu
parents: 1
diff changeset
261 );
marton@basel.hu
parents: 1
diff changeset
262 }
marton@basel.hu
parents: 1
diff changeset
263 else if ( cs == StackSymbol.classinfo ) {
marton@basel.hu
parents: 1
diff changeset
264 StackSymbol ss = cast(StackSymbol)ns;
marton@basel.hu
parents: 1
diff changeset
265 DbgIO.println("%s%s stack (%s) %x ebp%s%d", indent_str, ns.name_type, ns.mangled_name, ss.cvtype, ss.offset>=0?"+":"", ss.offset);
marton@basel.hu
parents: 1
diff changeset
266 }
marton@basel.hu
parents: 1
diff changeset
267 else if ( cs == DataSymbol.classinfo )
marton@basel.hu
parents: 1
diff changeset
268 {
marton@basel.hu
parents: 1
diff changeset
269 DataSymbol ds = cast(DataSymbol)ns;
marton@basel.hu
parents: 1
diff changeset
270 DbgIO.println("%s%s (%s) data offset: 0x%x size: 0x%x segment: 0x%x type: 0x%x (%s)", indent_str, ds.name_type, ds.name_notype,
marton@basel.hu
parents: 1
diff changeset
271 ds.offset, ds.size, ds.cvdata.segment, ds.cvdata.type, dbg.images.mangleCVtype(ds.cvdata.type)
marton@basel.hu
parents: 1
diff changeset
272 );
marton@basel.hu
parents: 1
diff changeset
273 }
marton@basel.hu
parents: 1
diff changeset
274 else
marton@basel.hu
parents: 1
diff changeset
275 DbgIO.println("%s%s %s", indent_str, ns.name_type, cs.name);
marton@basel.hu
parents: 1
diff changeset
276 ScopeSymbol scs = cast(ScopeSymbol)ns;
marton@basel.hu
parents: 1
diff changeset
277 //if ( scs !is null )
marton@basel.hu
parents: 1
diff changeset
278 // printSymbols(cv, scs.symbols.named_symbols, indent+1);
marton@basel.hu
parents: 1
diff changeset
279 }
marton@basel.hu
parents: 1
diff changeset
280 }
marton@basel.hu
parents: 1
diff changeset
281
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
282 /**********************************************************************************************
5
marton@basel.hu
parents: 1
diff changeset
283 prints symbols that contain substring with indentation indent
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
284 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
285 void printSymbols(CodeView cv, NamedSymbol[] syms, string substring=null, uint indent=0)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
286 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
287 foreach ( ns; syms )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
288 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
289 if ( substring.length > 0 && find(ns.name_notype, substring)<0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
290 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
291
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
292 char[] indent_str;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
293 indent_str.length = indent*2;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
294 indent_str[0..indent*2] = ' ';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
295 ClassInfo cs = ns.classinfo;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
296 if ( cs == ProcedureSymbol.classinfo )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
297 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
298 ProcedureSymbol ps = cast(ProcedureSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
299 size_t start = ps.cvdata.offset+cv.getCodeBase;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
300 DbgIO.println("%s%s %d arguments, entry 0x%x, debug start 0x%x, debug end 0x%x",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
301 indent_str, ps.name_type, ps.arguments.symbols.length, start,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
302 start+ps.cvdata.debug_start, start+ps.cvdata.debug_end
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
303 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
304 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
305 else if ( cs == StackSymbol.classinfo ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
306 StackSymbol ss = cast(StackSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
307 DbgIO.println("%s%s stack (%s) %x ebp%s%d", indent_str, ns.name_type, ns.mangled_name, ss.cvtype, ss.offset>=0?"+":"", ss.offset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
308 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
309 else if ( cs == DataSymbol.classinfo )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
310 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
311 DataSymbol ds = cast(DataSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
312 DbgIO.println("%s%s (%s) data offset: 0x%x size: 0x%x segment: 0x%x type: 0x%x (%s)", indent_str, ds.name_type, ds.name_notype,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
313 ds.offset, ds.size, ds.cvdata.segment, ds.cvdata.type, dbg.images.mangleCVtype(ds.cvdata.type)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
314 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
315 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
316 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
317 DbgIO.println("%s%s %s", indent_str, ns.name_type, cs.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
318 ScopeSymbol scs = cast(ScopeSymbol)ns;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
319 if ( scs !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
320 printSymbols(cv, scs.symbols.named_symbols, substring, indent+1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
321 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
322 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
323
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
324 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
325
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
326 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
327 string describeLocation(uint vaddress, bool with_address=true)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
328 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
329 Location loc = dbg.images.findLocation(vaddress);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
330 return describeLocation(loc, with_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
331 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
332
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
333 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
334
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
335 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
336 string describeLocation(Location loc, bool with_address=true)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
337 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
338 string desc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
339
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
340 if ( loc is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
341 return "unknown";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
342
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
343 if ( loc.codeblock !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
344 desc = format("%s:%d", loc.file, loc.line);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
345 if ( with_address )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
346 desc ~= (desc.length>0?" ":"")~format("(0x%08x)", loc.address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
347
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
348 if ( loc.scope_sym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
349 return loc.scope_sym.name_notype~" "~desc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
350 if ( loc.data_sym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
351 return loc.data_sym.name_notype~" "~desc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
352 if ( loc.mod !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
353 return loc.mod.name~" "~desc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
354 if ( dbg.process !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
355 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
356 DLL dll = dbg.process.findDLL(loc.address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
357 if ( dll !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
358 return dll.image.name~" "~desc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
359 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
360
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
361 return desc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
362 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
363
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
364 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
365
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
366 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
367 void runCommands(string cmd_string)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
368 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
369 cmd_string = replace(cmd_string, "\\\"", "\"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
370 auto r = std.regexp.RegExp("(([^;\" \\t]+)|(\"[^\"]+\"))+|;");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
371 string cmd;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
372 string[] cmds;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
373 foreach ( m; r.search(cmd_string) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
374 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
375 if ( m.match(0) == ";" ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
376 cmdQueue ~= cmd~";";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
377 cmd = null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
378 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
379 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
380 cmd ~= " "~m.match(0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
381 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
382 if ( cmd !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
383 cmdQueue ~= cmd~";";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
384 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
385 }