annotate src/cli/ddbgcli.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 a5fb1bc967e6
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.ddbgcli;
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 std.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 static import std.regexp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
9 import std.c.stdio : sscanf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
10 import std.c.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11 import std.demangle;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 import minidump;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14 import container;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
16 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
17 import breakpoint;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
18 import debugger;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
19 import disasm;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
20 import callstack;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
21 import dbgprocess;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
22 import dbgthread;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
23 import expression.expression_apd;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
24 import expression.datahandler : SymbolValue, DataHandler;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
25 import expression.evaluationcontext;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
26 import cli.userinterface;
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 import win32.winbase;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
29 import win32.winuser;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
30 import win32.winnt;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
31 import win32.dbghelp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
33 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
34
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
36 class DdbgCLI : UserInterfaceBase
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
37 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 const int PRINT_SOURCE_LINES = 3;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
40 string[] lastcmd,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
41 onexCommands,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
42 ontermCommands;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
43 string debuggee,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
44 command_line;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
45
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
46 uint current_frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
47
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
48 bool quit;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
49
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
50 const ubyte CPU_REGISTERS = 1,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
51 FPU_REGISTERS = 2,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 MMX_REGISTERS = 4,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 SSE_REGISTERS = 8;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 ubyte dump_registers = CPU_REGISTERS;
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 uint lastEvaluationDepth = 1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
57
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
58 bool auto_find_scope_frame, /// find frame of last active scope if current frame has no source/symbols
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59 jump_to_last_known_location_on_exception = true;
5
marton@basel.hu
parents: 4
diff changeset
60
marton@basel.hu
parents: 4
diff changeset
61 uint repeat = 0;
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64
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 void init(string[] args)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 DbgIO.println(WELCOME_STRING);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 if ( args.length < 2 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70 throw new DebuggerException("Usage: ddbg [-cli=<mode>] [-cmd=<commands>] <exe file> [arguments]");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 debuggee = args[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73 foreach ( inout arg; args )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 if ( find(arg, ' ') >= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 arg = "\""~arg~"\"";
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 command_line = join(args[1..$], " ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
79
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
80 dbg = new Debugger(debuggee, this);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
81 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
82
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
83 int start()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85 while ( !quit )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
86 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
87 debug
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
88 readCommand();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
89 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
90 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 try readCommand();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92 catch ( Exception e )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 DbgIO.println(e.msg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
94 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
95 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
96 return 0;
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102 void singleStep()
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 DbgIO.println(describeLocation(dbg.current_address));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
105 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
106
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 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
110 void exitProcess()
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 DbgIO.println("Process terminated");
5
marton@basel.hu
parents: 4
diff changeset
113 repeat = 0;
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
114 cmdQueue ~= ontermCommands;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
115 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117 /**********************************************************************************************
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 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
120 void loadedDLL(DLL dll)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
121 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
122 if( dll !is null && dll.image.name.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
123 DbgIO.write(dll.image.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
124 DbgIO.println(" loaded at 0x%08x", dll.base);
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 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127 DbgIO.writeln("unknown DLL loaded");
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
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
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 void win32exception(uint threadId, EXCEPTION_RECORD* exrec)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 DbgIO.println(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136 "Unhandled Exception: %s(0x%x) at %s thread(%d)",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 getExceptionName(exrec.ExceptionCode), exrec.ExceptionCode, describeLocation(dbg.current_address), threadId
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140
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
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
143 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 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
145 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
146 if ( jump_to_last_known_location_on_exception )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
147 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 uint index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
149 current_frame_level = 0;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
150 Location loc = dbg.images.findLocation(dbg.current_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152 if ( loc.codeblock is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 dbg.stack.firstFrame(index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155 ubyte[] frame = dbg.stack.prevFrame(index, index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 while ( loc.codeblock is null && frame !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158 uint ret_adr = (cast(uint[])frame)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 loc = dbg.images.findLocation(ret_adr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
160 frame = dbg.stack.prevFrame(index, index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
161 ++current_frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
163 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
164 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
165
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
166 DbgIO.println("Unhandled D Exception (%s", class_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
167 DbgIO.write(msg.length>0?" \""~msg~"\"":"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
168 DbgIO.println(") at %s thread(%d)", describeLocation(dbg.current_address), threadId);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
169 cmdQueue ~= onexCommands;
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
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 void userInterrupt()
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 DbgIO.println("User interrupt at %s", describeLocation(dbg.current_address));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 /**********************************************************************************************
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 bool breakpoint(int index, Breakpoint bp, DbgThread thread)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185 if ( bp.hardware )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
186 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
187 DbgIO.println("Hardware breakpoint for 0x%x hit at %s thread(%d)",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
188 bp.address, describeLocation(dbg.current_address), thread.id
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 else if ( bp.file is null || bp.line == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192 DbgIO.println("Unknown breakpoint hit at %s thread(%d)", describeLocation(bp.address), thread.id);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
194 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
195 string[] source = dbg.getSourceFile(bp.file);
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
196 string source_lines;
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
197 if ( source !is null && bp.line <= source.length )
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
198 {
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
199 const showmore= 2;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
200 int startfrom = bp.line- 1 - showmore;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
201 int startend = bp.line- 1 + showmore;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
202 if (startfrom <0)
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
203 startfrom=0;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
204 if (startend >=source.length)
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
205 startend=source.length-1;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
206 int left = showmore;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
207 foreach (line;source[startfrom..startend+1])
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
208 {
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
209 if (left==0)
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
210 source_lines ~= ">>"~line ~"\n";
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
211 else
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
212 source_lines ~= " "~line ~"\n";
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
213 left--;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
214 }
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
215 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 if ( !bp.temporary )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
218 DbgIO.print("Breakpoint %d hit at ", index);
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
219 debug DbgIO.println("before printing location info");
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 DbgIO.println("%s:%d 0x%x thread(%d)", bp.file, bp.line, bp.address, thread.id);
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
221 if ( source_lines.length > 0 )
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
222 DbgIO.write(source_lines);
1
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 return true;
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 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
228
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
229 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
230 void debugString(string str)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
231 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
232 printf("OUTPUT DEBUG STRING:\n%s\n", toStringz(str));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
233 }
5
marton@basel.hu
parents: 4
diff changeset
234 bool setBreakpointByFunctionname(char[][] lastcmd,uint threadId, int index)
marton@basel.hu
parents: 4
diff changeset
235 {
marton@basel.hu
parents: 4
diff changeset
236 DataSymbol[] ds;
marton@basel.hu
parents: 4
diff changeset
237 size_t codebase;
marton@basel.hu
parents: 4
diff changeset
238 // int index;
marton@basel.hu
parents: 4
diff changeset
239
marton@basel.hu
parents: 4
diff changeset
240 foreach ( img; dbg.images.images )
marton@basel.hu
parents: 4
diff changeset
241 {
marton@basel.hu
parents: 4
diff changeset
242 if ( img.codeView is null )
marton@basel.hu
parents: 4
diff changeset
243 continue;
marton@basel.hu
parents: 4
diff changeset
244 DataSymbol[] tds;
marton@basel.hu
parents: 4
diff changeset
245 ds ~= img.codeView.global_pub.findDataSymbolBySubstring(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
246 ds ~= img.codeView.global_sym.findDataSymbolBySubstring(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
247 ds ~= img.codeView.static_sym.findDataSymbolBySubstring(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
248
marton@basel.hu
parents: 4
diff changeset
249 foreach ( m; img.codeView.modulesByIndex )
marton@basel.hu
parents: 4
diff changeset
250 ds ~= m.symbols.findDataSymbolBySubstring(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
251 if (ds.length>0)
marton@basel.hu
parents: 4
diff changeset
252 codebase=img.getCodeBase;
marton@basel.hu
parents: 4
diff changeset
253
marton@basel.hu
parents: 4
diff changeset
254 }
marton@basel.hu
parents: 4
diff changeset
255 debug DbgIO.println("Found candidates:%d",ds.length);
marton@basel.hu
parents: 4
diff changeset
256 if (ds.length==1)
marton@basel.hu
parents: 4
diff changeset
257 {
marton@basel.hu
parents: 4
diff changeset
258 //Location loc = new Location(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
259 //loc.bind(dbg.images, dbg.source_search_paths);
marton@basel.hu
parents: 4
diff changeset
260 if (index>=0)
marton@basel.hu
parents: 4
diff changeset
261 if ( lastcmd.length > 2 )
marton@basel.hu
parents: 4
diff changeset
262 index = cast(int)atoi(lastcmd[2]);
marton@basel.hu
parents: 4
diff changeset
263
marton@basel.hu
parents: 4
diff changeset
264 Breakpoint bp;
marton@basel.hu
parents: 4
diff changeset
265 if (index>=0) // not temporary
marton@basel.hu
parents: 4
diff changeset
266 {if ( index <= 0 && dbg.breakpoints.length > 0 )
marton@basel.hu
parents: 4
diff changeset
267 index = dbg.breakpoints.keys.dup.sort[$-1]+1;
marton@basel.hu
parents: 4
diff changeset
268 }
marton@basel.hu
parents: 4
diff changeset
269 else
marton@basel.hu
parents: 4
diff changeset
270 index=-1;
marton@basel.hu
parents: 4
diff changeset
271 bp = dbg.setBreakpoint(ds[0].offset+codebase, index, threadId);
marton@basel.hu
parents: 4
diff changeset
272
marton@basel.hu
parents: 4
diff changeset
273 DbgIO.println("Breakpoint set: %s", bp.toString);
marton@basel.hu
parents: 4
diff changeset
274 }
marton@basel.hu
parents: 4
diff changeset
275 else
marton@basel.hu
parents: 4
diff changeset
276 if (ds.length==0)
marton@basel.hu
parents: 4
diff changeset
277 {
marton@basel.hu
parents: 4
diff changeset
278 DbgIO.println("Breakpoint is not set:no matching functions are found!");
marton@basel.hu
parents: 4
diff changeset
279 return false;
marton@basel.hu
parents: 4
diff changeset
280 }
marton@basel.hu
parents: 4
diff changeset
281 else
marton@basel.hu
parents: 4
diff changeset
282 {
marton@basel.hu
parents: 4
diff changeset
283 DbgIO.println("Breakpoint is not set:too many matching functions are found!");
marton@basel.hu
parents: 4
diff changeset
284 int maxi=ds.length;
marton@basel.hu
parents: 4
diff changeset
285 if (maxi>20)
marton@basel.hu
parents: 4
diff changeset
286 {
marton@basel.hu
parents: 4
diff changeset
287 DbgIO.println("There are more than 20 possibilities, first twenty is snown:");
marton@basel.hu
parents: 4
diff changeset
288 maxi=20;
marton@basel.hu
parents: 4
diff changeset
289 }
marton@basel.hu
parents: 4
diff changeset
290 else
marton@basel.hu
parents: 4
diff changeset
291 {
marton@basel.hu
parents: 4
diff changeset
292 DbgIO.println("These are the matched function names:");
marton@basel.hu
parents: 4
diff changeset
293 }
marton@basel.hu
parents: 4
diff changeset
294 foreach (s;ds[0..maxi])
marton@basel.hu
parents: 4
diff changeset
295 {
marton@basel.hu
parents: 4
diff changeset
296 //DbgIO.println(s.name_notype);
marton@basel.hu
parents: 4
diff changeset
297 printSymbol(s);
marton@basel.hu
parents: 4
diff changeset
298 }
marton@basel.hu
parents: 4
diff changeset
299 return false;
marton@basel.hu
parents: 4
diff changeset
300 }
marton@basel.hu
parents: 4
diff changeset
301 return true;
marton@basel.hu
parents: 4
diff changeset
302 }
1
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 Command line parser. Gets called when debuggee is suspended.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
306 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
307 bool parseCommand(string input)
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 if ( strip(input).length > 0 )
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 auto r = std.regexp.RegExp("(([^\" \\t]+)|(\"[^\"]+\"))+");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
312 lastcmd.length = 0;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
313 foreach ( m; r.search(input) )
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
314 {
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
315 //DbgIO.writeln("match:"~r.match(0));
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
316 lastcmd ~= r.match(0);
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
317 }
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
318
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
319 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
320 if ( lastcmd.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
321 return false;
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
322 if (lastcmd[0][0]=='=' && lastcmd[0].length>1)
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
323 {
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
324 DbgIO.writeln("after ="~lastcmd[0][1..$]);
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
325 lastcmd=["=",lastcmd[0][1..$]]~lastcmd[1..$];
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
326 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
327 switch ( lastcmd[0] )
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 case "help":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
330 case "h":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
331 case "?":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
332 DbgIO.write(import("ddbg_help.txt"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
333 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
334 case "=":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
335 if ( !dbg.process_loaded && dbg.miniDump is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
336 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
337 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
338 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
339 try DbgIO.writeln(symbolValueToString(dbg.handleData(dbg.evaluateExpression(lastcmd[1], current_frame_level), false)));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
340 catch ( EvaluationException e ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
341 DbgIO.writeln(e.toString);
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 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
344 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
345 case "arg":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
346 if ( dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
347 DbgIO.println("Warning: process already started");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
348 command_line = debuggee~" "~join(lastcmd[1..$], " ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
349 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
350 // add breakpoint
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
351 case "bp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
352 int index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
353 if ( lastcmd.length < 2 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
354 DbgIO.println("invalid syntax - see help for details");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
355 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
356 }
5
marton@basel.hu
parents: 4
diff changeset
357
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
358 int pos = find(lastcmd[1], '#');
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
359 uint threadId;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
360 if ( pos > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
361 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
362 threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
363 lastcmd[1] = lastcmd[1][0..pos];
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 Location loc = new Location(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
366 loc.bind(dbg.images, dbg.source_search_paths);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
367 if ( lastcmd.length > 2 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
368 index = cast(int)atoi(lastcmd[2]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
369
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
370 Breakpoint bp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
371 if ( index <= 0 && dbg.breakpoints.length > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
372 index = dbg.breakpoints.keys.dup.sort[$-1]+1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
373 bp = dbg.setBreakpoint(loc, index, threadId);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
374 DbgIO.println("Breakpoint set: %s", bp.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
375 break;
5
marton@basel.hu
parents: 4
diff changeset
376 case "bpf":
marton@basel.hu
parents: 4
diff changeset
377 int index;
marton@basel.hu
parents: 4
diff changeset
378 if ( lastcmd.length < 2 ) {
marton@basel.hu
parents: 4
diff changeset
379 DbgIO.println("invalid syntax - see help for details");
marton@basel.hu
parents: 4
diff changeset
380 break;
marton@basel.hu
parents: 4
diff changeset
381 }
marton@basel.hu
parents: 4
diff changeset
382
marton@basel.hu
parents: 4
diff changeset
383 int pos = find(lastcmd[1], '#');
marton@basel.hu
parents: 4
diff changeset
384 uint threadId;
marton@basel.hu
parents: 4
diff changeset
385 if ( pos > 0 )
marton@basel.hu
parents: 4
diff changeset
386 {
marton@basel.hu
parents: 4
diff changeset
387 threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
marton@basel.hu
parents: 4
diff changeset
388 lastcmd[1] = lastcmd[1][0..pos];
marton@basel.hu
parents: 4
diff changeset
389 }
marton@basel.hu
parents: 4
diff changeset
390 if (lastcmd.length>1)
marton@basel.hu
parents: 4
diff changeset
391 setBreakpointByFunctionname(lastcmd,threadId,0);
marton@basel.hu
parents: 4
diff changeset
392 break;
marton@basel.hu
parents: 4
diff changeset
393
marton@basel.hu
parents: 4
diff changeset
394
marton@basel.hu
parents: 4
diff changeset
395
marton@basel.hu
parents: 4
diff changeset
396 break;
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
397 // delete breakpoint
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
398 case "dbp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
399 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
400 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
401 if ( lastcmd[1] == "*" )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
402 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
403 foreach ( uint i; dbg.breakpoints.keys )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
404 dbg.removeBreakpoint(i);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
405 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
406 else if ( isNumeric(lastcmd[1]) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
407 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
408 if ( !dbg.removeBreakpoint(cast(uint)atoi(lastcmd[1])) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
409 DbgIO.println("invalid breakpoint index: %s",lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
410 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
411 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
412 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
413 Location loc = new Location(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
414 loc.bind(dbg.images, dbg.source_search_paths);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
415 if ( loc !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
416 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
417 int bp_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
418 dbg.getBreakpoint(loc, bp_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
419 if ( bp_index >= 0 && !dbg.removeBreakpoint(bp_index) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
420 DbgIO.println("No breakpoint set at "~lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
421 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
422 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
423 DbgIO.println("dbp [<source file>:<line>|#index|*]");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
424 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
425 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
426 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
427 DbgIO.println("dbp [<source file>:<line>|#index|*]");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
428 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
429 // set evaluation depth
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
430 case "er":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
431 lastcmd.length = 1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
432 if ( dbg.evaluationDepth > 1 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
433 lastEvaluationDepth = dbg.evaluationDepth;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
434 lastcmd ~= "1";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
435 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
436 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
437 lastcmd ~= .toString(lastEvaluationDepth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
438 case "ed":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
439 if ( lastcmd.length < 2 || !isNumeric(lastcmd[1]) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
440 DbgIO.println("Usage: ed <depth>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
441 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
442 dbg.evaluationDepth = cast(int)atoi(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
443 DbgIO.println("Expression evaluation depth is %d", dbg.evaluationDepth);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
444 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
445 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
446 case "el":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
447 if ( lastcmd.length < 2 || !isNumeric(lastcmd[1]) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
448 DbgIO.println("Usage: el <length>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
449 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
450 DataHandler.max_elem_count = cast(int)atoi(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
451 DbgIO.println("Array evaluation length is %d", DataHandler.max_elem_count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
452 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
453 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
454 // select frame
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
455 case "f":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
456 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
457 current_frame_level = cast(uint)atoi(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
458 DbgIO.println("Current frame level is %d", current_frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
459 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
460 // image base address
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
461 case "ii":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
462 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
463 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
464 uint ibase = img.imageBase;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
465 DbgIO.println("ImageBase\t0x%x", ibase);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
466 DbgIO.println("CodeBase\t0x%x", img.getCodeBase);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
467 DbgIO.println("Sections:\nname\t\taddress\t\tsize\t\tcharacteristics");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
468 foreach ( s; img.sections )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
469 with ( *s.header ) DbgIO.println("%s\t0x%08x\t0x%08x\t0x%08x", cast(char[8])Name, ibase+VirtualAddress, Misc.VirtualSize, Characteristics);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
470 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
471 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
472 // jump to last known source frame
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
473 case "jkf":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
474 jump_to_last_known_location_on_exception = !jump_to_last_known_location_on_exception;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
475 DbgIO.println("%s to from of last known source location on exception",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
476 jump_to_last_known_location_on_exception?"Jumping":"Not jumping"
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
477 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
478 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
479 // walk memory
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
480 case "mi":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
481 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
482 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
483 uint filteredStates = MEM_COMMIT;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
484 foreach ( lc; lastcmd[1..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
485 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
486 switch ( lc )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
487 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
488 case "free": filteredStates |= MEM_FREE; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
489 case "rsrv": filteredStates |= MEM_RESERVE; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
490 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
491 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
492 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
493
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
494 MEMORY_BASIC_INFORMATION[] mbis = dbg.process.walkMemory;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
495
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
496 DbgIO.println("Base AlcBase AlcProt RgnSize Stat Protect Type");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
497 foreach ( mbi; mbis )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
498 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
499 if ( (mbi.State & filteredStates) == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
500 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
501
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
502 string state;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
503 switch ( mbi.State )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
504 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
505 case MEM_COMMIT: state = "comt"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
506 case MEM_FREE: state = "free"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
507 case MEM_RESERVE: state = "rsrv"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
508 default: state = "unkn"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
509 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
510
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
511 string type;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
512 switch ( mbi.Type )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
513 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
514 case MEM_IMAGE: type = "imag"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
515 case MEM_MAPPED: type = "mapd"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
516 case MEM_PRIVATE: type = "priv"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
517 default: type = "unkn"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
518 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
519
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
520 string protectName(uint prot)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
521 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
522 string protStr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
523 switch ( prot & 0xff )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
524 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
525 case 0: protStr = "?"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
526 case PAGE_EXECUTE: protStr = "x"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
527 case PAGE_EXECUTE_READ: protStr = "xr"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
528 case PAGE_EXECUTE_READWRITE: protStr = "xrw"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
529 case PAGE_EXECUTE_WRITECOPY: protStr = "xwc"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
530 case PAGE_NOACCESS: protStr = "na"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
531 case PAGE_READONLY: protStr = "ro"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
532 case PAGE_READWRITE: protStr = "rw"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
533 case PAGE_WRITECOPY: protStr = "wc"; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
534 default: protStr = format("%02x", prot & 0xff); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
535 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
536 protStr ~= " ";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
537 if ( prot & PAGE_GUARD )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
538 protStr ~= "g";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
539 if ( prot & PAGE_NOCACHE )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
540 protStr ~= "nc";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
541 return protStr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
542 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
543
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
544 DbgIO.println("%08x %08x %- 7s %08x %s %- 7s %s",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
545 cast(size_t)mbi.BaseAddress, cast(size_t)mbi.AllocationBase, protectName(mbi.AllocationProtect),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
546 mbi.RegionSize, state, protectName(mbi.Protect), type
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
547 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
548 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
549 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
550 // list breakpoints
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
551 case "lbp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
552 if ( dbg.breakpoints.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
553 DbgIO.println("no breakpoints set");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
554 foreach ( uint i, bp; dbg.breakpoints )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
555 DbgIO.println("%d %s", i, bp.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
556 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
557 // ldll
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
558 case "ldll":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
559 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
560 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
561 DbgIO.println("Base Name");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
562 foreach ( dll; dbg.process.loaded_dlls )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
563 DbgIO.println("%08x %s", dll.base, dll.image.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
564 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
565 // list temporary breakpoints
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
566 case "ltbp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
567 if ( dbg.temp_breakpoints.empty )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
568 DbgIO.println("no temporary breakpoints set");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
569 foreach ( bp; dbg.temp_breakpoints )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
570 DbgIO.writeln(bp.value.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
571 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
572 // list debug modules
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
573 case "lm":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
574 Module[] modules_noinfo;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
575 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
576 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
577 foreach ( m; img.codeView.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
578 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
579 string name = m.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
580
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
581 if ( m.header.iLib > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
582 name ~= " from "~img.codeView.libraries[m.header.iLib];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
583
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
584 if ( lastcmd.length > 1 && find(name, lastcmd[1]) < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
585 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
586
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
587 bool has_info = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
588 with ( m.symbols )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
589 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
590 if ( proc_symbols.length+stack_symbols.length+data_symbols.length > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
591 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
592 DbgIO.println(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
593 "%s\n\tSymbols: %d proc %d stack %d data",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
594 name, proc_symbols.length, stack_symbols.length, data_symbols.length
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
595 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
596 has_info = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
597 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
598 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
599 if ( m.source_module !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
600 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
601 DbgIO.println("\tSource files:");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
602 has_info = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
603 foreach ( sf; m.source_module.files )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
604 DbgIO.println("\t\t%s", sf.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
605 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
606 if ( !has_info )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
607 modules_noinfo ~= m;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
608 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
609 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
610 if ( modules_noinfo.length > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
611 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
612 DbgIO.println("Modules without debug information:");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
613 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
614 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
615 foreach ( m; modules_noinfo )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
616 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
617 string name = m.name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
618
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
619 if ( m.header.iLib > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
620 name ~= " from "~img.codeView.libraries[m.header.iLib];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
621
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
622 DbgIO.println("%s #segs=%d", name, m.seginfos.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
623 if ( m.source_module !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
624 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
625 DbgIO.println("\tSource files:");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
626 foreach ( sf; m.source_module.files )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
627 DbgIO.println("\t\t%s", sf.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
628 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
629 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
630 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
631 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
632 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
633 // list source modules
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
634 case "lsm":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
635 uint[string] line_counters;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
636 uint[string] seg_counters;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
637 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
638 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
639 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
640 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
641 foreach ( m; img.codeView.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
642 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
643 if ( m.source_module is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
644 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
645 foreach ( sf; m.source_module.files )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
646 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
647 if ( lastcmd.length > 1 && find(sf.name, lastcmd[1]) < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
648 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
649 uint lines = sf.lines.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
650 if ( (sf.name in line_counters) is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
651 seg_counters[sf.name] = sf.segments.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
652 line_counters[sf.name] = lines;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
653 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
654 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
655 seg_counters[sf.name] += sf.segments.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
656 line_counters[sf.name] += lines;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
657 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
658 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
659 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
660 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
661 string[] lc_keys = line_counters.keys.dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
662 lc_keys.sort;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
663 foreach ( key; lc_keys )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
664 DbgIO.println("%s\t\tsegs=%d lines=%d", key, seg_counters[key], line_counters[key]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
665 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
666 // list source lines per module
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
667 case "lsl":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
668 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
669 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
670 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
671 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
672 foreach ( m; img.codeView.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
673 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
674 if ( m.source_module is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
675 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
676 DbgIO.println("module %s", m.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
677 foreach ( sf; m.source_module.files )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
678 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
679 DbgIO.println("file %s", sf.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
680 if ( lastcmd.length > 1 && find(sf.name, lastcmd[1]) < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
681 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
682 foreach ( l; sf.lines.reverse )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
683 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
684 DbgIO.println("line %d", l);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
685 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
686 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
687 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
688 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
689 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
690 // list all symbols
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
691 case "ls":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
692 /*
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
693 void dumpSymbolAVL(AVLNode!(NamedSymbol) node, uint indent=0)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
694 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
695 string indentstr = new char[indent*2];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
696 indentstr[0..indent*2] = ' ';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
697 DbgIO.println("%s%s", indentstr, node.value.name_notype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
698 if ( node.left !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
699 dumpSymbolAVL(node.left, indent+1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
700 if ( node.right !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
701 dumpSymbolAVL(node.right, indent+1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
702 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
703 DbgIO.println("AVL dump:");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
704 dumpSymbolAVL(dbg.image.codeView.globalNamedSymbols.root);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
705 */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
706 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
707 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
708 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
709 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
710 printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
711 printSymbols(img.codeView, img.codeView.global_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
712 printSymbols(img.codeView, img.codeView.static_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
713 foreach ( m; img.codeView.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
714 printSymbols(img.codeView, m.symbols.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
715 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
716 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
717 // list source search paths
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
718 case "lsp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
719 foreach ( s; dbg.source_search_paths )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
720 DbgIO.writeln(s);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
721 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
722 // list function symbols
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
723 case "lf":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
724 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
725 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
726 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
727 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
728 printSymbols(img.codeView, img.codeView.global_pub.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
729 printSymbols(img.codeView, img.codeView.global_sym.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
730 printSymbols(img.codeView, img.codeView.static_sym.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
731 foreach ( m; img.codeView.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
732 printSymbols(img.codeView, m.symbols.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
733 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
734 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
735 // list data symbols
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
736 case "ld":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
737 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
738 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
739 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
740 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
741 printSymbols(img.codeView, img.codeView.global_pub.data_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
742 printSymbols(img.codeView, img.codeView.global_sym.data_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
743 printSymbols(img.codeView, img.codeView.static_sym.data_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
744 foreach ( m; img.codeView.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
745 printSymbols(img.codeView, m.symbols.data_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
746 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
747 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
748 // list global symbols
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
749 case "lg":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
750 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
751 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
752 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
753 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
754 printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
755 printSymbols(img.codeView, img.codeView.global_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
756 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
757 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
758 // list global publics
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
759 case "lp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
760 foreach ( img; dbg.images.images )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
761 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
762 if ( img.codeView is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
763 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
764 printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
765 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
766 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
767 // list scope variables
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
768 case "lsv":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
769 if ( dbg.process_loaded || dbg.miniDump !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
770 evalScopeSymbols();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
771 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
772 // list threads
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
773 case "lt":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
774 if ( dbg.miniDump !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
775 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
776 DbgIO.println(" id pri sus location");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
777 MINIDUMP_THREAD[] threads = dbg.miniDump.threads;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
778 foreach ( thread; threads )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
779 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
780 CONTEXT* ctx;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
781 ctx = cast(CONTEXT*)dbg.miniDump.rvaToVa(thread.ThreadContext.Rva);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
782 Location loc = dbg.images.findLocation(ctx.Eip);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
783
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
784 DbgIO.println("%s%s%- 6d %- 3d %- 2d %s",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
785 thread.ThreadId==dbg.thread_id?">":" ", thread.ThreadId==dbg.miniDump.threadInfo.mainThreadId?"*":" ",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
786 thread.ThreadId, thread.Priority, thread.SuspendCount, describeLocation(loc)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
787 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
788 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
789 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
790 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
791 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
792 DbgIO.println(" id pri sus creation exit kernel user location");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
793 foreach ( t; dbg.process.threads.values )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
794 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
795 // id name location pri pri-boost start-info times
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
796 ulong creation,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
797 exit,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
798 kernel,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
799 user;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
800
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
801 t.times(creation, exit, kernel, user);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
802
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
803 CONTEXT ctx;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
804 t.getContext(ctx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
805 Location loc = dbg.images.findLocation(ctx.Eip);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
806
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
807 DbgIO.println("%s%s%- 6d %- 3d%s %- 2d %s %s %s %s %s",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
808 t.id==dbg.thread_id?">":" ", t.id==dbg.process.mainThreadId?"*":" ", t.id,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
809 t.priority, t.priorityBoost?"b":" ", t.suspendCount,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
810 formatTicks(creation), formatTicks(exit), formatTicks(kernel), formatTicks(user),
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
811 describeLocation(loc)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
812 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
813 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
814 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
815 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
816 // no console
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
817 case "nc":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
818 dbg.create_new_console = !dbg.create_new_console;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
819 DbgIO.println("Starting debuggee in %s console", dbg.create_new_console?"new":"this");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
820 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
821 // on exception
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
822 case "onex":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
823 if ( lastcmd.length < 2 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
824 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
825 foreach ( cmd; onexCommands )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
826 DbgIO.writeln(cmd[0..$-1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
827 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
828 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
829 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
830 onexCommands = null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
831 string cmdList;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
832 foreach ( cmd; lastcmd[1..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
833 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
834 if ( cmd[0] == '"' && cmd[$-1] == '"' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
835 cmdList ~= " "~cmd[1..$-1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
836 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
837 cmdList ~= " "~cmd;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
838 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
839 foreach ( cmd; split(cmdList, ";") )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
840 onexCommands ~= strip(cmd)~";";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
841 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
842 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
843 // on termination
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
844 case "onterm":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
845 if ( lastcmd.length < 2 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
846 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
847 foreach ( cmd; ontermCommands )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
848 DbgIO.writeln(cmd[0..$-1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
849 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
850 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
851 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
852 ontermCommands = null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
853 string cmdList;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
854 foreach ( cmd; lastcmd[1..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
855 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
856 if ( cmd[0] == '"' && cmd[$-1] == '"' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
857 cmdList ~= " "~cmd[1..$-1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
858 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
859 cmdList ~= " "~cmd;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
860 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
861 foreach ( cmd; split(cmdList, ";") )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
862 ontermCommands ~= strip(cmd)~";";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
863 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
864 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
865 // print source
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
866 case "ps":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
867 Location loc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
868 string[] source;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
869
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
870 do
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
871 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
872 if ( current_frame_level > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
873 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
874 auto frame = dbg.stack.getFrame(current_frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
875 if ( frame is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
876 goto Lnotfound;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
877 uint ret_adr = (cast(uint[])frame)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
878 loc = dbg.images.findLocation(ret_adr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
879 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
880 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
881 loc = dbg.images.findLocation(dbg.current_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
882 debug DbgIO.println("found location %s", loc.file);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
883
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
884 source = dbg.getSourceFile(loc.file);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
885 if ( source !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
886 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
887 if ( auto_find_scope_frame ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
888 ++current_frame_level;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
889 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
890 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
891 Lnotfound:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
892 DbgIO.writeln("Source file for current location unknown");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
893 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
894 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
895 while( source is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
896
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
897 int start_line, end_line;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
898 if ( lastcmd.length > 1 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
899 start_line = cast(uint)atoi(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
900 end_line = loc.line + start_line;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
901 start_line = loc.line - start_line;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
902 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
903 else if ( loc.scope_sym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
904 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
905 ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
906 auto start_address = loc.getCodeBase + psym.cvdata.offset;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
907 auto start_loc = dbg.images.findLocation(start_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
908 auto end_loc = dbg.images.findLocation(start_address+psym.cvdata.proc_length-1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
909 debug DbgIO.println("address range: 0x%x 0x%x", start_address, start_address+psym.cvdata.proc_length-1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
910 debug DbgIO.println("lines before prev: %d - %d", start_loc.line, end_loc.line);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
911 end_loc = dbg.images.findPrevSrcLine(end_loc);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
912 start_line = start_loc.line;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
913 if ( end_loc !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
914 end_line = end_loc.line;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
915 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
916 if ( end_line == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
917 start_line = loc.line - PRINT_SOURCE_LINES;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
918 end_line = loc.line + PRINT_SOURCE_LINES;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
919 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
920
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
921 debug DbgIO.println("lines: %d - %d", start_line, end_line);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
922 for ( int l = dmax(0, start_line-1); l < dmin(cast(int)source.length, end_line); ++l )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
923 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
924 if ( l+1 == loc.line )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
925 DbgIO.write(">");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
926 DbgIO.writeln(source[l]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
927 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
928 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
929 // quit
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
930 case "q":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
931 dbg.abort = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
932 quit = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
933 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
934 // run/continue
5
marton@basel.hu
parents: 4
diff changeset
935 case "r": case "rf":
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
936 if ( dbg.miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
937 DbgIO.println("Command not valid in post-mortem mode");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
938 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
939 }
5
marton@basel.hu
parents: 4
diff changeset
940 int index;
marton@basel.hu
parents: 4
diff changeset
941 if ( lastcmd[0]=="r" && lastcmd.length == 2 ) {
marton@basel.hu
parents: 4
diff changeset
942
marton@basel.hu
parents: 4
diff changeset
943
marton@basel.hu
parents: 4
diff changeset
944 int pos = find(lastcmd[1], '#');
marton@basel.hu
parents: 4
diff changeset
945 uint threadId;
marton@basel.hu
parents: 4
diff changeset
946 if ( pos > 0 )
marton@basel.hu
parents: 4
diff changeset
947 {
marton@basel.hu
parents: 4
diff changeset
948 threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
marton@basel.hu
parents: 4
diff changeset
949 lastcmd[1] = lastcmd[1][0..pos];
marton@basel.hu
parents: 4
diff changeset
950 }
marton@basel.hu
parents: 4
diff changeset
951 Location loc = new Location(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
952 if (!loc.bind(dbg.images, dbg.source_search_paths))
marton@basel.hu
parents: 4
diff changeset
953 break;
marton@basel.hu
parents: 4
diff changeset
954 //if ( lastcmd.length > 2 )
marton@basel.hu
parents: 4
diff changeset
955 // index = cast(int)atoi(lastcmd[2]);
marton@basel.hu
parents: 4
diff changeset
956 index=-1;
marton@basel.hu
parents: 4
diff changeset
957 Breakpoint bp;
marton@basel.hu
parents: 4
diff changeset
958 if ( index <= 0 && dbg.breakpoints.length > 0 )
marton@basel.hu
parents: 4
diff changeset
959 index = dbg.breakpoints.keys.dup.sort[$-1]+1;
marton@basel.hu
parents: 4
diff changeset
960 bp = dbg.setBreakpoint(loc, index, threadId);
marton@basel.hu
parents: 4
diff changeset
961 DbgIO.println("Breakpoint set: %s", bp.toString);
marton@basel.hu
parents: 4
diff changeset
962 }
marton@basel.hu
parents: 4
diff changeset
963 if ( lastcmd[0]=="rf" && lastcmd.length == 2 ) {
marton@basel.hu
parents: 4
diff changeset
964 int pos = find(lastcmd[1], '#');
marton@basel.hu
parents: 4
diff changeset
965 uint threadId;
marton@basel.hu
parents: 4
diff changeset
966 if ( pos > 0 )
marton@basel.hu
parents: 4
diff changeset
967 {
marton@basel.hu
parents: 4
diff changeset
968 threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
marton@basel.hu
parents: 4
diff changeset
969 lastcmd[1] = lastcmd[1][0..pos];
marton@basel.hu
parents: 4
diff changeset
970 }
marton@basel.hu
parents: 4
diff changeset
971 if (!setBreakpointByFunctionname(lastcmd,threadId,-1))
marton@basel.hu
parents: 4
diff changeset
972 break;
marton@basel.hu
parents: 4
diff changeset
973
marton@basel.hu
parents: 4
diff changeset
974
marton@basel.hu
parents: 4
diff changeset
975 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
976 if ( dbg.process_loaded ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
977 dbg.resume;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
978 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
979 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
980 else {
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
981 dbg.breakonmain = false;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
982 dbg.start(command_line);
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
983 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
984 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
985 // single-step
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
986 case "s":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
987 if ( dbg.miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
988 DbgIO.println("Command not valid in post-mortem mode");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
989 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
990 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
991 if ( dbg.process_loaded ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
992 dbg.single_step = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
993 dbg.activateSingleStep(true);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
994 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
995 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
996 // add source search path
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
997 case "sp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
998 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
999 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1000 string sp = lastcmd[1].dup;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1001 if ( sp[$-1] != '\\' )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1002 sp ~= '\\';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1003 dbg.source_search_paths ~= sp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1004 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1005 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1006 DbgIO.println("usage: sp <search_path>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1007 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1008 // switch thread
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1009 case "st":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1010 if ( lastcmd.length < 2 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1011 DbgIO.writeln("Usage: st <threadID>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1012 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1013 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1014 size_t threadId = cast(size_t)atoi(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1015 if ( dbg.miniDump !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1016 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1017 foreach ( thread; dbg.miniDump.threads )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1018 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1019 if ( threadId == thread.ThreadId ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1020 dbg.selectThread(threadId);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1021 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1022 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1023 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1024 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1025 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1026 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1027 foreach ( t; dbg.process.threads.values )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1028 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1029 if ( threadId == t.id ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1030 dbg.selectThread(threadId);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1031 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1032 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1033 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1034 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1035 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1036 // step over
5
marton@basel.hu
parents: 4
diff changeset
1037 case "n": case "ov":
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1038 if ( dbg.miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1039 DbgIO.println("Command not valid in post-mortem mode");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1040 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1041 }
5
marton@basel.hu
parents: 4
diff changeset
1042 if ( lastcmd.length ==2 ) {
marton@basel.hu
parents: 4
diff changeset
1043 repeat=cast(uint)atoi(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
1044 repeat--;
marton@basel.hu
parents: 4
diff changeset
1045 lastcmd.length = 1;
marton@basel.hu
parents: 4
diff changeset
1046 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1047 if ( dbg.process_loaded && dbg.step(StepMode.e_over) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1048 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1049 debug foreach ( bp; dbg.temp_breakpoints )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1050 DbgIO.writeln(bp.value.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1051 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1052 }
4
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
1053 if (!dbg.process_loaded)
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
1054 {
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
1055 dbg.breakonmain = true;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
1056 dbg.start(command_line);
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
1057 return true;
a5fb1bc967e6 - = command does not need space after it
marton@basel.hu
parents: 1
diff changeset
1058 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1059 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1060 // step into
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1061 case "in":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1062 if ( dbg.miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1063 DbgIO.println("Command not valid in post-mortem mode");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1064 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1065 }
5
marton@basel.hu
parents: 4
diff changeset
1066 if ( lastcmd.length ==2 ) {
marton@basel.hu
parents: 4
diff changeset
1067 repeat=cast(uint)atoi(lastcmd[1]);
marton@basel.hu
parents: 4
diff changeset
1068 repeat--;
marton@basel.hu
parents: 4
diff changeset
1069 lastcmd.length = 1;
marton@basel.hu
parents: 4
diff changeset
1070 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1071 if ( dbg.process_loaded && dbg.step(StepMode.e_in) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1072 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1073 debug foreach ( bp; dbg.temp_breakpoints )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1074 DbgIO.writeln(bp.value.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1075 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1076 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1077 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1078 // step out
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1079 case "out":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1080 if ( dbg.miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1081 DbgIO.println("Command not valid in post-mortem mode");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1082 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1083 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1084 if ( dbg.process_loaded && dbg.step(StepMode.e_out) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1085 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1086 debug foreach ( bp; dbg.temp_breakpoints )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1087 DbgIO.writeln(bp.value.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1088 return true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1089 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1090 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1091 // disassemble
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1092 case "da":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1093 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1094 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1095
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1096 uint start_address;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1097 if ( current_frame_level > 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1098 auto frame = dbg.stack.getFrame(current_frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1099 start_address = (cast(uint[])frame)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1100 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1101 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1102 start_address = dbg.current_address;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1103
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1104 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1105 sscanf(toStringz(lastcmd[1]), "%x", &start_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1106 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1107 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1108 Location loc = dbg.images.findLocation(dbg.current_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1109 if ( loc.scope_sym !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1110 ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1111 start_address = loc.getCodeBase + psym.cvdata.offset;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1112 DisAsm.disasm(dbg.process, start_address, start_address+psym.cvdata.proc_length, &printDisassembly);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1113 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1114 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1115 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1116 DisAsm.disasm(dbg.process, start_address, 0, &printDisassembly);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1117 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1118 // disassemble line
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1119 case "dal":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1120 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1121 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1122
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1123 int num_lines = 1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1124 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1125 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1126 sscanf(toStringz(lastcmd[1]), "%d", &num_lines);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1127 if ( num_lines < 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1128 --num_lines;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1129 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1130
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1131 uint start_address;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1132 if ( current_frame_level > 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1133 auto frame = dbg.stack.getFrame(current_frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1134 start_address = (cast(uint[])frame)[1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1135 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1136 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1137 start_address = dbg.current_address;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1138
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1139 for ( ; num_lines != 0; num_lines<0?++num_lines:--num_lines )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1140 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1141 Location loc = dbg.images.findLocation(start_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1142 if ( loc is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1143 DbgIO.println("No source line information available");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1144 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1145 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1146 DisAsm.disasm(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1147 dbg.process,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1148 loc.getCodeBase+loc.codeblock.start,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1149 loc.getCodeBase+loc.codeblock.end,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1150 &printDisassembly
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1151 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1152 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1153 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1154 // dump registers
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1155 case "dr":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1156 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1157 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1158 foreach ( lc; lastcmd[1..$] )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1159 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1160 switch ( lc )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1161 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1162 case "cpu": dump_registers |= CPU_REGISTERS; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1163 case "fpu": dump_registers |= FPU_REGISTERS; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1164 case "mmx": dump_registers |= MMX_REGISTERS; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1165 case "sse": dump_registers |= SSE_REGISTERS; break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1166 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1167 DbgIO.println("Unknown register set \"%s\"", lc);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1168 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1169 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1170 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1171 if ( dump_registers == 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1172 DbgIO.println("No register set selected. See help for usage of \"dr\"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1173 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1174 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1175 if ( dbg.miniDump !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1176 printRegisterDump(dbg.miniDump.getContext);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1177 else if ( dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1178 printRegisterDump(dbg.process.threads[dbg.thread_id]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1179 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1180 // dump stack
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1181 case "ds":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1182 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1183 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1184
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1185 int dump_length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1186 if ( lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1187 dump_length = cast(int)atoi(lastcmd[1])*4;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1188 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1189 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1190 CONTEXT ctx;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1191 if ( dbg.process.threads[dbg.thread_id].getContext(ctx, CONTEXT_CONTROL) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1192 dump_length = ctx.Ebp-ctx.Esp+8;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1193 if ( dump_length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1194 dump_length = 16*4;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1195 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1196 int top = dbg.stack.data.length>dump_length?dump_length:dbg.stack.data.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1197 dumpMemory(dbg.stack.top_ptr, top, dbg.stack.data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1198 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1199 case "dm":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1200 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1201 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1202
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1203 if ( lastcmd.length < 3 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1204 DbgIO.println("usage: dm <start> <length>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1205 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1206 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1207 uint start;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1208 sscanf(toStringz(lastcmd[1]), "%x", &start);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1209 dumpMemory(start, cast(uint)atoi(lastcmd[2]));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1210 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1211 case "hwbp":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1212 int index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1213 if ( lastcmd.length < 2 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1214 DbgIO.println("invalid syntax - see help for details");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1215 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1216 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1217
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1218 int pos = find(lastcmd[1], '#');
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1219 uint threadId;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1220 if ( pos > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1221 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1222 threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1223 lastcmd[1] = lastcmd[1][0..pos];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1224 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1225
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1226 Location loc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1227
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1228 size_t address;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1229 sscanf(toStringz(lastcmd[1]), "%x", &address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1230 if ( address > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1231 loc = new Location(address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1232 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1233 loc = new Location(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1234 loc.bind(dbg.images, dbg.source_search_paths);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1235 if ( lastcmd.length > 2 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1236 index = cast(int)atoi(lastcmd[2]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1237
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1238 Breakpoint bp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1239 if ( index <= 0 && dbg.breakpoints.length > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1240 index = dbg.breakpoints.keys.dup.sort[$-1]+1;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1241 bp = dbg.setBreakpoint(loc, index, threadId, true);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1242 DbgIO.println("Hardware Breakpoint set: %s", bp.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1243 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1244 // type of expression
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1245 case "t":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1246 if ( dbg.process_loaded && lastcmd.length > 1 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1247 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1248 SymbolData sd;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1249 try {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1250 sd = dbg.evaluateExpression(lastcmd[1], current_frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1251 string type = demangle("_D0"~sd.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1252 DbgIO.println("%s\n%s", sd.type, type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1253 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1254 catch ( EvaluationException e ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1255 DbgIO.writeln(e.toString);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1256 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1257 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1258 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1259 // unwind stack
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1260 case "us":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1261 if ( dbg.process_loaded || dbg.miniDump !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1262 unwindStack();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1263 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1264 // write minidump
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1265 case "wmd":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1266 if ( dbg.miniDump !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1267 DbgIO.println("Command not valid in post-mortem mode");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1268 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1269 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1270 if ( !dbg.process_loaded )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1271 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1272 if ( !MiniDump.haveMiniDump ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1273 DbgIO.println("DbgHelp.dll required for MiniDump support.\nInstall the Microsoft Platform SDK or Windows XP.");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1274 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1275 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1276 if ( lastcmd.length < 2 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1277 DbgIO.println("Usage: wmd <filename>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1278 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1279 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1280 dbg.writeMiniDump(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1281 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1282 // read minidump
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1283 case "rmd":
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1284 if ( dbg.process_loaded ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1285 DbgIO.println("For post-mortem debugging, the process must not be started");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1286 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1287 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1288 if ( !MiniDump.haveMiniDump ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1289 DbgIO.println("DbgHelp.dll required for MiniDump support.\nInstall the Microsoft Platform SDK or Windows XP.");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1290 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1291 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1292 if ( lastcmd.length < 2 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1293 DbgIO.println("Usage: rmd <filename>");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1294 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1295 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1296 dbg.readMiniDump(lastcmd[1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1297 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1298 // unknown command
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1299 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1300 DbgIO.println("Unknown command '%s' ignored!", lastcmd[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1301 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1302 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1303
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1304 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1305 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1306
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1307 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1308
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1309 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1310 void dumpMemory(uint start, uint length, ubyte[] _data=null)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1311 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1312 ubyte[] data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1313 if ( _data is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1314 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1315 data.length = length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1316 if ( !dbg.process.readProcessMemory(start, data.ptr, data.length) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1317 return;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1318 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1319 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1320 data = _data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1321 for ( uint i = 0; i < length; ++i )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1322 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1323 if ( i % (4*4) == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1324 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1325 if ( i > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1326 DbgIO.println("");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1327 DbgIO.print("%08x:", start+i);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1328 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1329 if ( i % 4 == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1330 DbgIO.print(" ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1331 DbgIO.print("%02x", data[i]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1332 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1333 DbgIO.println("");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1334 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1335
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1336 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1337
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1338 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1339 void evalScopeSymbols()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1340 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1341 uint scope_address = dbg.getScopeAddress(current_frame_level);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1342
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1343 ScopeSymbol scope_sym = dbg.images.findProcedureSymbol(scope_address);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1344 if ( scope_sym is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1345 DbgIO.println("No valid scope active");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1346 return;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1347 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1348
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1349 for ( ; scope_sym !is null; scope_sym = scope_sym.parent_scope )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1350 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1351 DbgIO.println("Scope: %s, parent: %x", scope_sym.name_type, cast(void*)scope_sym.parent_scope);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1352
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1353 StackSymbol[] locals_args = scope_sym.symbols.stack_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1354 auto psym = cast(ProcedureSymbol)scope_sym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1355 if ( psym !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1356 locals_args ~= psym.arguments.stack_symbols;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1357 foreach ( sym; locals_args.sort )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1358 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1359 string name = sym.mangled_name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1360 DbgIO.print("%s = ", name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1361 // DbgIO.print("%s = [ebp%s%d] ", name, sym.cvdata.offset>0?"+":"", sym.cvdata.offset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1362 try DbgIO.writeln(symbolValueToString(dbg.handleData(dbg.evaluateExpression(name, current_frame_level, sym), true)));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1363 catch ( EvaluationException e ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1364 DbgIO.println(e.msg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1365 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1366 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1367 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1368 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1369
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1370 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1371
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1372 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1373 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
1374 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1375 bool nl = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1376 if ( location !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1377 DbgIO.print("%s ", location);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1378 nl = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1379 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1380 if ( source !is null ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1381 DbgIO.write(source);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1382 nl = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1383 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1384 if ( nl )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1385 DbgIO.println;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1386
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1387 // align next column
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1388 char[] indent;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1389 int indcount = 2*12-bytes.length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1390 if ( indcount > 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1391 indent.length = indcount;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1392 indent[0..indcount] = ' ';
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1393 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1394 // print aligned asm source
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1395 assert(asmsource !is null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1396 assert(bytes !is null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1397 DbgIO.print("%08x: ", address, bytes, indent, asmsource);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1398
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1399 if ( symbol !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1400 DbgIO.write(symbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1401 DbgIO.println;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1402 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1403
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1404 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1405 Prints the register contents of the given thread's context.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1406 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1407 void printRegisterDump(DbgThread thread)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1408 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1409 CONTEXT ctxMem;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1410 uint context_flags;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1411 if ( dump_registers & CPU_REGISTERS )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1412 context_flags |= CONTEXT_FULL;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1413 if ( dump_registers & FPU_REGISTERS )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1414 context_flags |= CONTEXT_FLOATING_POINT;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1415 if ( dump_registers & (MMX_REGISTERS|SSE_REGISTERS) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1416 context_flags |= CONTEXT_EXTENDED_REGISTERS;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1417 if ( thread.getContext(ctxMem, context_flags) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1418 printRegisterDump(&ctxMem);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1419 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1420 DbgIO.println("ERROR: Couldn't get main thread's context");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1421 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1422
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1423 void printRegisterDump(CONTEXT* ctx)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1424 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1425 assert ( ctx !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1426
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1427 bool first = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1428
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1429 if ( dump_registers & CPU_REGISTERS )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1430 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1431 DbgIO.println("EAX = %08x\tEBX = %08x\tECX = %08x\tEDX = %08x", ctx.Eax, ctx.Ebx, ctx.Ecx, ctx.Edx);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1432 DbgIO.println("EDI = %08x\tESI = %08x\tEBP = %08x\tESP = %08x", ctx.Edi, ctx.Esi, ctx.Ebp, ctx.Esp);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1433 DbgIO.println("EIP = %08x\tEFL = %08x", ctx.Eip, ctx.EFlags);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1434 DbgIO.println(" CS = %08x\t DS = %08x\t ES = %08x\t FS = %08x", ctx.SegCs, ctx.SegDs, ctx.SegEs, ctx.SegFs);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1435 DbgIO.println(" GS = %08x\t SS = %08x", ctx.SegGs, ctx.SegSs);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1436 first = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1437 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1438
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1439 if ( dump_registers & FPU_REGISTERS )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1440 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1441 if ( !first )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1442 DbgIO.println();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1443 DbgIO.println("FCW = %04x\tFSW = %04x\tFTW = %04x\tFOP = %04x",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1444 cast(ushort)ctx.FloatSave.ControlWord, cast(ushort)ctx.FloatSave.StatusWord,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1445 cast(ushort)ctx.FloatSave.TagWord, (cast(ushort[])ctx.ExtendedRegisters)[3]
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1446 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1447 DbgIO.println("IP = %08x\tCS = %04x\tDP = %08x\tDS = %04x",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1448 (cast(uint[])ctx.ExtendedRegisters)[2], (cast(ushort[])ctx.ExtendedRegisters)[6],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1449 (cast(uint[])ctx.ExtendedRegisters)[4], (cast(ushort[])ctx.ExtendedRegisters)[10]
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1450 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1451 for ( int i = 0; i < 8; ++i )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1452 DbgIO.println("ST%d = % .16e", i, (cast(real[])ctx.FloatSave.RegisterArea)[i]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1453 first = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1454 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1455
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1456 if ( dump_registers & MMX_REGISTERS )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1457 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1458 if ( !first )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1459 DbgIO.println();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1460 for ( int i = 0; i < 8; ++i )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1461 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1462 DbgIO.println("MM%d = %016x", i, (cast(long[])ctx.ExtendedRegisters)[4+i*2]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1463 DbgIO.println(" = [%.6g, %.6g]",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1464 (cast(float[])ctx.ExtendedRegisters)[8+i*4],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1465 (cast(float[])ctx.ExtendedRegisters)[8+i*4+1]
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1466 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1467 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1468 first = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1469 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1470
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1471 if ( dump_registers & SSE_REGISTERS )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1472 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1473 if ( !first )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1474 DbgIO.println();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1475 DbgIO.println("MXCSR = %08x", (cast(uint[])ctx.ExtendedRegisters)[6]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1476 for ( int i = 0; i < 8; ++i )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1477 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1478 DbgIO.println("XMM%d = %016x%016x", i, (cast(long[])ctx.ExtendedRegisters)[20+i*2+1], (cast(long[])ctx.ExtendedRegisters)[20+i*2]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1479 DbgIO.println(" = [%.6g, %.6g, %.6g, %.6g]",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1480 (cast(float[])ctx.ExtendedRegisters)[40+i*4],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1481 (cast(float[])ctx.ExtendedRegisters)[40+i*4+1],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1482 (cast(float[])ctx.ExtendedRegisters)[40+i*4+2],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1483 (cast(float[])ctx.ExtendedRegisters)[40+i*4+3]
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1484 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1485 DbgIO.println(" = [%.12g, %.12g]",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1486 (cast(double[])ctx.ExtendedRegisters)[20+i*2],
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1487 (cast(double[])ctx.ExtendedRegisters)[20+i*2+1]
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1488 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1489 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1490 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1491 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1492
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1493 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1494
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1495 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1496 string symbolValueToString(SymbolValue val)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1497 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1498 return symbolValueToString(val,"");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1499 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1500
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1501 string symbolValueToString(SymbolValue val, string indent)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1502 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1503 string str;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1504 if ( val.name !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1505 str = val.name~" = ";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1506 if ( val.value !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1507 str ~= val.value;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1508 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1509 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1510 if ( val.children.length > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1511 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1512 str ~= "{";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1513 bool first = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1514 foreach ( c; val.children )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1515 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1516 if ( first )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1517 first = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1518 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1519 str ~= ",";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1520 str ~= "\n "~indent~symbolValueToString(c, indent~" ");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1521 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1522 str ~= "\n"~indent~"}";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1523 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1524 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1525 str ~= "{}";
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1526 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1527 return str;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1528 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1529
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1530 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1531 Read command and call CLI supplied parser function.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1532 Gets called when debuggee is suspended.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1533 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1534 bool readCommand()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1535 {
5
marton@basel.hu
parents: 4
diff changeset
1536
marton@basel.hu
parents: 4
diff changeset
1537 if (repeat>0)
marton@basel.hu
parents: 4
diff changeset
1538 {
marton@basel.hu
parents: 4
diff changeset
1539 repeat--;
marton@basel.hu
parents: 4
diff changeset
1540 return parseCommand("");
marton@basel.hu
parents: 4
diff changeset
1541 }
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1542 if ( cmdQueue.length <= 0 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1543 DbgIO.write("->");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1544 string input = DbgIO.readln();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1545 cmdQueue ~= input;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1546 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1547 if ( cmdQueue.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1548 return false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1549
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1550 string cmd = strip(cmdQueue[0]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1551 cmdQueue = cmdQueue[1..$];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1552 if ( cmd.length > 0 && cmd[$-1] == ';' ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1553 cmd = cmd[0..$-1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1554 DbgIO.writeln("->"~cmd);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1555 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1556 return parseCommand(cmd);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1557 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1558 }