1
|
1 |
This debug server uses a largely text-based protocol, except for
|
|
2 |
certain bulk data transfer operations. All text is in single-byte
|
|
3 |
US-ASCII except for the strings returned in "proclist".
|
|
4 |
|
|
5 |
NOTE that the character '|' (vertical bar) is used as an escape
|
|
6 |
character to switch the incoming data stream to the debug server into
|
|
7 |
binary mode, so no text command may contain that character.
|
|
8 |
|
|
9 |
Commands understood:
|
|
10 |
|
|
11 |
ascii <EOL> ::=
|
|
12 |
|
|
13 |
Changes to ASCII mode. This affects all outgoing strings. At
|
|
14 |
startup the system is in unicode mode.
|
|
15 |
|
|
16 |
unicode <EOL> ::=
|
|
17 |
|
|
18 |
Changes to UNICODE mode. This affects all outgoing strings. This
|
|
19 |
is the default mode upon startup.
|
|
20 |
|
|
21 |
proclist <EOL> ::=
|
|
22 |
<int num> [<unsigned int pid> <int charSize> <int numChars> [<binary char_t name>]...]... <EOL>
|
|
23 |
|
|
24 |
Returns integer indicating number of processes to follow, followed
|
|
25 |
by (pid, name) pairs. Names are given by (charSize, numChars,
|
|
26 |
[char_t]...) tuples; charSize indicates the size of each character
|
|
27 |
in bytes, numChars the number of characters in the string, and
|
|
28 |
name the raw data for the string. Each individual character of the
|
|
29 |
string, if multi-byte, is transmitted in network byte order.
|
|
30 |
numChars and name are guaranteed to be separated by precisely one
|
|
31 |
US-ASCII space. If process list is not available because of
|
|
32 |
limitations of the underlying operating system, number of
|
|
33 |
processes returned is 0.
|
|
34 |
|
|
35 |
attach <int pid> <EOL> ::= <bool result> <EOL>
|
|
36 |
|
|
37 |
Attempts to attach to the specified process. Returns 1 if
|
|
38 |
successful, 0 if not. Will fail if already attached or if the
|
|
39 |
process ID does not exist. Attaching to a process causes the
|
|
40 |
process to be suspended.
|
|
41 |
|
|
42 |
detach <EOL> ::= <bool result> <EOL>
|
|
43 |
|
|
44 |
Detaches from the given process. Attaching and detaching multiple
|
|
45 |
times during a debugging session is allowed. Detaching causes the
|
|
46 |
process to resume execution.
|
|
47 |
|
|
48 |
libinfo <EOL> ::=
|
|
49 |
<int numLibs> [<int charSize> <int numChars> [<binary char_t name>]... <address baseAddr>]... <EOL>
|
|
50 |
|
|
51 |
May only be called once attached and the target process must be
|
|
52 |
suspended; otherwise, returns 0. Returns list of the full path
|
|
53 |
names of all of the loaded modules (including the executable
|
|
54 |
image) in the target process, as well as the base address at which
|
|
55 |
each module was relocated. See proclist for format of strings, but
|
|
56 |
NOTE that charSize is ALWAYS 1 for this particular routine,
|
|
57 |
regardless of the setting of ASCII/UNICODE.
|
|
58 |
|
|
59 |
peek <address addr> <unsigned int numBytes> <EOL> ::=
|
|
60 |
B<binary char success>
|
|
61 |
[<binary unsigned int len> <binary char isMapped> [<binary char data>]...]...
|
|
62 |
|
|
63 |
NOTE that the binary portion of this message is prefixed by the
|
|
64 |
uppercase US-ASCII letter 'B', allowing easier synchronization by
|
|
65 |
clients. There is no data between the 'B' and the rest of the
|
|
66 |
message.
|
|
67 |
|
|
68 |
May only be called once attached. Reads the address space of the
|
|
69 |
target process starting at the given address (see below for format
|
|
70 |
specifications) and extending the given number of bytes. Whether
|
|
71 |
the read succeeded is indicated by a single byte containing a 1 or
|
|
72 |
0 (success or failure). If successful, the return result is given
|
|
73 |
in a sequence of ranges. _len_, the length of each range, is
|
|
74 |
indicated by a 32-bit unsigned integer transmitted with big-endian
|
|
75 |
byte ordering (i.e., most significant byte first). _isMapped_
|
|
76 |
indicates whether the range is mapped or unmapped in the target
|
|
77 |
process's address space, and will contain the value 1 or 0 for
|
|
78 |
mapped or unmapped, respectively. If the range is mapped,
|
|
79 |
_isMapped_ is followed by _data_, containing the raw binary data
|
|
80 |
for the range. The sum of all ranges' lengths is guaranteed to be
|
|
81 |
equivalent to the number of bytes requested.
|
|
82 |
|
|
83 |
poke <address addr> |[<binary unsigned int len> [<binary char data>]] <EOL> ::=
|
|
84 |
<bool result> <EOL>
|
|
85 |
|
|
86 |
NOTE that the binary portion of this message is prefixed by the
|
|
87 |
uppercase US-ASCII character '|' (vertical bar), allowing easier
|
|
88 |
synchronization by the server. There is no data between the '|'
|
|
89 |
and the rest of the message. ('B' is not used here because
|
|
90 |
addresses can contain that letter; no alphanumeric characters are
|
|
91 |
used because some of the parsing routines are used by the Solaris
|
|
92 |
SA port, and in that port any alphanumeric character can show up
|
|
93 |
as a part of a symbol being looked up.)
|
|
94 |
|
|
95 |
May only be called once attached. Writes the address space of the
|
|
96 |
target process starting at the given address (see below for format
|
|
97 |
specifications), extending the given number of bytes, and
|
|
98 |
containing the given data. The number of bytes is a 32-bit
|
|
99 |
unsigned integer transmitted with big-endian byte ordering (i.e.,
|
|
100 |
most significant byte first). This is followed by the raw binary
|
|
101 |
data to be placed at that address. The number of bytes of data
|
|
102 |
must match the number of bytes specified in the message.
|
|
103 |
|
|
104 |
Returns true if the write succeeded; false if it failed, for
|
|
105 |
example because a portion of the region was not mapped in the
|
|
106 |
target address space.
|
|
107 |
|
|
108 |
threadlist <EOL> ::= <int numThreads> [<address threadHandle>...] <EOL>
|
|
109 |
|
|
110 |
May only be called once attached and the target process must be
|
|
111 |
suspended; otherwise, returns 0. If available, returns handles for
|
|
112 |
all of the threads in the target process. These handles may be
|
|
113 |
used as arguments to the getcontext and selectorentry
|
|
114 |
commands. They do not need to be (and should not be) duplicated
|
|
115 |
via the duphandle command and must not be closed via the
|
|
116 |
closehandle command.
|
|
117 |
|
|
118 |
duphandle <address handle> <EOL> ::=
|
|
119 |
<bool success> [<address duplicate>] <EOL>
|
|
120 |
|
|
121 |
Duplicates a HANDLE read from the target process's address space.
|
|
122 |
HANDLE is a Windows construct (typically typedef'd to void *).
|
|
123 |
The returned handle should ultimately be closed via the
|
|
124 |
closehandle command; failing to do so can cause resource leaks.
|
|
125 |
|
|
126 |
The purpose of this command is to allow the debugger to read the
|
|
127 |
value of a thread handle from the target process and query its
|
|
128 |
register set and thread selector entries via the getcontext and
|
|
129 |
selectorentry commands, below; such use implies that the target
|
|
130 |
program has its own notion of the thread list, and further, that
|
|
131 |
the debugger has a way of locating that thread list.
|
|
132 |
|
|
133 |
closehandle <address handle> <EOL> ::=
|
|
134 |
|
|
135 |
Closes a handle retrieved via the duphandle command, above.
|
|
136 |
|
|
137 |
getcontext <address threadHandle> <EOL> ::= <bool success> [<context>] <EOL>
|
|
138 |
|
|
139 |
Returns the context for the given thread. The handle must either
|
|
140 |
be one of the handles returned from the threadlist command or the
|
|
141 |
result of duplicating a thread handle out of the target process
|
|
142 |
via the duphandle command. The target process must be suspended.
|
|
143 |
|
|
144 |
The context is returned as a series of hex values which represent
|
|
145 |
the following x86 registers in the following order:
|
|
146 |
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP, DS, ES, FS, GS,
|
|
147 |
CS, SS, EFLAGS, DR0, DR1, DR2, DR3, DR6, DR7
|
|
148 |
|
|
149 |
FIXME: needs to be generalized and/or specified for other
|
|
150 |
architectures.
|
|
151 |
|
|
152 |
setcontext <address threadHandle> <context> ::= <bool success> <EOL>
|
|
153 |
|
|
154 |
Sets the context of the given thread. The target process must be
|
|
155 |
suspended. See the getcontext command for the ordering of the
|
|
156 |
registers in the context.
|
|
157 |
|
|
158 |
Even if the setcontext command succeeds, some of the bits in some
|
|
159 |
of the registers (like the global enable bits in the debug
|
|
160 |
registers) may be overridden by the operating system. To ensure
|
|
161 |
the debugger's notion of the register set is up to date, it is
|
|
162 |
recommended to follow up a setcontext with a getcontext.
|
|
163 |
|
|
164 |
selectorentry <address threadHandle> <int selector> <EOL> ::=
|
|
165 |
<bool success>
|
|
166 |
[<address limitLow> <address baseLow>
|
|
167 |
<address baseMid> <address flags1>
|
|
168 |
<address flags2> <address baseHi>] <EOL>
|
|
169 |
|
|
170 |
Retrieves a descriptor table entry for the given thread and
|
|
171 |
selector. This data structure allows conversion of a
|
|
172 |
segment-relative address to a linear virtual address. It is most
|
|
173 |
useful for locating the Thread Information Block for a given
|
|
174 |
thread handle to be able to find that thread's ID, to be able to
|
|
175 |
understand whether two different thread handles in fact refer to
|
|
176 |
the same underlying thread.
|
|
177 |
|
|
178 |
This command will only work on the X86 architecture and will
|
|
179 |
return false for the success flag (with no additional information
|
|
180 |
sent) on other architectures.
|
|
181 |
|
|
182 |
suspend ::=
|
|
183 |
|
|
184 |
Suspends the target process. Must be attached to a target process.
|
|
185 |
A process is suspended when attached to via the attach command. If
|
|
186 |
the target process is already suspended then this command has no
|
|
187 |
effect.
|
|
188 |
|
|
189 |
resume ::=
|
|
190 |
|
|
191 |
Resumes the target process without detaching from it. Must be
|
|
192 |
attached to a target process. After resuming a target process, the
|
|
193 |
debugger client must be prepared to poll for events from the
|
|
194 |
target process fairly frequently in order for execution in the
|
|
195 |
target process to proceed normally. If the target process is
|
|
196 |
already resumed then this command has no effect.
|
|
197 |
|
|
198 |
pollevent ::=
|
|
199 |
<bool eventPresent> [<address threadHandle> <unsigned int eventCode>]
|
|
200 |
|
|
201 |
Additional entries in result for given eventCode:
|
|
202 |
|
|
203 |
LOAD/UNLOAD_DLL_DEBUG_EVENT: <address baseOfDLL>
|
|
204 |
EXCEPTION_DEBUG_EVENT: <unsigned int exceptionCode> <address faultingPC>
|
|
205 |
|
|
206 |
Additional entries for given exceptionCode:
|
|
207 |
|
|
208 |
EXCEPTION_ACCESS_VIOLATION: <bool wasWrite> <address faultingAddress>
|
|
209 |
|
|
210 |
<EOL>
|
|
211 |
|
|
212 |
Polls once to see whether a debug event has been generated by the
|
|
213 |
target process. If none is present, returns 0 immediately.
|
|
214 |
Otherwise, returns 1 along with a series of textual information
|
|
215 |
about the event. The event is not cleared, and the thread resumed,
|
|
216 |
until the continueevent command is sent, or the debugger client
|
|
217 |
detaches from the target process.
|
|
218 |
|
|
219 |
Typically a debugger client will suspend the target process upon
|
|
220 |
reception of a debug event. Otherwise, it is not guaranteed that
|
|
221 |
all threads will be suspended upon reception of a debug event, and
|
|
222 |
any operations requiring that threads be suspended (including
|
|
223 |
fetching the context for the thread which generated the event)
|
|
224 |
will fail.
|
|
225 |
|
|
226 |
continueevent <bool passEventToClient> ::= <bool success> <EOL>
|
|
227 |
|
|
228 |
Indicates that the current debug event has been used by the
|
|
229 |
debugger client and that the target process should be resumed. The
|
|
230 |
passEventToClient flag indicates whether the event should be
|
|
231 |
propagated to the target process. Breakpoint and single-step
|
|
232 |
events should not be propagated to the target. Returns false if
|
|
233 |
there was no pending event, true otherwise.
|
|
234 |
|
|
235 |
exit <EOL>
|
|
236 |
|
|
237 |
Exits this debugger session.
|
|
238 |
|
|
239 |
Format specifications:
|
|
240 |
|
|
241 |
// Data formats and example values:
|
|
242 |
<EOL> ::= end of line (typically \n on Unix platforms, or \n\r on Windows)
|
|
243 |
<address> ::= 0x12345678[9ABCDEF0] /* up to 64-bit hex value */
|
|
244 |
<unsigned int> ::= 5 /* up to 32-bit integer number; no leading sign */
|
|
245 |
<bool> ::= 1 /* ASCII '0' or '1' */
|
|
246 |
<context> ::= <address> ...
|