1 /* Main code for remote server for GDB.
2 Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
32 int old_thread_from_wait
;
33 int extended_protocol
;
38 /* The PID of the originally created or attached inferior. Used to
39 send signals to the process when GDB sends us an asynchronous interrupt
40 (user hitting Control-C in the client), and to wait for the child to exit
41 when no longer debugging it. */
46 start_inferior (char *argv
[], char *statusptr
)
48 signal (SIGTTOU
, SIG_DFL
);
49 signal (SIGTTIN
, SIG_DFL
);
51 signal_pid
= create_inferior (argv
[0], argv
);
53 fprintf (stderr
, "Process %s created; pid = %d\n", argv
[0],
56 signal (SIGTTOU
, SIG_IGN
);
57 signal (SIGTTIN
, SIG_IGN
);
58 tcsetpgrp (fileno (stderr
), signal_pid
);
60 /* Wait till we are at 1st instruction in program, return signal number. */
61 return mywait (statusptr
, 0);
65 attach_inferior (int pid
, char *statusptr
, unsigned char *sigptr
)
67 /* myattach should return -1 if attaching is unsupported,
68 0 if it succeeded, and call error() otherwise. */
70 if (myattach (pid
) != 0)
73 /* FIXME - It may be that we should get the SIGNAL_PID from the
74 attach function, so that it can be the main thread instead of
75 whichever we were told to attach to. */
78 *sigptr
= mywait (statusptr
, 0);
83 extern int remote_debug
;
85 /* Handle all of the extended 'q' packets. */
87 handle_query (char *own_buf
)
89 static struct inferior_list_entry
*thread_ptr
;
91 if (strcmp ("qSymbol::", own_buf
) == 0)
93 if (the_target
->look_up_symbols
!= NULL
)
94 (*the_target
->look_up_symbols
) ();
96 strcpy (own_buf
, "OK");
100 if (strcmp ("qfThreadInfo", own_buf
) == 0)
102 thread_ptr
= all_threads
.head
;
103 sprintf (own_buf
, "m%x", thread_ptr
->id
);
104 thread_ptr
= thread_ptr
->next
;
108 if (strcmp ("qsThreadInfo", own_buf
) == 0)
110 if (thread_ptr
!= NULL
)
112 sprintf (own_buf
, "m%x", thread_ptr
->id
);
113 thread_ptr
= thread_ptr
->next
;
118 sprintf (own_buf
, "l");
123 /* Otherwise we didn't know what packet it was. Say we didn't
131 gdbserver_usage (void)
133 error ("Usage:\tgdbserver COMM PROG [ARGS ...]\n"
134 "\tgdbserver COMM --attach PID\n"
136 "COMM may either be a tty device (for serial debugging), or \n"
137 "HOST:PORT to listen for a TCP connection.\n");
141 main (int argc
, char *argv
[])
143 char ch
, status
, *own_buf
, mem_buf
[2000];
145 unsigned char signal
;
152 if (setjmp (toplevel
))
154 fprintf (stderr
, "Exiting\n");
161 if (argc
>= 3 && strcmp (argv
[2], "--attach") == 0)
165 && (pid
= strtoul (argv
[3], &arg_end
, 10)) != 0
174 if (argc
< 3 || bad_attach
)
179 own_buf
= malloc (PBUFSIZ
);
183 /* Wait till we are at first instruction in program. */
184 signal
= start_inferior (&argv
[2], &status
);
186 /* We are now stopped at the first instruction of the target process */
190 switch (attach_inferior (pid
, &status
, &signal
))
193 error ("Attaching not supported on this target");
203 remote_open (argv
[1]);
207 while (getpkt (own_buf
) > 0)
215 handle_query (own_buf
);
218 remote_debug
= !remote_debug
;
221 fprintf (stderr
, "Detaching from inferior\n");
227 /* If we are attached, then we can exit. Otherwise, we need to
228 hang around doing nothing, until the child is gone. */
234 ret
= waitpid (signal_pid
, &status
, 0);
235 if (WIFEXITED (status
) || WIFSIGNALED (status
))
237 } while (ret
!= -1 || errno
!= ECHILD
);
245 extended_protocol
= 1;
246 prepare_resume_reply (own_buf
, status
, signal
);
250 /* We can not use the extended protocol if we are
251 attached, because we can not restart the running
252 program. So return unrecognized. */
257 prepare_resume_reply (own_buf
, status
, signal
);
263 general_thread
= strtol (&own_buf
[2], NULL
, 16);
265 set_desired_inferior (1);
268 cont_thread
= strtol (&own_buf
[2], NULL
, 16);
272 step_thread
= strtol (&own_buf
[2], NULL
, 16);
276 /* Silently ignore it so that gdb can extend the protocol
277 without compatibility headaches. */
283 set_desired_inferior (1);
284 registers_to_string (own_buf
);
287 set_desired_inferior (1);
288 registers_from_string (&own_buf
[1]);
292 decode_m_packet (&own_buf
[1], &mem_addr
, &len
);
293 read_inferior_memory (mem_addr
, mem_buf
, len
);
294 convert_int_to_ascii (mem_buf
, own_buf
, len
);
297 decode_M_packet (&own_buf
[1], &mem_addr
, &len
, mem_buf
);
298 if (write_inferior_memory (mem_addr
, mem_buf
, len
) == 0)
304 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
305 if (target_signal_to_host_p (sig
))
306 signal
= target_signal_to_host (sig
);
309 set_desired_inferior (0);
310 myresume (0, signal
);
311 signal
= mywait (&status
, 1);
312 prepare_resume_reply (own_buf
, status
, signal
);
315 convert_ascii_to_int (own_buf
+ 1, &sig
, 1);
316 if (target_signal_to_host_p (sig
))
317 signal
= target_signal_to_host (sig
);
320 set_desired_inferior (0);
321 myresume (1, signal
);
322 signal
= mywait (&status
, 1);
323 prepare_resume_reply (own_buf
, status
, signal
);
326 set_desired_inferior (0);
328 signal
= mywait (&status
, 1);
329 prepare_resume_reply (own_buf
, status
, signal
);
332 set_desired_inferior (0);
334 signal
= mywait (&status
, 1);
335 prepare_resume_reply (own_buf
, status
, signal
);
338 fprintf (stderr
, "Killing inferior\n");
340 /* When using the extended protocol, we start up a new
341 debugging session. The traditional protocol will
343 if (extended_protocol
)
346 fprintf (stderr
, "GDBserver restarting\n");
348 /* Wait till we are at 1st instruction in prog. */
349 signal
= start_inferior (&argv
[2], &status
);
359 if (mythread_alive (strtol (&own_buf
[1], NULL
, 16)))
365 /* Restarting the inferior is only supported in the
366 extended protocol. */
367 if (extended_protocol
)
371 fprintf (stderr
, "GDBserver restarting\n");
373 /* Wait till we are at 1st instruction in prog. */
374 signal
= start_inferior (&argv
[2], &status
);
380 /* It is a request we don't understand. Respond with an
381 empty packet so that gdb knows that we don't support this
387 /* It is a request we don't understand. Respond with an
388 empty packet so that gdb knows that we don't support this
398 "\nChild exited with status %d\n", sig
);
400 fprintf (stderr
, "\nChild terminated with signal = 0x%x\n", sig
);
401 if (status
== 'W' || status
== 'X')
403 if (extended_protocol
)
405 fprintf (stderr
, "Killing inferior\n");
408 fprintf (stderr
, "GDBserver restarting\n");
410 /* Wait till we are at 1st instruction in prog. */
411 signal
= start_inferior (&argv
[2], &status
);
417 fprintf (stderr
, "GDBserver exiting\n");
423 /* We come here when getpkt fails.
425 For the extended remote protocol we exit (and this is the only
426 way we gracefully exit!).
428 For the traditional remote protocol close the connection,
429 and re-open it at the top of the loop. */
430 if (extended_protocol
)
437 fprintf (stderr
, "Remote side has terminated connection. "
438 "GDBserver will reopen the connection.\n");
This page took 0.052584 seconds and 4 git commands to generate.