45 #define require_running_or_return(BUF) \ 46 if (!target_running ()) \ 52 #define require_running_or_break(BUF) \ 53 if (!target_running ()) \ 186 if (q->free_func != NULL)
187 q->free_func (event);
227 if ((vstop_event->
status.kind == TARGET_WAITKIND_FORKED
228 || vstop_event->
status.kind == TARGET_WAITKIND_VFORKED)
269 error (
_(
"No executable file specified."));
291 fprintf (stderr,
"Attached; pid = %d\n", pid);
337 while (*buf && *buf !=
':')
345 while (*buf && *buf !=
':')
353 while (*buf && *buf !=
':')
386 if (thread->
btrace != NULL)
387 return "E.Btrace already enabled.";
391 if (thread->
btrace == NULL)
392 return "E.Could not enable btrace.";
402 if (thread->
btrace != NULL)
403 return "E.Btrace already enabled.";
407 if (thread->
btrace == NULL)
408 return "E.Could not enable btrace.";
419 if (thread->
btrace == NULL)
420 return "E.Branch tracing not enabled.";
423 return "E.Could not disable branch tracing.";
441 op =
own_buf + strlen (
"Qbtrace:");
446 strcpy (
own_buf,
"E.Must select a single thread.");
453 strcpy (
own_buf,
"E.No such thread.");
459 if (strcmp (op,
"bts") == 0)
461 else if (strcmp (op,
"pt") == 0)
463 else if (strcmp (op,
"off") == 0)
466 err =
"E.Bad Qbtrace operation. Use bts, pt, or off.";
487 op =
own_buf + strlen (
"Qbtrace-conf:");
492 strcpy (
own_buf,
"E.Must select a single thread.");
499 strcpy (
own_buf,
"E.No such thread.");
509 size = strtoul (op + strlen (
"bts:size="), &endp, 16);
510 if (endp == NULL || *endp != 0 ||
errno != 0 || size > UINT_MAX)
512 strcpy (
own_buf,
"E.Bad size value.");
518 else if (strncmp (op,
"pt:size=", strlen (
"pt:size=")) == 0)
524 size = strtoul (op + strlen (
"pt:size="), &endp, 16);
525 if (endp == NULL || *endp != 0 ||
errno != 0 || size > UINT_MAX)
527 strcpy (
own_buf,
"E.Bad size value.");
535 strcpy (
own_buf,
"E.Bad Qbtrace configuration option.");
550 int numsigs = (int) GDB_SIGNAL_LAST, i;
551 const char *p =
own_buf + strlen (
"QPassSignals:");
555 for (i = 0; i < numsigs; i++)
575 int numsigs = (int) GDB_SIGNAL_LAST, i;
576 const char *p =
own_buf + strlen (
"QProgramSignals:");
582 for (i = 0; i < numsigs; i++)
602 const char *p =
own_buf +
sizeof (
"QCatchSyscalls:") - 1;
613 if (strcmp (p,
"0") == 0)
615 else if (p[0] ==
'1' && (p[1] ==
';' || p[1] ==
'\0'))
619 fprintf (stderr,
"Unknown catch-syscalls mode requested: %s\n",
648 if (strcmp (
own_buf,
"QEnvironmentReset") == 0)
658 const char *p =
own_buf +
sizeof (
"QEnvironmentHexEncoded:") - 1;
666 debug_printf (
_(
"[QEnvironmentHexEncoded received '%s']\n"), p);
672 size_t pos = final_var.find (
'=');
673 if (pos == std::string::npos)
675 warning (
_(
"Unexpected format for environment variable: '%s'"),
681 var_name = final_var.substr (0, pos);
682 var_value = final_var.substr (pos + 1, std::string::npos);
692 const char *p =
own_buf +
sizeof (
"QEnvironmentUnset:") - 1;
698 debug_printf (
_(
"[Environment variable to be unset: '%s']\n"),
709 if (strcmp (
own_buf,
"QStartNoAckMode") == 0)
728 if (strcmp (mode,
"0") == 0)
730 else if (strcmp (mode,
"1") == 0)
736 fprintf (stderr,
"Unknown non-stop mode requested: %s\n",
742 req_str = req ?
"non-stop" :
"all-stop";
745 fprintf (stderr,
"Setting %s mode failed\n", req_str);
761 char *packet =
own_buf + strlen (
"QDisableRandomization:");
770 ?
"[address space randomization disabled]\n" 771 :
"[address space randomization enabled]\n");
784 char *mode =
own_buf + strlen (
"QAgent:");
787 if (strcmp (mode,
"0") == 0)
789 else if (strcmp (mode,
"1") == 0)
794 sprintf (
own_buf,
"E.Unknown QAgent value");
801 debug_printf (
"[%s agent]\n", req ?
"Enable" :
"Disable");
814 char *mode =
own_buf + strlen (
"QThreadEvents:");
817 if (strcmp (mode,
"0") == 0)
819 else if (strcmp (mode,
"1") == 0)
823 char *mode_copy =
xstrdup (mode);
826 sprintf (
own_buf,
"E.Unknown thread-events mode requested: %s\n",
847 const char *value =
own_buf + strlen (
"QStartupWithShell:");
849 if (strcmp (value,
"1") == 0)
851 else if (strcmp (value,
"0") == 0)
856 fprintf (stderr,
"Unknown value to startup-with-shell: %s\n",
872 const char *p =
own_buf + strlen (
"QSetWorkingDir:");
881 debug_printf (
_(
"[Set the inferior's current directory to %s]\n"),
892 [Unset the inferior's current directory; will use gdbserver's cwd]\n"));
917 if (strcmp (annex,
"target.xml") == 0)
948 monitor_output (
"The following monitor commands are supported:\n");
952 monitor_output (
" Enable h/w breakpoint/watchpoint debugging messages\n");
956 monitor_output (
" Add additional information to debugging messages\n");
985 memaddr, myaddr, len, &nbytes))
1005 return res == 0 ? len : -1;
1040 gdb_byte *pattern,
unsigned pattern_len,
1042 unsigned chunk_size,
unsigned search_buf_size,
1050 warning (
"Unable to access %ld bytes of target " 1051 "memory at 0x%lx, halting search.",
1052 (
long) search_buf_size, (
long) start_addr);
1062 while (search_space_len >= pattern_len)
1065 unsigned nr_search_bytes = (search_space_len < search_buf_size
1069 found_ptr = (
gdb_byte *) memmem (search_buf, nr_search_bytes, pattern,
1072 if (found_ptr != NULL)
1074 CORE_ADDR found_addr = start_addr + (found_ptr - search_buf);
1075 *found_addrp = found_addr;
1082 if (search_space_len >= chunk_size)
1083 search_space_len -= chunk_size;
1085 search_space_len = 0;
1087 if (search_space_len >= pattern_len)
1089 unsigned keep_len = search_buf_size - chunk_size;
1090 CORE_ADDR read_addr = start_addr + chunk_size + keep_len;
1095 memcpy (search_buf, search_buf + chunk_size, keep_len);
1097 nr_to_read = (search_space_len - keep_len < chunk_size
1098 ? search_space_len - keep_len
1102 nr_to_read) != search_buf_size)
1104 warning (
"Unable to access %ld bytes of target memory " 1105 "at 0x%lx, halting search.",
1106 (
long) nr_to_read, (
long) read_addr);
1110 start_addr += chunk_size;
1127 unsigned int pattern_len;
1129 #define SEARCH_CHUNK_SIZE 16000 1133 unsigned search_buf_size;
1136 int cmd_name_len =
sizeof (
"qSearch:memory:") - 1;
1138 pattern = (
gdb_byte *) malloc (packet_len);
1139 if (pattern == NULL)
1141 error (
"Unable to allocate memory to perform the search");
1146 packet_len - cmd_name_len,
1147 &start_addr, &search_space_len,
1148 pattern, &pattern_len) < 0)
1151 error (
"Error in parsing qSearch:memory packet");
1156 search_buf_size = chunk_size + pattern_len - 1;
1159 if (search_space_len < search_buf_size)
1160 search_buf_size = search_space_len;
1162 search_buf = (
gdb_byte *) malloc (search_buf_size);
1163 if (search_buf == NULL)
1166 error (
"Unable to allocate memory to perform the search");
1172 pattern, pattern_len,
1173 search_buf, chunk_size, search_buf_size,
1177 sprintf (
own_buf,
"1,%lx", (
long) found_addr);
1178 else if (found == 0)
1199 pid = strtol (&
own_buf[2], NULL, 16);
1208 if (process == NULL)
1216 "Disconnected tracing in effect, " 1217 "leaving gdbserver attached to the process\n");
1221 "Persistent commands are present, " 1222 "leaving gdbserver attached to the process\n");
1247 fprintf (stderr,
"Detaching from process %d\n",
pid);
1309 while (isspace (*arg))
1312 options = delim_string_to_char_ptr_vec (arg,
',');
1316 if (strcmp (option,
"all") == 0)
1322 else if (strcmp (option,
"none") == 0)
1328 else if (strcmp (option,
"timestamp") == 0)
1334 else if (*option ==
'\0')
1341 char *msg =
xstrprintf (
"Unknown debug-format argument: \"%s\"\n",
1358 if (strcmp (mon,
"set debug 1") == 0)
1363 else if (strcmp (mon,
"set debug 0") == 0)
1368 else if (strcmp (mon,
"set debug-hw-points 1") == 0)
1373 else if (strcmp (mon,
"set debug-hw-points 0") == 0)
1378 else if (strcmp (mon,
"set remote-debug 1") == 0)
1383 else if (strcmp (mon,
"set remote-debug 0") == 0)
1388 else if (
startswith (mon,
"set debug-format "))
1394 if (error_msg != NULL)
1402 else if (strcmp (mon,
"help") == 0)
1404 else if (strcmp (mon,
"exit") == 0)
1468 if (annex[0] ==
'\0')
1478 if (annex[0] !=
'\0')
1489 total_len = strlen (file);
1494 if (
offset + len > total_len)
1495 len = total_len -
offset;
1497 memcpy (readbuf, file +
offset, len);
1508 const char *document;
1511 if (writebuf != NULL)
1519 if (document == NULL)
1522 total_len = strlen (document);
1527 if (
offset + len > total_len)
1528 len = total_len -
offset;
1530 memcpy (readbuf, document +
offset, len);
1541 if (writebuf != NULL)
1547 std::string document =
"<library-list version=\"1.0\">\n";
1551 (
" <library name=\"%s\"><segment address=\"0x%lx\"/></library>\n",
1552 dll.name.c_str (), (long) dll.base_addr);
1554 document +=
"</library-list>\n";
1556 if (
offset > document.length ())
1559 if (
offset + len > document.length ())
1560 len = document.length () -
offset;
1562 memcpy (readbuf, &document[
offset], len);
1574 if (writebuf != NULL)
1637 if (writebuf != NULL)
1644 readbuf, len, &nbytes))
1670 sprintf (core_s,
"%d", core);
1679 char *handle_s = (
char *)
alloca (handle_len * 2 + 1);
1680 bin2hex (handle, handle_s, handle_len);
1709 static char *result = 0;
1710 static unsigned int result_length = 0;
1712 if (writebuf != NULL)
1715 if (annex[0] !=
'\0')
1731 result_length = strlen (result);
1735 if (
offset >= result_length)
1744 if (len > result_length -
offset)
1745 len = result_length -
offset;
1747 memcpy (readbuf, result +
offset, len);
1759 static char *result = 0;
1760 static unsigned int result_length = 0;
1762 if (writebuf != NULL)
1782 result_length = strlen (result);
1786 if (
offset >= result_length)
1795 if (len > result_length -
offset)
1796 len = result_length -
offset;
1798 memcpy (readbuf, result +
offset, len);
1824 static struct buffer cache;
1835 strcpy (
own_buf,
"E.Must select a single thread.");
1842 strcpy (
own_buf,
"E.No such thread.");
1846 if (thread->
btrace == NULL)
1848 strcpy (
own_buf,
"E.Btrace not enabled.");
1852 if (strcmp (annex,
"all") == 0)
1854 else if (strcmp (annex,
"new") == 0)
1856 else if (strcmp (annex,
"delta") == 0)
1860 strcpy (
own_buf,
"E.Bad annex.");
1896 static struct buffer cache;
1903 if (annex[0] !=
'\0')
1909 strcpy (
own_buf,
"E.Must select a single thread.");
1916 strcpy (
own_buf,
"E.No such thread.");
1920 if (thread->
btrace == NULL)
1922 strcpy (
own_buf,
"E.Btrace not enabled.");
1994 if (strcmp (
object, q->
object) == 0)
1996 if (strcmp (rw,
"read") == 0)
1998 unsigned char *data;
2014 data = (
unsigned char *) malloc (len + 1);
2020 n = (*q->
xfer) (annex, data, NULL, ofs, len + 1);
2040 else if (strcmp (rw,
"write") == 0)
2045 unsigned char *data;
2048 data = (
unsigned char *) malloc (packet_len - (
offset -
own_buf));
2055 &ofs, &len, data) < 0)
2062 n = (*q->
xfer) (annex, NULL, data, ofs, len);
2093 static unsigned long long 2098 unsigned char byte = 0;
2102 return (
unsigned long long) -1;
2104 crc = xcrc32 (&byte, 1, crc);
2107 return (
unsigned long long) crc;
2115 int btrace_supported = 0;
2119 strcat (buf,
";Qbtrace:bts+");
2120 strcat (buf,
";Qbtrace-conf:bts:size+");
2122 btrace_supported = 1;
2127 strcat (buf,
";Qbtrace:pt+");
2128 strcat (buf,
";Qbtrace-conf:pt:size+");
2130 btrace_supported = 1;
2133 if (!btrace_supported)
2136 strcat (buf,
";Qbtrace:off+");
2137 strcat (buf,
";qXfer:btrace:read+");
2138 strcat (buf,
";qXfer:btrace-conf:read+");
2146 static std::list<thread_info *>::const_iterator thread_iter;
2159 ptid = (*thread_iter)->id;
2168 if (strcmp (
"qSymbol::",
own_buf) == 0)
2218 if (strcmp (
"qfThreadInfo",
own_buf) == 0)
2224 ptid_t ptid = (*thread_iter)->id;
2230 if (strcmp (
"qsThreadInfo",
own_buf) == 0)
2236 ptid_t ptid = (*thread_iter)->id;
2250 && strcmp (
"qOffsets",
own_buf) == 0)
2256 sprintf (
own_buf,
"Text=%lX;Data=%lX;Bss=%lX",
2257 (
long)text, (long)data, (
long)data);
2269 int gdb_supports_qRelocInsn = 0;
2276 char **qsupported = NULL;
2283 for (p = strtok (p + 1,
";");
2285 p = strtok (NULL,
";"))
2288 qsupported =
XRESIZEVEC (
char *, qsupported, count);
2289 qsupported[count - 1] =
xstrdup (p);
2292 for (i = 0; i < count; i++)
2295 if (strcmp (p,
"multiprocess+") == 0)
2302 else if (strcmp (p,
"qRelocInsn+") == 0)
2305 gdb_supports_qRelocInsn = 1;
2307 else if (strcmp (p,
"swbreak+") == 0)
2315 else if (strcmp (p,
"hwbreak+") == 0)
2322 else if (strcmp (p,
"fork-events+") == 0)
2328 else if (strcmp (p,
"vfork-events+") == 0)
2334 else if (strcmp (p,
"exec-events+") == 0)
2340 else if (strcmp (p,
"vContSupported+") == 0)
2342 else if (strcmp (p,
"QThreadEvents+") == 0)
2344 else if (strcmp (p,
"no-resumed+") == 0)
2353 qsupported[i] = NULL;
2354 qsupported[unknown] = p;
2363 for (i = 0; i < count; i++)
2364 free (qsupported[i]);
2369 "PacketSize=%x;QPassSignals+;QProgramSignals+;" 2370 "QStartupWithShell+;QEnvironmentHexEncoded+;" 2371 "QEnvironmentReset+;QEnvironmentUnset+;" 2376 strcat (
own_buf,
";QCatchSyscalls+");
2379 strcat (
own_buf,
";qXfer:libraries-svr4:read+" 2380 ";augmented-libraries-svr4-read+");
2385 strcat (
own_buf,
";qXfer:libraries:read+");
2389 strcat (
own_buf,
";qXfer:auxv:read+");
2392 strcat (
own_buf,
";qXfer:spu:read+;qXfer:spu:write+");
2395 strcat (
own_buf,
";qXfer:siginfo:read+;qXfer:siginfo:write+");
2398 strcat (
own_buf,
";qXfer:fdpic:read+");
2404 strcat (
own_buf,
";qXfer:features:read+");
2407 strcat (
own_buf,
";QStartNoAckMode+");
2410 strcat (
own_buf,
";qXfer:osdata:read+");
2413 strcat (
own_buf,
";multiprocess+");
2416 strcat (
own_buf,
";fork-events+");
2419 strcat (
own_buf,
";vfork-events+");
2422 strcat (
own_buf,
";exec-events+");
2425 strcat (
own_buf,
";QNonStop+");
2428 strcat (
own_buf,
";QDisableRandomization+");
2430 strcat (
own_buf,
";qXfer:threads:read+");
2434 strcat (
own_buf,
";ConditionalTracepoints+");
2435 strcat (
own_buf,
";TraceStateVariables+");
2436 strcat (
own_buf,
";TracepointSource+");
2437 strcat (
own_buf,
";DisconnectedTracing+");
2439 strcat (
own_buf,
";FastTracepoints+");
2440 strcat (
own_buf,
";StaticTracepoints+");
2441 strcat (
own_buf,
";InstallInTrace+");
2442 strcat (
own_buf,
";qXfer:statictrace:read+");
2443 strcat (
own_buf,
";qXfer:traceframe-info:read+");
2444 strcat (
own_buf,
";EnableDisableTracepoints+");
2445 strcat (
own_buf,
";QTBuffer:size+");
2446 strcat (
own_buf,
";tracenz+");
2452 strcat (
own_buf,
";ConditionalBreakpoints+");
2454 strcat (
own_buf,
";BreakpointCommands+");
2462 strcat (
own_buf,
";swbreak+");
2465 strcat (
own_buf,
";hwbreak+");
2468 strcat (
own_buf,
";qXfer:exec-file:read+");
2470 strcat (
own_buf,
";vContSupported+");
2472 strcat (
own_buf,
";QThreadEvents+");
2474 strcat (
own_buf,
";no-resumed+");
2494 for (i = 0; i < 3; i++)
2502 p2 = strchr (p,
',');
2521 if (p != NULL || i < 3)
2574 char *mon = (
char *) malloc (
PBUFSIZ);
2575 int len = strlen (
own_buf + 6);
2590 mon[len / 2] =
'\0';
2610 if (strcmp (
own_buf,
"qAttached") == 0
2615 if (
own_buf[
sizeof (
"qAttached") - 1])
2617 int pid = strtoul (
own_buf +
sizeof (
"qAttached:") - 1, NULL, 16);
2626 if (process == NULL)
2642 unsigned long long crc;
2646 if (*comma++ !=
',')
2651 len = strtoul (comma, NULL, 16);
2652 crc =
crc32 (base, len, 0xffffffff);
2654 if (crc == (
unsigned long long) -1)
2659 sprintf (
own_buf,
"C%lx", (
unsigned long) crc);
2692 for (
size_t i = 0; i < num_actions; i++)
2702 if ((*callback) (action,
thread))
2717 if (
thread->status_pending_p)
2719 thread->status_pending_p = 0;
2745 p = strchr (p,
';');
2748 resume_info = (
struct thread_resume *) malloc (n *
sizeof (resume_info[0]));
2749 if (resume_info == NULL)
2757 memset (&resume_info[i], 0,
sizeof resume_info[i]);
2759 if (p[0] ==
's' || p[0] ==
'S')
2760 resume_info[i].
kind = resume_step;
2761 else if (p[0] ==
'r')
2762 resume_info[i].
kind = resume_step;
2763 else if (p[0] ==
'c' || p[0] ==
'C')
2764 resume_info[i].
kind = resume_continue;
2765 else if (p[0] ==
't')
2766 resume_info[i].
kind = resume_stop;
2770 if (p[0] ==
'S' || p[0] ==
'C')
2773 int sig = strtol (p + 1, &q, 16);
2782 else if (p[0] ==
'r')
2803 default_action = resume_info[i];
2808 else if (p[0] ==
':')
2816 if (p[0] !=
';' && p[0] != 0)
2819 resume_info[i].
thread = ptid;
2826 resume_info[i] = default_action;
2856 if (thread_with_status != NULL)
2870 if (
last_status.kind == TARGET_WAITKIND_NO_RESUMED
2875 sprintf (
own_buf,
"E.No unwaited-for children left.");
2882 &&
last_status.kind != TARGET_WAITKIND_NO_RESUMED)
2905 pid = strtol (
own_buf + 8, NULL, 16);
2938 std::vector<char *> new_argv;
2939 char *new_program_name = NULL;
2943 for (p =
own_buf + strlen (
"vRun;"); p && *p; p = strchr (p,
';'))
2949 for (i = 0, p =
own_buf + strlen (
"vRun;"); *p; p = next_p, ++i)
2951 next_p = strchr (p,
';');
2953 next_p = p + strlen (p);
2955 if (i == 0 && p == next_p)
2958 new_program_name = NULL;
2960 else if (p == next_p)
2963 new_argv.push_back (
xstrdup (
"''"));
2967 size_t len = (next_p - p) / 2;
2969 char *arg = (
char *)
xmalloc (len + 1);
2971 char *full_arg = (
char *)
xmalloc ((len + 1) * 2);
2973 char *tmp_arg = arg;
2974 char *tmp_full_arg = full_arg;
2980 while (*tmp_arg !=
'\0')
2986 *tmp_full_arg =
'\'';
2993 *tmp_full_arg =
'\\';
3001 *tmp_full_arg = *tmp_arg;
3007 *tmp_full_arg++ =
'\'';
3011 *tmp_full_arg =
'\0';
3013 new_program_name = full_arg;
3015 new_argv.push_back (full_arg);
3021 new_argv.push_back (NULL);
3023 if (new_program_name == NULL)
3072 pid = strtol (p, NULL, 16);
3097 if (strcmp (
own_buf,
"vCtrlC") == 0)
3112 strcpy (
own_buf,
"vCont;c;C;t");
3144 fprintf (stderr,
"Already debugging a process\n");
3156 fprintf (stderr,
"Already debugging a process\n");
3168 fprintf (stderr,
"No process to kill\n");
3193 int valid_cont_thread;
3198 if (step ||
sig || valid_cont_thread)
3202 resume_info[0].
kind = resume_step;
3204 resume_info[0].
kind = resume_continue;
3205 resume_info[0].
sig =
sig;
3209 if (!valid_cont_thread)
3212 resume_info[n].
kind = resume_continue;
3213 resume_info[n].
sig = 0;
3232 new_notif->
ptid = thread->
id;
3246 = target_waitstatus_to_string (&thread->
last_status);
3248 debug_printf (
"Reporting thread %s as already stopped with %s\n",
3250 status_string.c_str ());
3271 if (thread->
last_status.kind == TARGET_WAITKIND_IGNORE)
3275 thread->
last_status.kind = TARGET_WAITKIND_STOPPED;
3294 if (thread->
last_status.kind != TARGET_WAITKIND_STOPPED
3302 && thread->
last_status.value.sig != GDB_SIGNAL_TRAP))
3389 printf (
"GNU gdbserver %s%s\n" 3390 "Copyright (C) 2018 Free Software Foundation, Inc.\n" 3391 "gdbserver is free software, covered by the " 3392 "GNU General Public License.\n" 3393 "This gdbserver was configured as \"%s\"\n",
3400 fprintf (stream,
"Usage:\tgdbserver [OPTIONS] COMM PROG [ARGS ...]\n" 3401 "\tgdbserver [OPTIONS] --attach COMM PID\n" 3402 "\tgdbserver [OPTIONS] --multi COMM\n" 3404 "COMM may either be a tty device (for serial debugging),\n" 3405 "HOST:PORT to listen for a TCP connection, or '-' or 'stdio' to use \n" 3406 "stdin/stdout of gdbserver.\n" 3407 "PROG is the executable program. ARGS are arguments passed to inferior.\n" 3408 "PID is the process ID to attach to, when --attach is specified.\n" 3410 "Operating modes:\n" 3412 " --attach Attach to running process PID.\n" 3413 " --multi Start server without a specific program, and\n" 3414 " only quit when explicitly commanded.\n" 3415 " --once Exit after the first connection has closed.\n" 3416 " --help Print this message and then exit.\n" 3417 " --version Display version information and exit.\n" 3421 " --wrapper WRAPPER -- Run WRAPPER to start new programs.\n" 3422 " --disable-randomization\n" 3423 " Run PROG with address space randomization disabled.\n" 3424 " --no-disable-randomization\n" 3425 " Don't disable address space randomization when\n" 3427 " --startup-with-shell\n" 3428 " Start PROG using a shell. I.e., execs a shell that\n" 3429 " then execs PROG. (default)\n" 3430 " --no-startup-with-shell\n" 3431 " Exec PROG directly instead of using a shell.\n" 3432 " Disables argument globbing and variable substitution\n" 3433 " on UNIX-like systems.\n" 3437 " --debug Enable general debugging output.\n" 3438 " --debug-format=opt1[,opt2,...]\n" 3439 " Specify extra content in debugging output.\n" 3444 " --remote-debug Enable remote protocol debugging output.\n" 3445 " --disable-packet=opt1[,opt2,...]\n" 3446 " Disable support for RSP packets or features.\n" 3448 " vCont, Tthread, qC, qfThreadInfo and \n" 3449 " threads (disable all threading packets).\n" 3451 "For more information, consult the GDB manual (available as on-line \n" 3452 "info or a printed manual).\n");
3460 fprintf (stream,
"Disableable packets:\n" 3461 " vCont \tAll vCont packets\n" 3462 " qC \tQuerying the current thread\n" 3463 " qfThreadInfo\tThread listing\n" 3464 " Tthread \tPassing the thread specifier in the " 3465 "T stop reply packet\n" 3466 " threads \tAll of the above\n");
3472 int pid = process->
pid;
3491 fprintf (stderr,
"Killing process(es):");
3495 fprintf (stderr,
" %d", process->
pid);
3498 fprintf (stderr,
"\n");
3502 fprintf (stderr,
"Detaching process(es):");
3506 fprintf (stderr,
" %d", process->
pid);
3509 fprintf (stderr,
"\n");
3514 int pid = process->
pid;
3542 fprintf (stderr,
"Detach or kill failed: %s\n", exception.message);
3551 static void ATTRIBUTE_NORETURN
3557 const char *port = NULL;
3558 char **next_arg = &argv[1];
3559 volatile int multi_mode = 0;
3560 volatile int attach = 0;
3562 bool selftest =
false;
3564 const char *selftest_filter = NULL;
3567 while (*next_arg != NULL && **next_arg ==
'-')
3569 if (strcmp (*next_arg,
"--version") == 0)
3574 else if (strcmp (*next_arg,
"--help") == 0)
3579 else if (strcmp (*next_arg,
"--attach") == 0)
3581 else if (strcmp (*next_arg,
"--multi") == 0)
3583 else if (strcmp (*next_arg,
"--wrapper") == 0)
3590 while (*next_arg != NULL && strcmp (*next_arg,
"--") != 0)
3603 if (next_arg == tmp || *next_arg == NULL)
3612 else if (strcmp (*next_arg,
"--debug") == 0)
3614 else if (
startswith (*next_arg,
"--debug-format="))
3618 +
sizeof (
"--debug-format=") - 1, 0);
3620 if (error_msg != NULL)
3622 fprintf (stderr,
"%s", error_msg);
3626 else if (strcmp (*next_arg,
"--remote-debug") == 0)
3628 else if (strcmp (*next_arg,
"--disable-packet") == 0)
3633 else if (
startswith (*next_arg,
"--disable-packet="))
3635 char *packets, *tok;
3637 packets = *next_arg +=
sizeof (
"--disable-packet=") - 1;
3638 for (tok = strtok (packets,
",");
3640 tok = strtok (NULL,
","))
3642 if (strcmp (
"vCont", tok) == 0)
3644 else if (strcmp (
"Tthread", tok) == 0)
3646 else if (strcmp (
"qC", tok) == 0)
3648 else if (strcmp (
"qfThreadInfo", tok) == 0)
3650 else if (strcmp (
"threads", tok) == 0)
3659 fprintf (stderr,
"Don't know how to disable \"%s\".\n\n",
3666 else if (strcmp (*next_arg,
"-") == 0)
3674 else if (strcmp (*next_arg,
"--disable-randomization") == 0)
3676 else if (strcmp (*next_arg,
"--no-disable-randomization") == 0)
3678 else if (strcmp (*next_arg,
"--startup-with-shell") == 0)
3680 else if (strcmp (*next_arg,
"--no-startup-with-shell") == 0)
3682 else if (strcmp (*next_arg,
"--once") == 0)
3684 else if (strcmp (*next_arg,
"--selftest") == 0)
3686 else if (
startswith (*next_arg,
"--selftest="))
3690 selftest_filter = *next_arg + strlen (
"--selftest=");
3695 fprintf (stderr,
"Unknown argument: %s\n", *next_arg);
3708 if ((port == NULL || (!attach && !multi_mode && *next_arg == NULL))
3733 if (*next_arg != NULL && strcmp (*next_arg,
"--attach") == 0)
3740 && (*next_arg == NULL
3741 || (*next_arg)[0] ==
'\0' 3742 || (pid = strtoul (*next_arg, &arg_end, 0)) == 0
3744 || next_arg[1] != NULL))
3772 printf (
_(
"Selftests are not available in a non-development build.\n"));
3777 if (pid == 0 && *next_arg != NULL)
3781 n = argc - (next_arg - argv);
3783 for (i = 1; i < n; i++)
3797 error (
"Attaching not supported on this target");
3820 if (!was_running && !multi_mode)
3821 error (
"No program to debug");
3865 "Remote side has terminated connection. " 3866 "GDBserver will reopen the connection.\n");
3899 "Disconnected tracing disabled; " 3900 "stopping trace run.\n");
3908 fprintf (stderr,
"gdbserver: %s\n", exception.message);
3938 fprintf (stderr,
"%s\n", exception.message);
3939 fprintf (stderr,
"Exiting\n");
3957 const char *dataptr = *packet;
3961 if (*dataptr !=
';')
3968 if (*dataptr ==
';')
3971 if (*dataptr ==
'X')
3977 dataptr = strchrnul (dataptr,
';');
3981 dataptr += strlen (
"cmds:");
3983 debug_printf (
"Found breakpoint commands %s.\n", dataptr);
3984 persist = (*dataptr ==
'1');
3987 dataptr = strchrnul (dataptr,
';');
3991 fprintf (stderr,
"Unknown token %c, ignoring.\n",
3994 dataptr = strchrnul (dataptr,
';');
4014 int new_packet_len = -1;
4020 if (packet_len <= 0)
4056 else if (thread_id.
is_pid ())
4067 thread_id = thread->
id;
4089 thread_id = thread->
id;
4173 &mem_addr, &len, &
mem_buf) < 0
4216 const int insert = ch ==
'Z';
4220 kind = strtol (p + 1, &dataptr, 16);
4237 const char *options = dataptr;
4260 fprintf (stderr,
"Killing all inferiors\n");
4302 fprintf (stderr,
"GDBserver restarting\n");
4349 if (new_packet_len != -1)
4405 if (
last_status.kind == TARGET_WAITKIND_NO_RESUMED)
4410 else if (
last_status.kind != TARGET_WAITKIND_IGNORE)
4422 else if (
last_status.kind == TARGET_WAITKIND_THREAD_EXITED)
4443 ||
last_status.kind == TARGET_WAITKIND_THREAD_EXITED)
4450 enum gdb_signal signal;
4453 debug_printf (
"GDB not connected; forwarding event %d for" 4461 signal = GDB_SIGNAL_0;
int handle_tracepoint_query(char *packet)
struct btrace_config_bts bts
void remote_prepare(const char *name)
void target_mourn_inferior(ptid_t ptid)
int handle_serial_event(int err, gdb_client_data client_data)
struct thread_info * current_thread
int handle_target_event(int err, gdb_client_data client_data)
void start_event_loop(void)
void monitor_output(const char *msg)
static int vCont_supported
constexpr int pid() const
#define target_supports_btrace(format)
static void detach_or_kill_for_exit_cleanup(void *ignore)
static int report_no_resumed
struct thread_info * find_thread_ptid(ptid_t ptid)
static void xfree(T *ptr)
int target_supports_multi_process(void)
struct btrace_target_info * btrace
#define require_running_or_return(BUF)
#define target_core_of_thread(ptid)
void notice_open_fds(void)
#define target_handle_new_gdb_connection()
int fetch_traceframe_registers(int tfnum, struct regcache *regcache, int regnum)
static int handle_pending_status(const struct thread_resume *resumption, struct thread_info *thread)
static int target_running(void)
int(* qxfer_osdata)(const char *annex, unsigned char *readbuf, unsigned const char *writebuf, CORE_ADDR offset, int len)
int add_breakpoint_condition(struct gdb_breakpoint *bp, const char **condition)
static struct btrace_config current_btrace_conf
static int extended_protocol
int(* get_tls_address)(struct thread_info *thread, CORE_ADDR offset, CORE_ADDR load_module, CORE_ADDR *address)
struct regcache * new_register_cache(const struct target_desc *tdesc)
int putpkt_binary(char *buf, int cnt)
#define target_supports_vfork_events()
ptid_t read_ptid(const char *buf, const char **obuf)
static void handle_qxfer_threads_proper(struct buffer *buffer)
int ptid_get_pid(const ptid_t &ptid)
int decode_xfer_write(char *buf, int packet_len, CORE_ADDR *offset, unsigned int *len, unsigned char *data)
static const char * get_features_xml(const char *annex)
#define target_supports_range_stepping()
void set_inferior_cwd(const char *cwd)
void notif_push(struct notif_server *np, struct notif_event *new_event)
static int write_qxfer_response(char *buf, const gdb_byte *data, int len, int is_more)
void notif_event_enque(struct notif_server *notif, struct notif_event *event)
void prepare_resume_reply(char *buf, ptid_t ptid, struct target_waitstatus *status)
int add_breakpoint_commands(struct gdb_breakpoint *bp, const char **command, int persist)
void warning(const char *fmt,...)
#define target_supports_exec_events()
static int handle_qxfer_features(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
static ptid_t ptid_of(const thread_info *thread)
static const char * handle_btrace_enable_bts(struct thread_info *thread)
static void gdbserver_version(void)
int bin2hex(const gdb_byte *bin, char *hex, int count)
void enable_async_io(void)
static int handle_qxfer(char *own_buf, int packet_len, int *new_packet_len_p)
static int handle_qxfer_libraries_svr4(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
void buffer_free(struct buffer *buffer)
static void handle_status(char *own_buf)
#define target_supports_disable_randomization()
#define target_supports_stopped_by_sw_breakpoint()
void initialize_tracepoint(void)
int(* read_loadmap)(const char *annex, CORE_ADDR offset, unsigned char *myaddr, unsigned int len)
void * memset(T *s, int c, size_t n)=delete
void set(const char *var, const char *value)
static thread_info * find_thread(Func func)
struct target_waitstatus status
void initialize_async_io(void)
char * paddress(CORE_ADDR addr)
struct thread_info * find_any_thread_of_pid(int pid)
static int handle_qxfer_libraries(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
#define mythread_alive(pid)
int(* get_tib_address)(ptid_t ptid, CORE_ADDR *address)
void handle_v_requests(char *own_buf, int packet_len, int *new_packet_len)
#define QUEUE_remove_elem(TYPE, Q, ITER)
int remote_escape_output(const gdb_byte *buffer, int len_units, int unit_size, gdb_byte *out_buf, int *out_len_units, int out_maxlen_bytes)
int() visit_actioned_threads_callback_ftype(const struct thread_resume *, struct thread_info *)
#define target_process_qsupported(features, count)
static bool visit_actioned_threads(thread_info *thread, const struct thread_resume *actions, size_t num_actions, visit_actioned_threads_callback_ftype *callback)
int(* qxfer_siginfo)(const char *annex, unsigned char *readbuf, unsigned const char *writebuf, CORE_ADDR offset, int len)
const char *const xml_builtin[][2]
int handle_notif_ack(char *own_buf, int packet_len)
char * write_ptid(char *buf, ptid_t ptid)
void remote_open(const char *name)
int have_attached_inferiors_p(void)
static void for_each_thread(Func func)
static int remove_all_on_match_ptid(QUEUE(notif_event_p) *q, QUEUE_ITER(notif_event_p) *iter, struct notif_event *event, void *data)
#define target_supports_agent()
static int pid_of(const thread_info *thread)
struct target_ops * the_target
const char * tdesc_get_features_xml(target_desc *tdesc)
static gdb_environ from_host_environ()
CORE_ADDR step_range_start
#define target_supports_fork_events()
static int decode_xfer_read(char *buf, CORE_ADDR *ofs, unsigned int *len)
#define target_supports_catch_syscall()
static void myresume(char *own_buf, int step, int sig)
void disable_async_io(void)
void hostio_handle_new_gdb_connection(void)
void initialize_event_loop(void)
enum resume_kind last_resume_kind
char * xstrdup(const char *s)
#define STDIO_CONNECTION_NAME
static std::string wrapper_argv
static void detach_or_kill_for_exit(void)
void decode_address(CORE_ADDR *addrp, const char *start, int len)
#define join_inferior(pid)
#define VEC_iterate(T, V, I, P)
static void gdb_wants_all_threads_stopped(void)
int(* read_offsets)(CORE_ADDR *text, CORE_ADDR *data)
int in_queued_stop_replies(ptid_t ptid)
#define target_supports_software_single_step()
#define CATCH(EXCEPTION, MASK)
DEFINE_QUEUE_P(notif_event_p)
int(* thread_stopped)(struct thread_info *thread)
gdb_environ * get_environ()
int disable_randomization
void buffer_xml_printf(struct buffer *buffer, const char *format,...)
static void push_stop_notification(ptid_t ptid, struct target_waitstatus *status)
process_info * find_process_pid(int pid)
void free_char_ptr_vec(VEC(char_ptr) *char_ptr_vec)
int program_signals[GDB_SIGNAL_LAST]
const char * decode_address_to_semicolon(CORE_ADDR *addrp, const char *start)
static gdb_environ our_environ
void(* request_interrupt)(void)
int in_readonly_region(CORE_ADDR addr, ULONGEST length)
static int gdb_read_memory(CORE_ADDR memaddr, unsigned char *myaddr, int len)
#define detach_inferior(pid)
int any_persistent_commands(void)
#define target_supports_non_stop()
int read_inferior_memory(CORE_ADDR memaddr, unsigned char *myaddr, int len)
#define gdb_assert_not_reached(message)
int(* handle_monitor_command)(char *)
static unsigned long long crc32(CORE_ADDR base, int len, unsigned int crc)
ptid_t pid_to_ptid(int pid)
std::vector< int > syscalls_to_catch
static void gdb_wants_thread_stopped(thread_info *thread)
static int response_needed
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
static int handle_qxfer_btrace(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
int handle_tracepoint_general_set(char *packet)
#define target_supports_fast_tracepoints()
int gdb_signal_to_host(enum gdb_signal)
void decode_m_packet(char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr)
static void handle_general_set(char *own_buf)
int disable_packet_Tthread
static void process_point_options(struct gdb_breakpoint *bp, const char **packet)
void tracepoint_look_up_symbols(void)
int delete_gdb_breakpoint(char z_type, CORE_ADDR addr, int kind)
void free_vector_argv(std::vector< char *> &v)
void target_continue(ptid_t ptid, enum gdb_signal signal)
int decode_search_memory_packet(const char *buf, int packet_len, CORE_ADDR *start_addrp, CORE_ADDR *search_space_lenp, gdb_byte *pattern, unsigned int *pattern_lenp)
int traceframe_read_info(int tfnum, struct buffer *buffer)
static int attach_inferior(int pid)
static void supported_btrace_packets(char *buf)
static char * parse_debug_format_options(const char *arg, int is_monitor)
int gdb_signal_to_host_p(enum gdb_signal signo)
static int startswith(const char *string, const char *pattern)
#define require_running_or_break(BUF)
void target_continue_no_signal(ptid_t ptid)
static unsigned char * mem_buf
#define target_enable_btrace(ptid, conf)
static int gdb_write_memory(CORE_ADDR memaddr, const unsigned char *myaddr, int len)
#define target_read_btrace(tinfo, buffer, type)
char * xstrprintf(const char *format,...)
struct process_info * current_process(void)
static int handle_v_run(char *own_buf)
#define buffer_grow_str(BUFFER, STRING)
static void gdbserver_show_disableable(FILE *stream)
#define XRESIZEVEC(T, P, N)
long ptid_get_lwp(const ptid_t &ptid)
static int handle_btrace_conf_general_set(char *own_buf)
int handle_vFile(char *own_buf, int packet_len, int *new_packet_len)
static void queue_stop_reply(ptid_t ptid, struct target_waitstatus *status)
int kill_inferior(int pid)
static void vstop_notif_reply(struct notif_event *event, char *own_buf)
struct target_waitstatus last_status
int disable_packet_qfThreadInfo
ptid_t mywait(ptid_t ptid, struct target_waitstatus *ourstatus, int options, int connected_wait)
void(* look_up_symbols)(void)
struct thread_info * get_first_thread(void)
static int handle_v_attach(char *own_buf)
#define stabilize_threads()
int write_inferior_memory(CORE_ADDR memaddr, const unsigned char *myaddr, int len)
static int in_queued_stop_replies_ptid(QUEUE(notif_event_p) *q, QUEUE_ITER(notif_event_p) *iter, struct notif_event *event, void *data)
static int handle_qxfer_auxv(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
struct btrace_config_pt pt
static void monitor_show_help(void)
int(* qxfer_spu)(const char *annex, unsigned char *readbuf, unsigned const char *writebuf, CORE_ADDR offset, int len)
void decode_M_packet(char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr, unsigned char **to_p)
#define buffer_grow_str0(BUFFER, STRING)
int(* qxfer_libraries_svr4)(const char *annex, unsigned char *readbuf, unsigned const char *writebuf, CORE_ADDR offset, int len)
static void for_each_process(Func func)
static void handle_search_memory(char *own_buf, int packet_len)
static int handle_v_kill(char *own_buf)
#define create_inferior(program, program_args)
void buffer_init(struct buffer *buffer)
#define pause_all(freeze)
#define QUEUE_iterate(TYPE, Q, OPERATE, PARAM)
const char * get_exec_wrapper()
std::list< thread_info * > all_threads
void save_original_signals_state(bool quiet)
const struct target_desc * current_target_desc(void)
std::list< dll_info > all_dlls
void run_tests(const char *filter)
static int process_serial_event(void)
static void resume(struct thread_resume *actions, size_t n)
static void handle_v_cont(char *own_buf)
int main(int argc, char *argv[])
int(* read_auxv)(CORE_ADDR offset, unsigned char *myaddr, unsigned int len)
int prepare_to_access_memory(void)
static int handle_btrace_general_set(char *own_buf)
const char * target_pid_to_str(ptid_t ptid)
static void queue_stop_reply_callback(thread_info *thread)
static int handle_qxfer_spu(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
void registers_to_string(struct regcache *regcache, char *buf)
static void handle_monitor_command(char *mon, char *own_buf)
static int decode_xfer(char *buf, char **object, char **rw, char **annex, char **offset)
std::string hex2str(const char *hex)
void(* resume)(struct thread_resume *resume_info, size_t n)
static const struct qxfer qxfer_packets[]
static void set_pending_status_callback(thread_info *thread)
static int handle_qxfer_btrace_conf(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
void clear_breakpoint_conditions_and_commands(struct gdb_breakpoint *bp)
constexpr bool is_pid() const
struct notif_server notif_stop
struct regcache * get_thread_regcache(struct thread_info *thread, int fetch)
struct target_waitstatus last_status
int have_started_inferiors_p(void)
IP_AGENT_EXPORT_VAR int tracing
std::string string_printf(const char *fmt,...)
static const char * handle_btrace_disable(struct thread_info *thread)
static int handle_qxfer_traceframe_info(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
static int handle_search_memory_1(CORE_ADDR start_addr, CORE_ADDR search_space_len, gdb_byte *pattern, unsigned pattern_len, gdb_byte *search_buf, unsigned chunk_size, unsigned search_buf_size, CORE_ADDR *found_addrp)
static void handle_query(char *own_buf, int packet_len, int *new_packet_len_p)
static void handle_detach(char *own_buf)
static int handle_qxfer_osdata(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
void free_register_cache(struct regcache *regcache)
int(* xfer)(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
#define thread_stopped(thread)
int ptid_match(const ptid_t &ptid, const ptid_t &filter)
unsigned long long ULONGEST
#define target_read_btrace_conf(tinfo, buffer)
void throw_quit(const char *fmt,...)
struct gdb_breakpoint * set_gdb_breakpoint(char z_type, CORE_ADDR addr, int kind, int *err)
void unset(const char *var)
static int handle_qxfer_threads(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
void discard_queued_stop_replies(ptid_t ptid)
int hex2bin(const char *hex, gdb_byte *bin, int count)
static int handle_qxfer_exec_file(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
enum btrace_format format
const char * unpack_varlen_hex(const char *buff, ULONGEST *result)
void initialize_low(void)
static void handle_qxfer_threads_worker(thread_info *thread, struct buffer *buffer)
static const char * handle_btrace_enable_pt(struct thread_info *thread)
void debug_printf(const char *fmt,...)
static int handle_qxfer_fdpic(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
#define target_thread_name(ptid)
int transport_is_reliable
#define target_thread_handle(ptid, handle, handle_len)
void notif_write_event(struct notif_server *notif, char *own_buf)
int traceframe_read_sdata(int tfnum, ULONGEST offset, unsigned char *buf, ULONGEST length, ULONGEST *nbytes)
static int handle_qxfer_siginfo(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
static std::vector< char * > program_args
static char * program_name
#define SEARCH_CHUNK_SIZE
static void ATTRIBUTE_NORETURN captured_main(int argc, char *argv[])
char * buffer_finish(struct buffer *buffer)
static int handle_qxfer_statictrace(const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
int(* read_btrace)(struct btrace_target_info *, struct buffer *, enum btrace_read_type type)
void validate_breakpoints(void)
static void gdbserver_usage(FILE *stream)
void mark_breakpoints_out(struct process_info *proc)
int decode_X_packet(char *from, int packet_len, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr, unsigned char **to_p)
#define target_supports_stopped_by_hw_breakpoint()
void error(const char *fmt,...)
char *(* pid_to_exec_file)(int pid)
char * get_exec_file(int err)
void registers_from_string(struct regcache *regcache, char *buf)
#define target_supports_hardware_single_step()
int traceframe_read_mem(int tfnum, CORE_ADDR addr, unsigned char *buf, ULONGEST length, ULONGEST *nbytes)
#define target_supports_tracepoints()
void done_accessing_memory(void)
int pass_signals[GDB_SIGNAL_LAST]
int(* read_btrace_conf)(const struct btrace_target_info *, struct buffer *)
void initialize_notif(void)
void write_enn(char *buf)
int start_non_stop(int nonstop)
static int exit_requested
#define target_disable_btrace(tinfo)
static void kill_inferior_callback(process_info *process)