1 /*--------------------------------------------------------------------*/ 2 /*--- Relay between gdb and gdbserver embedded in valgrind vgdb.c ---*/ 3 /*--------------------------------------------------------------------*/ 4 5 /* 6 This file is part of Valgrind, a dynamic binary instrumentation 7 framework. 8 9 Copyright (C) 2011-2017 Philippe Waroquiers 10 11 This program is free software; you can redistribute it and/or 12 modify it under the terms of the GNU General Public License as 13 published by the Free Software Foundation; either version 2 of the 14 License, or (at your option) any later version. 15 16 This program is distributed in the hope that it will be useful, but 17 WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program; if not, write to the Free Software 23 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 24 02111-1307, USA. 25 26 The GNU General Public License is contained in the file COPYING. 27 */ 28 29 #include "vgdb.h" 30 31 #include "config.h" 32 33 #include <assert.h> 34 #include <dirent.h> 35 #include <errno.h> 36 #include <fcntl.h> 37 #include <limits.h> 38 #include <poll.h> 39 #include <pthread.h> 40 #include <signal.h> 41 #include <stdlib.h> 42 #include <stdio.h> 43 #include <string.h> 44 #include <unistd.h> 45 #include <netinet/in.h> 46 #include <sys/mman.h> 47 #include <sys/socket.h> 48 #include <sys/stat.h> 49 #include <sys/time.h> 50 51 /* vgdb has two usages: 52 1. relay application between gdb and the gdbserver embedded in valgrind. 53 2. standalone to send monitor commands to a running valgrind-ified process 54 55 It is made of a main program which reads arguments. If no 56 arguments are given or only --pid and --vgdb-prefix, then usage 1 is 57 assumed. 58 59 As relay application, vgdb reads bytes from gdb on stdin and 60 writes these bytes to valgrind. Bytes read from valgrind are 61 written to gdb on stdout. Read/Write from/to valgrind is done 62 using FIFOs. There is one thread reading from stdin, writing to 63 valgrind on a FIFO. There is one thread reading from valgrind on a 64 FIFO, writing to gdb on stdout 65 66 As a standalone utility, vgdb builds command packets to write to valgrind, 67 sends it and reads the reply. The same two threads are used to write/read. 68 Once all the commands are sent and their replies received, vgdb will exit. 69 */ 70 71 int debuglevel; 72 struct timeval dbgtv; 73 static char *vgdb_prefix = NULL; 74 75 /* Will be set to True when any condition indicating we have to shutdown 76 is encountered. */ 77 Bool shutting_down = False; 78 79 VgdbShared32 *shared32; 80 VgdbShared64 *shared64; 81 #define VS_written_by_vgdb (shared32 != NULL ? \ 82 shared32->written_by_vgdb \ 83 : shared64->written_by_vgdb) 84 #define VS_seen_by_valgrind (shared32 != NULL ? \ 85 shared32->seen_by_valgrind \ 86 : shared64->seen_by_valgrind) 87 88 #define VS_vgdb_pid (shared32 != NULL ? shared32->vgdb_pid : shared64->vgdb_pid) 89 90 void *vmalloc(size_t size) 91 { 92 void * mem = malloc(size); 93 if (mem == NULL) 94 XERROR (errno, "can't allocate memory\n"); 95 return mem; 96 } 97 98 void *vrealloc(void *ptr,size_t size) 99 { 100 void * mem = realloc(ptr, size); 101 if (mem == NULL) 102 XERROR (errno, "can't reallocate memory\n"); 103 return mem; 104 } 105 106 /* Return the name of a directory for temporary files. */ 107 static 108 const char *vgdb_tmpdir(void) 109 { 110 const char *tmpdir; 111 112 tmpdir = getenv("TMPDIR"); 113 if (tmpdir == NULL || *tmpdir == '\0') 114 tmpdir = VG_TMPDIR; 115 if (tmpdir == NULL || *tmpdir == '\0') 116 tmpdir = "/tmp"; /* fallback */ 117 118 return tmpdir; 119 } 120 121 /* Return the default path prefix for the named pipes (FIFOs) used by vgdb/gdb 122 to communicate with valgrind */ 123 static 124 char *vgdb_prefix_default(void) 125 { 126 static HChar *prefix; 127 128 if (prefix == NULL) { 129 const char *tmpdir = vgdb_tmpdir(); 130 prefix = vmalloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1); 131 strcpy(prefix, tmpdir); 132 strcat(prefix, "/vgdb-pipe"); 133 } 134 return prefix; 135 } 136 137 /* add nrw to the written_by_vgdb field of shared32 or shared64 */ 138 static 139 void add_written(int nrw) 140 { 141 if (shared32 != NULL) 142 shared32->written_by_vgdb += nrw; 143 else if (shared64 != NULL) 144 shared64->written_by_vgdb += nrw; 145 else 146 assert(0); 147 } 148 149 static int shared_mem_fd = -1; 150 static 151 void map_vgdbshared (char* shared_mem) 152 { 153 struct stat fdstat; 154 void **s; 155 shared_mem_fd = open(shared_mem, O_RDWR); 156 /* shared_mem_fd will not be closed till vgdb exits. */ 157 158 if (shared_mem_fd == -1) 159 XERROR (errno, "error opening %s shared memory file\n", shared_mem); 160 161 if (fstat(shared_mem_fd, &fdstat) != 0) 162 XERROR (errno, "fstat"); 163 164 if (fdstat.st_size == sizeof(VgdbShared64)) 165 s = (void*) &shared64; 166 else if (fdstat.st_size == sizeof(VgdbShared32)) 167 s = (void*) &shared32; 168 else 169 #if VEX_HOST_WORDSIZE == 8 170 XERROR (0, 171 "error size shared memory file %s.\n" 172 "expecting size %d (64bits) or %d (32bits) got %ld.\n", 173 shared_mem, 174 (int) sizeof(VgdbShared64), (int) sizeof(VgdbShared32), 175 (long int)fdstat.st_size); 176 #elif VEX_HOST_WORDSIZE == 4 177 XERROR (0, 178 "error size shared memory file %s.\n" 179 "expecting size %d (32bits) got %ld.\n", 180 shared_mem, 181 (int) sizeof(VgdbShared32), 182 fdstat.st_size); 183 #else 184 # error "unexpected wordsize" 185 #endif 186 187 #if VEX_HOST_WORDSIZE == 4 188 if (shared64 != NULL) 189 XERROR (0, "cannot use 32 bits vgdb with a 64bits valgrind process\n"); 190 /* But we can use a 64 bits vgdb with a 32 bits valgrind */ 191 #endif 192 193 *s = (void*) mmap (NULL, fdstat.st_size, 194 PROT_READ|PROT_WRITE, MAP_SHARED, 195 shared_mem_fd, 0); 196 197 if (*s == (void *) -1) 198 XERROR (errno, "error mmap shared memory file %s\n", shared_mem); 199 200 } 201 202 /* This function loops till shutting_down becomes true. In this loop, 203 it verifies if valgrind process is reading the characters written 204 by vgdb. The verification is done every max_invoke_ms ms. If 205 valgrind is not reading characters, it will use invoker_invoke_gdbserver 206 to ensure that the gdbserver code is called soon by valgrind. */ 207 static int max_invoke_ms = 100; 208 #define NEVER 99999999 209 static int cmd_time_out = NEVER; 210 static 211 void *invoke_gdbserver_in_valgrind(void *v_pid) 212 { 213 struct timeval cmd_max_end_time; 214 Bool cmd_started = False; 215 struct timeval invoke_time; 216 217 int pid = *(int *)v_pid; 218 int written_by_vgdb_before_sleep; 219 int seen_by_valgrind_before_sleep; 220 221 int invoked_written = -1; 222 unsigned int usecs; 223 224 pthread_cleanup_push(invoker_cleanup_restore_and_detach, v_pid); 225 226 while (!shutting_down) { 227 written_by_vgdb_before_sleep = VS_written_by_vgdb; 228 seen_by_valgrind_before_sleep = VS_seen_by_valgrind; 229 DEBUG(3, 230 "written_by_vgdb_before_sleep %d " 231 "seen_by_valgrind_before_sleep %d\n", 232 written_by_vgdb_before_sleep, 233 seen_by_valgrind_before_sleep); 234 if (cmd_time_out != NEVER 235 && !cmd_started 236 && written_by_vgdb_before_sleep > seen_by_valgrind_before_sleep) { 237 /* A command was started. Record the time at which it was started. */ 238 DEBUG(1, "IO for command started\n"); 239 gettimeofday(&cmd_max_end_time, NULL); 240 cmd_max_end_time.tv_sec += cmd_time_out; 241 cmd_started = True; 242 } 243 if (max_invoke_ms > 0) { 244 usecs = 1000 * max_invoke_ms; 245 gettimeofday(&invoke_time, NULL); 246 invoke_time.tv_sec += max_invoke_ms / 1000; 247 invoke_time.tv_usec += 1000 * (max_invoke_ms % 1000); 248 invoke_time.tv_sec += invoke_time.tv_usec / (1000 * 1000); 249 invoke_time.tv_usec = invoke_time.tv_usec % (1000 * 1000); 250 } else { 251 usecs = 0; 252 } 253 if (cmd_started) { 254 // 0 usecs here means the thread just has to check gdbserver eats 255 // the characters in <= cmd_time_out seconds. 256 // We will just wait by 1 second max at a time. 257 if (usecs == 0 || usecs > 1000 * 1000) 258 usecs = 1000 * 1000; 259 } 260 usleep(usecs); 261 262 /* If nothing happened during our sleep, let's try to wake up valgrind 263 or check for cmd time out. */ 264 if (written_by_vgdb_before_sleep == VS_written_by_vgdb 265 && seen_by_valgrind_before_sleep == VS_seen_by_valgrind 266 && VS_written_by_vgdb > VS_seen_by_valgrind) { 267 struct timeval now; 268 gettimeofday(&now, NULL); 269 DEBUG(2, 270 "after sleep " 271 "written_by_vgdb %d " 272 "seen_by_valgrind %d " 273 "invoked_written %d\n", 274 VS_written_by_vgdb, 275 VS_seen_by_valgrind, 276 invoked_written); 277 /* if the pid does not exist anymore, we better stop */ 278 if (kill(pid, 0) != 0) 279 XERROR (errno, 280 "invoke_gdbserver_in_valgrind: " 281 "check for pid %d existence failed\n", pid); 282 if (cmd_started) { 283 if (timercmp (&now, &cmd_max_end_time, >)) 284 XERROR (0, 285 "pid %d did not handle a command in %d seconds\n", 286 pid, cmd_time_out); 287 } 288 if (max_invoke_ms > 0 && timercmp (&now, &invoke_time, >=)) { 289 /* only need to wake up if the nr written has changed since 290 last invoke. */ 291 if (invoked_written != written_by_vgdb_before_sleep) { 292 if (invoker_invoke_gdbserver(pid)) { 293 /* If invoke successful, no need to invoke again 294 for the same value of written_by_vgdb_before_sleep. */ 295 invoked_written = written_by_vgdb_before_sleep; 296 } 297 } 298 } 299 } else { 300 // Something happened => restart timer check. 301 if (cmd_time_out != NEVER) { 302 DEBUG(2, "some IO was done => restart command\n"); 303 cmd_started = False; 304 } 305 } 306 } 307 pthread_cleanup_pop(0); 308 return NULL; 309 } 310 311 static 312 int open_fifo (const char* name, int flags, const char* desc) 313 { 314 int fd; 315 DEBUG(1, "opening %s %s\n", name, desc); 316 fd = open(name, flags); 317 if (fd == -1) 318 XERROR (errno, "error opening %s %s\n", name, desc); 319 320 DEBUG(1, "opened %s %s fd %d\n", name, desc, fd); 321 return fd; 322 } 323 324 /* acquire a lock on the first byte of the given fd. If not successful, 325 exits with error. 326 This allows to avoid having two vgdb speaking with the same Valgrind 327 gdbserver as this causes serious headaches to the protocol. */ 328 static 329 void acquire_lock (int fd, int valgrind_pid) 330 { 331 struct flock fl; 332 fl.l_type = F_WRLCK; 333 fl.l_whence = SEEK_SET; 334 fl.l_start = 0; 335 fl.l_len = 1; 336 if (fcntl(fd, F_SETLK, &fl) < 0) { 337 if (errno == EAGAIN || errno == EACCES) { 338 XERROR(errno, 339 "Cannot acquire lock.\n" 340 "Probably vgdb pid %d already speaks with Valgrind pid %d\n", 341 VS_vgdb_pid, 342 valgrind_pid); 343 } else { 344 XERROR(errno, "cannot acquire lock.\n"); 345 } 346 } 347 348 /* Here, we have the lock. It will be released when fd will be closed. */ 349 /* We indicate our pid to Valgrind gdbserver */ 350 if (shared32 != NULL) 351 shared32->vgdb_pid = getpid(); 352 else if (shared64 != NULL) 353 shared64->vgdb_pid = getpid(); 354 else 355 assert(0); 356 } 357 358 #define PBUFSIZ 16384 /* keep in sync with server.h */ 359 360 /* read some characters from fd. 361 Returns the nr of characters read, -1 if error. 362 desc is a string used in tracing */ 363 static 364 int read_buf (int fd, char* buf, const char* desc) 365 { 366 int nrread; 367 DEBUG(2, "reading %s\n", desc); 368 nrread = read(fd, buf, PBUFSIZ); 369 if (nrread == -1) { 370 ERROR (errno, "error reading %s\n", desc); 371 return -1; 372 } 373 buf[nrread] = '\0'; 374 DEBUG(2, "read %s %s\n", desc, buf); 375 return nrread; 376 } 377 378 /* write size bytes from buf to fd. 379 desc is a description of the action for which the write is done. 380 If notify, then add size to the shared cntr indicating to the 381 valgrind process that there is new data. 382 Returns True if write is ok, False if there was a problem. */ 383 static 384 Bool write_buf(int fd, const char* buf, int size, const char* desc, Bool notify) 385 { 386 int nrwritten; 387 int nrw; 388 DEBUG(2, "writing %s len %d %.*s notify: %d\n", desc, size, 389 size, buf, notify); 390 nrwritten = 0; 391 while (nrwritten < size) { 392 nrw = write (fd, buf+nrwritten, size - nrwritten); 393 if (nrw == -1) { 394 ERROR(errno, "error write %s\n", desc); 395 return False; 396 } 397 nrwritten = nrwritten + nrw; 398 if (notify) 399 add_written(nrw); 400 } 401 return True; 402 } 403 404 typedef enum { 405 FROM_GDB, 406 TO_GDB, 407 FROM_PID, 408 TO_PID } ConnectionKind; 409 static const int NumConnectionKind = TO_PID+1; 410 static 411 const char *ppConnectionKind (ConnectionKind con) 412 { 413 switch (con) { 414 case FROM_GDB: return "FROM_GDB"; 415 case TO_GDB: return "TO_GDB"; 416 case FROM_PID: return "FROM_PID"; 417 case TO_PID: return "TO_PID"; 418 default: return "invalid connection kind"; 419 } 420 } 421 422 static char *shared_mem; 423 424 static int from_gdb = 0; /* stdin by default, changed if --port is given. */ 425 static char *from_gdb_to_pid; /* fifo name to write gdb command to pid */ 426 /* Returns True in case read/write operations were done properly. 427 Returns False in case of error. 428 to_pid is the file descriptor to write to the process pid. */ 429 static 430 Bool read_from_gdb_write_to_pid(int to_pid) 431 { 432 char buf[PBUFSIZ+1]; // +1 for trailing \0 433 int nrread; 434 435 nrread = read_buf(from_gdb, buf, "from gdb on stdin"); 436 if (nrread <= 0) { 437 if (nrread == 0) 438 DEBUG(1, "read 0 bytes from gdb => assume exit\n"); 439 else 440 DEBUG(1, "error reading bytes from gdb\n"); 441 close (from_gdb); 442 shutting_down = True; 443 return False; 444 } 445 return write_buf(to_pid, buf, nrread, "to_pid", /* notify */ True); 446 } 447 448 static int to_gdb = 1; /* stdout by default, changed if --port is given. */ 449 static char *to_gdb_from_pid; /* fifo name to read pid replies */ 450 /* Returns True in case read/write operations were done properly. 451 Returns False in case of error. 452 from_pid is the file descriptor to read data from the process pid. */ 453 static 454 Bool read_from_pid_write_to_gdb(int from_pid) 455 { 456 char buf[PBUFSIZ+1]; // +1 for trailing \0 457 int nrread; 458 459 nrread = read_buf(from_pid, buf, "from pid"); 460 if (nrread <= 0) { 461 if (nrread == 0) 462 DEBUG(1, "read 0 bytes from pid => assume exit\n"); 463 else 464 DEBUG(1, "error reading bytes from pid\n"); 465 close (from_pid); 466 shutting_down = True; 467 return False; 468 } 469 return write_buf(to_gdb, buf, nrread, "to_gdb", /* notify */ False); 470 } 471 472 static 473 void wait_for_gdb_connect (int in_port) 474 { 475 struct sockaddr_in addr; 476 477 int listen_gdb = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 478 int gdb_connect; 479 480 if (-1 == listen_gdb) { 481 XERROR(errno, "cannot create socket"); 482 } 483 484 memset(&addr, 0, sizeof(addr)); 485 486 addr.sin_family = AF_INET; 487 addr.sin_port = htons((unsigned short int)in_port); 488 addr.sin_addr.s_addr = INADDR_ANY; 489 490 if (-1 == bind(listen_gdb,(struct sockaddr *)&addr, sizeof(addr))) { 491 XERROR(errno, "bind failed"); 492 } 493 fprintf(stderr, "listening on port %d ...", in_port); 494 fflush(stderr); 495 if (-1 == listen(listen_gdb, 1)) { 496 XERROR(errno, "error listen failed"); 497 } 498 499 gdb_connect = accept(listen_gdb, NULL, NULL); 500 if (gdb_connect < 0) { 501 XERROR(errno, "accept failed"); 502 } 503 fprintf(stderr, "connected.\n"); 504 fflush(stderr); 505 close(listen_gdb); 506 from_gdb = gdb_connect; 507 to_gdb = gdb_connect; 508 } 509 510 /* prepares the FIFOs filenames, map the shared memory. */ 511 static 512 void prepare_fifos_and_shared_mem(int pid) 513 { 514 const HChar *user, *host; 515 unsigned len; 516 517 user = getenv("LOGNAME"); 518 if (user == NULL) user = getenv("USER"); 519 if (user == NULL) user = "???"; 520 if (strchr(user, '/')) user = "???"; 521 522 host = getenv("HOST"); 523 if (host == NULL) host = getenv("HOSTNAME"); 524 if (host == NULL) host = "???"; 525 if (strchr(host, '/')) host = "???"; 526 527 len = strlen(vgdb_prefix) + strlen(user) + strlen(host) + 40; 528 from_gdb_to_pid = vmalloc (len); 529 to_gdb_from_pid = vmalloc (len); 530 shared_mem = vmalloc (len); 531 /* below 3 lines must match the equivalent in remote-utils.c */ 532 sprintf(from_gdb_to_pid, "%s-from-vgdb-to-%d-by-%s-on-%s", vgdb_prefix, 533 pid, user, host); 534 sprintf(to_gdb_from_pid, "%s-to-vgdb-from-%d-by-%s-on-%s", vgdb_prefix, 535 pid, user, host); 536 sprintf(shared_mem, "%s-shared-mem-vgdb-%d-by-%s-on-%s", vgdb_prefix, 537 pid, user, host); 538 DEBUG (1, "vgdb: using %s %s %s\n", 539 from_gdb_to_pid, to_gdb_from_pid, shared_mem); 540 541 map_vgdbshared(shared_mem); 542 } 543 544 /* Convert hex digit A to a number. */ 545 546 static int 547 fromhex (int a) 548 { 549 if (a >= '0' && a <= '9') 550 return a - '0'; 551 else if (a >= 'a' && a <= 'f') 552 return a - 'a' + 10; 553 else 554 XERROR(0, "Reply contains invalid hex digit %c\n", a); 555 return 0; 556 } 557 558 /* Returns next char from fd. -1 if error, -2 if EOF. 559 NB: must always call it with the same fd */ 560 static int 561 readchar (int fd) 562 { 563 static char buf[PBUFSIZ+1]; // +1 for trailing \0 564 static int bufcnt = 0; 565 static unsigned char *bufp; 566 // unsigned bufp to e.g. avoid having 255 converted to int -1 567 568 if (bufcnt-- > 0) 569 return *bufp++; 570 571 bufcnt = read_buf (fd, buf, "static buf readchar"); 572 573 if (bufcnt <= 0) { 574 if (bufcnt == 0) { 575 fprintf (stderr, "readchar: Got EOF\n"); 576 return -2; 577 } else { 578 ERROR (errno, "readchar\n"); 579 return -1; 580 } 581 } 582 583 bufp = (unsigned char *)buf; 584 bufcnt--; 585 return *bufp++; 586 } 587 588 /* Read a packet from fromfd, with error checking, 589 and store it in BUF. 590 If checksum incorrect, writes a - on ackfd. 591 Returns length of packet, or -1 if error or -2 if EOF. */ 592 static int 593 getpkt (char *buf, int fromfd, int ackfd) 594 { 595 char *bp; 596 unsigned char csum, c1, c2; 597 int c; 598 599 while (1) { 600 csum = 0; 601 602 while (1) { 603 c = readchar (fromfd); 604 if (c == '$') 605 break; 606 DEBUG(2, "[getpkt: discarding char '%c']\n", c); 607 if (c < 0) 608 return c; 609 } 610 611 bp = buf; 612 while (1) { 613 c = readchar (fromfd); 614 if (c < 0) 615 return c; 616 if (c == '#') 617 break; 618 if (c == '*') { 619 int repeat; 620 int r; 621 int prev; 622 prev = *(bp-1); 623 csum += c; 624 repeat = readchar (fromfd); 625 csum += repeat; 626 for (r = 0; r < repeat - 29; r ++) 627 *bp++ = prev; 628 } else { 629 *bp++ = c; 630 csum += c; 631 } 632 } 633 *bp = 0; 634 635 c1 = fromhex (readchar (fromfd)); 636 c2 = fromhex (readchar (fromfd)); 637 638 if (csum == (c1 << 4) + c2) 639 break; 640 641 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", 642 (c1 << 4) + c2, csum, buf); 643 if (write (ackfd, "-", 1) != 1) 644 ERROR(0, "error when writing - (nack)\n"); 645 else 646 add_written(1); 647 } 648 649 DEBUG(2, "getpkt (\"%s\"); [no ack] \n", buf); 650 return bp - buf; 651 } 652 653 static int sigint = 0; 654 static int sigterm = 0; 655 static int sigpipe = 0; 656 static int sighup = 0; 657 static int sigusr1 = 0; 658 static int sigalrm = 0; 659 static int sigusr1_fd = -1; 660 static pthread_t invoke_gdbserver_in_valgrind_thread; 661 662 static 663 void received_signal (int signum) 664 { 665 if (signum == SIGINT) 666 sigint++; 667 else if (signum == SIGUSR1) { 668 sigusr1++; 669 if (sigusr1_fd >= 0) { 670 char control_c = '\003'; 671 write_buf(sigusr1_fd, &control_c, 1, 672 "write \\003 on SIGUSR1", /* notify */ True); 673 } 674 } 675 else if (signum == SIGTERM) { 676 shutting_down = True; 677 sigterm++; 678 } else if (signum == SIGHUP) { 679 shutting_down = True; 680 sighup++; 681 } else if (signum == SIGPIPE) { 682 sigpipe++; 683 } else if (signum == SIGALRM) { 684 sigalrm++; 685 #if defined(__BIONIC__) 686 /* Android has no pthread_cancel. As it also does not have 687 an invoker implementation, there is no need for cleanup action. 688 So, we just do nothing. */ 689 DEBUG(1, "sigalrm received, no action on android\n"); 690 #else 691 /* Note: we cannot directly invoke restore_and_detach : this must 692 be done by the thread that has attached. 693 We have in this thread pushed a cleanup handler that will 694 cleanup what is needed. */ 695 DEBUG(1, "pthread_cancel invoke_gdbserver_in_valgrind_thread\n"); 696 pthread_cancel(invoke_gdbserver_in_valgrind_thread); 697 #endif 698 } else { 699 ERROR(0, "unexpected signal %d\n", signum); 700 } 701 } 702 703 /* install the signal handlers allowing e.g. vgdb to cleanup in 704 case of termination. */ 705 static 706 void install_handlers(void) 707 { 708 struct sigaction action, oldaction; 709 710 action.sa_handler = received_signal; 711 sigemptyset (&action.sa_mask); 712 action.sa_flags = 0; 713 714 /* SIGINT: when user types C-c in gdb, this sends 715 a SIGINT to vgdb + causes a character to be sent to remote gdbserver. 716 The later is enough to wakeup the valgrind process. */ 717 if (sigaction (SIGINT, &action, &oldaction) != 0) 718 XERROR (errno, "vgdb error sigaction SIGINT\n"); 719 /* We might do something more intelligent than just 720 reporting this SIGINT E.g. behave similarly to the gdb: two 721 control-C without feedback from the debugged process would 722 mean to stop debugging it. */ 723 724 /* SIGUSR1: this is used to facilitate automatic testing. When 725 vgdb receives this signal, it will simulate the user typing C-c. */ 726 if (sigaction (SIGUSR1, &action, &oldaction) != 0) 727 XERROR (errno, "vgdb error sigaction SIGUSR1\n"); 728 729 730 /* SIGTERM: can receive this signal (e.g. from gdb) to terminate vgdb 731 when detaching or similar. A clean shutdown will be done as both 732 the read and write side will detect an end of file. */ 733 if (sigaction (SIGTERM, &action, &oldaction) != 0) 734 XERROR (errno, "vgdb error sigaction SIGTERM\n"); 735 736 /* SIGPIPE: can receive this signal when gdb detaches or kill the 737 process debugged: gdb will close its pipes to vgdb. vgdb 738 must resist to this signal to allow a clean shutdown. */ 739 if (sigaction (SIGPIPE, &action, &oldaction) != 0) 740 XERROR (errno, "vgdb error sigaction SIGPIPE\n"); 741 742 /* SIGALRM: in case invoke thread is blocked, alarm is used 743 to cleanup. */ 744 if (sigaction (SIGALRM, &action, &oldaction) != 0) 745 XERROR (errno, "vgdb error sigaction SIGALRM\n"); 746 747 /* unmask all signals, in case the process that launched vgdb 748 masked some. */ 749 if (sigprocmask (SIG_SETMASK, &action.sa_mask, NULL) != 0) 750 XERROR (errno, "vgdb error sigprocmask"); 751 } 752 753 /* close the FIFOs provided connections, terminate the invoker thread. */ 754 static 755 void close_connection(int to_pid, int from_pid) 756 { 757 DEBUG(1, "nr received signals: sigint %d sigterm %d sighup %d sigpipe %d\n", 758 sigint, sigterm, sighup, sigpipe); 759 /* Note that we do not forward sigterm to the valgrind process: 760 a sigterm signal is (probably) received from gdb if the user wants to 761 kill the debugged process. The kill instruction has been given to 762 the valgrind process, which should execute a clean exit. */ 763 764 /* We first close the connection to pid. The pid will then 765 terminates its gdbserver work. We keep the from pid 766 fifo opened till the invoker thread is finished. 767 This allows the gdbserver to finish sending its last reply. */ 768 if (close(to_pid) != 0) 769 ERROR(errno, "close to_pid\n"); 770 771 /* if there is a task that was busy trying to wake up valgrind 772 process, we wait for it to be terminated otherwise threads 773 in the valgrind process can stay stopped if vgdb main 774 exits before the invoke thread had time to detach from 775 all valgrind threads. */ 776 if (max_invoke_ms > 0 || cmd_time_out != NEVER) { 777 int join; 778 779 /* It is surprisingly complex to properly shutdown or exit the 780 valgrind process in which gdbserver has been invoked through 781 ptrace. In the normal case (gdb detaches from the process, 782 or process is continued), the valgrind process will reach the 783 breakpoint place. Using ptrace, vgdb will ensure the 784 previous activity of the process is resumed (e.g. restart a 785 blocking system call). The special case is when gdb asks the 786 valgrind process to exit (using either the "kill" command or 787 "monitor exit"). In such a case, the valgrind process will 788 call exit. But a ptraced process will be blocked in exit, 789 waiting for the ptracing process to detach or die. vgdb 790 cannot detach unconditionally as otherwise, in the normal 791 case, the valgrind process would stop abnormally with SIGSTOP 792 (as vgdb would not be there to catch it). vgdb can also not 793 die unconditionally otherwise again, similar problem. So, we 794 assume that most of the time, we arrive here in the normal 795 case, and so, the breakpoint has been encountered by the 796 valgrind process, so the invoker thread will exit and the 797 join will succeed. For the "kill" case, we cause an alarm 798 signal to be sent after a few seconds. This means that in the 799 normal case, the gdbserver code in valgrind process must have 800 returned the control in less than the alarm nr of seconds, 801 otherwise, valgrind will stop abnormally with SIGSTOP. */ 802 (void) alarm (3); 803 804 DEBUG(1, "joining with invoke_gdbserver_in_valgrind_thread\n"); 805 join = pthread_join(invoke_gdbserver_in_valgrind_thread, NULL); 806 if (join != 0) 807 XERROR 808 (join, 809 "vgdb error pthread_join invoke_gdbserver_in_valgrind_thread\n"); 810 } 811 if (close(from_pid) != 0) 812 ERROR(errno, "close from_pid\n"); 813 } 814 815 /* Relay data between gdb and Valgrind gdbserver, till EOF or an 816 error is encountered. */ 817 static 818 void gdb_relay (int pid) 819 { 820 int from_pid = -1; /* fd to read from pid */ 821 int to_pid = -1; /* fd to write to pid */ 822 823 int shutdown_loop = 0; 824 fprintf (stderr, "relaying data between gdb and process %d\n", pid); 825 fflush (stderr); 826 827 if (max_invoke_ms > 0) 828 pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL, 829 invoke_gdbserver_in_valgrind, (void *) &pid); 830 to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid"); 831 acquire_lock (shared_mem_fd, pid); 832 833 from_pid = open_fifo (to_gdb_from_pid, O_RDONLY|O_NONBLOCK, 834 "read mode from pid"); 835 836 sigusr1_fd = to_pid; /* allow simulating user typing control-c */ 837 838 while (1) { 839 ConnectionKind ck; 840 int ret; 841 struct pollfd pollfds[NumConnectionKind]; 842 843 /* watch data written by gdb, watch POLLERR on both gdb fd */ 844 pollfds[FROM_GDB].fd = from_gdb; 845 pollfds[FROM_GDB].events = POLLIN; 846 pollfds[FROM_GDB].revents = 0; 847 pollfds[TO_GDB].fd = to_gdb; 848 pollfds[TO_GDB].events = 0; 849 pollfds[TO_GDB].revents = 0; 850 851 /* watch data written by pid, watch POLLERR on both pid fd */ 852 pollfds[FROM_PID].fd = from_pid; 853 pollfds[FROM_PID].events = POLLIN; 854 pollfds[FROM_PID].revents = 0; 855 pollfds[TO_PID].fd = to_pid; 856 pollfds[TO_PID].events = 0; 857 pollfds[TO_PID].revents = 0; 858 859 ret = poll(pollfds, 860 NumConnectionKind, 861 (shutting_down ? 862 1 /* one second */ 863 : -1 /* infinite */)); 864 DEBUG(2, "poll ret %d errno %d\n", ret, errno); 865 866 /* check for unexpected error */ 867 if (ret <= 0 && errno != EINTR) { 868 ERROR (errno, "unexpected poll ret %d\n", ret); 869 shutting_down = True; 870 break; 871 } 872 873 /* check for data to read */ 874 for (ck = 0; ck < NumConnectionKind; ck ++) { 875 if (pollfds[ck].revents & POLLIN) { 876 switch (ck) { 877 case FROM_GDB: 878 if (!read_from_gdb_write_to_pid(to_pid)) 879 shutting_down = True; 880 break; 881 case FROM_PID: 882 if (!read_from_pid_write_to_gdb(from_pid)) 883 shutting_down = True; 884 break; 885 default: XERROR(0, "unexpected POLLIN on %s\n", 886 ppConnectionKind(ck)); 887 } 888 } 889 } 890 891 /* check for an fd being in error condition */ 892 for (ck = 0; ck < NumConnectionKind; ck ++) { 893 if (pollfds[ck].revents & POLLERR) { 894 DEBUG(1, "connection %s fd %d POLLERR error condition\n", 895 ppConnectionKind(ck), pollfds[ck].fd); 896 invoker_valgrind_dying(); 897 shutting_down = True; 898 } 899 if (pollfds[ck].revents & POLLHUP) { 900 DEBUG(1, "connection %s fd %d POLLHUP error condition\n", 901 ppConnectionKind(ck), pollfds[ck].fd); 902 invoker_valgrind_dying(); 903 shutting_down = True; 904 } 905 if (pollfds[ck].revents & POLLNVAL) { 906 DEBUG(1, "connection %s fd %d POLLNVAL error condition\n", 907 ppConnectionKind(ck), pollfds[ck].fd); 908 invoker_valgrind_dying(); 909 shutting_down = True; 910 } 911 } 912 913 if (shutting_down) { 914 /* we let some time to the final packets to be transferred */ 915 shutdown_loop++; 916 if (shutdown_loop > 3) 917 break; 918 } 919 } 920 close_connection(to_pid, from_pid); 921 } 922 923 static int packet_len_for_command(char *cmd) 924 { 925 /* cmd will be send as a packet $qRcmd,xxxx....................xx#cc */ 926 return 7+ 2*strlen(cmd) +3 + 1; 927 } 928 929 /* hyper-minimal protocol implementation that 930 sends the provided commands (using qRcmd packets) 931 and read and display their replies. */ 932 static 933 void standalone_send_commands(int pid, 934 int last_command, 935 char *commands[] ) 936 { 937 int from_pid = -1; /* fd to read from pid */ 938 int to_pid = -1; /* fd to write to pid */ 939 940 int i; 941 int hi; 942 char hex[3]; 943 unsigned char cksum; 944 char *hexcommand; 945 char buf[PBUFSIZ+1]; // +1 for trailing \0 946 int buflen; 947 int nc; 948 949 950 if (max_invoke_ms > 0 || cmd_time_out != NEVER) 951 pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL, 952 invoke_gdbserver_in_valgrind, (void *) &pid); 953 954 to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid"); 955 acquire_lock (shared_mem_fd, pid); 956 957 /* first send a C-c \003 to pid, so that it wakes up the process 958 After that, we can open the fifo from the pid in read mode 959 We then start to wait for packets (normally first a resume reply) 960 At that point, we send our command and expect replies */ 961 buf[0] = '\003'; 962 i = 0; 963 while (!write_buf(to_pid, buf, 1, 964 "write \\003 to wake up", /* notify */ True)) { 965 /* If write fails, retries up to 10 times every 0.5 seconds 966 This aims at solving the race condition described in 967 remote-utils.c remote_finish function. */ 968 usleep(500*1000); 969 i++; 970 if (i >= 10) 971 XERROR (errno, "failed to send wake up char after 10 trials\n"); 972 } 973 from_pid = open_fifo(to_gdb_from_pid, O_RDONLY, 974 "read cmd result from pid"); 975 976 /* Enable no ack mode. */ 977 write_buf(to_pid, "$QStartNoAckMode#b0", 19, "write start no ack mode", 978 /* notify */ True); 979 buflen = getpkt(buf, from_pid, to_pid); 980 if (buflen != 2 || strcmp(buf, "OK") != 0) { 981 if (buflen != 2) 982 ERROR (0, "no ack mode: unexpected buflen %d\n", buflen); 983 else 984 ERROR (0, "no ack mode: unexpected packet %s\n", buf); 985 } 986 987 for (nc = 0; nc <= last_command; nc++) { 988 fprintf (stderr, "sending command %s to pid %d\n", commands[nc], pid); 989 fflush (stderr); 990 991 /* prepare hexcommand $qRcmd,xxxx....................xx#cc */ 992 hexcommand = vmalloc (packet_len_for_command(commands[nc])); 993 hexcommand[0] = 0; 994 strcat (hexcommand, "$qRcmd,"); 995 for (i = 0; i < strlen(commands[nc]); i++) { 996 sprintf(hex, "%02x", (unsigned char) commands[nc][i]); 997 // Need to use unsigned char, to avoid sign extension. 998 strcat (hexcommand, hex); 999 } 1000 /* checksum (but without the $) */ 1001 cksum = 0; 1002 for (hi = 1; hi < strlen(hexcommand); hi++) 1003 cksum+=hexcommand[hi]; 1004 strcat(hexcommand, "#"); 1005 sprintf(hex, "%02x", cksum); 1006 strcat(hexcommand, hex); 1007 write_buf(to_pid, hexcommand, strlen(hexcommand), 1008 "writing hex command to pid", /* notify */ True); 1009 1010 /* we exit of the below loop explicitly when the command has 1011 been handled or because a signal handler will set 1012 shutting_down. */ 1013 while (!shutting_down) { 1014 buflen = getpkt(buf, from_pid, to_pid); 1015 if (buflen < 0) { 1016 ERROR (0, "error reading packet\n"); 1017 if (buflen == -2) 1018 invoker_valgrind_dying(); 1019 break; 1020 } 1021 if (strlen(buf) == 0) { 1022 DEBUG(0, "empty packet rcvd (packet qRcmd not recognised?)\n"); 1023 break; 1024 } 1025 if (strcmp(buf, "OK") == 0) { 1026 DEBUG(1, "OK packet rcvd\n"); 1027 break; 1028 } 1029 if (buf[0] == 'E') { 1030 DEBUG(0, 1031 "E NN error packet rcvd: %s (unknown monitor command?)\n", 1032 buf); 1033 break; 1034 } 1035 if (buf[0] == 'W') { 1036 DEBUG(0, "W stopped packet rcvd: %s\n", buf); 1037 break; 1038 } 1039 if (buf[0] == 'T') { 1040 DEBUG(1, "T resume reply packet received: %s\n", buf); 1041 continue; 1042 } 1043 1044 /* must be here an O packet with hex encoded string reply 1045 => decode and print it */ 1046 if (buf[0] != 'O') { 1047 DEBUG(0, "expecting O packet, received: %s\n", buf); 1048 continue; 1049 } 1050 { 1051 char buf_print[buflen/2 + 1]; 1052 for (i = 1; i < buflen; i = i + 2) 1053 buf_print[i/2] = (fromhex(*(buf+i)) << 4) 1054 + fromhex(*(buf+i+1)); 1055 buf_print[buflen/2] = 0; 1056 printf("%s", buf_print); 1057 fflush(stdout); 1058 } 1059 } 1060 free (hexcommand); 1061 } 1062 shutting_down = True; 1063 1064 close_connection(to_pid, from_pid); 1065 } 1066 1067 /* report to user the existence of a vgdb-able valgrind process 1068 with given pid. 1069 Note: this function does not use XERROR if an error is encountered 1070 while producing the command line for pid, as this is not critical 1071 and at least on MacOS, reading cmdline is not available. */ 1072 static 1073 void report_pid (int pid, Bool on_stdout) 1074 { 1075 char cmdline_file[50]; // large enough 1076 int fd, i; 1077 FILE *out = on_stdout ? stdout : stderr; 1078 1079 fprintf(out, "use --pid=%d for ", pid); 1080 1081 sprintf(cmdline_file, "/proc/%d/cmdline", pid); 1082 fd = open (cmdline_file, O_RDONLY); 1083 if (fd == -1) { 1084 DEBUG(1, "error opening cmdline file %s %s\n", 1085 cmdline_file, strerror(errno)); 1086 fprintf(out, "(could not open process command line)\n"); 1087 } else { 1088 char cmdline[100]; 1089 ssize_t sz; 1090 while ((sz = read(fd, cmdline, sizeof cmdline - 1)) != 0) { 1091 for (i = 0; i < sz; i++) 1092 if (cmdline[i] == 0) 1093 cmdline[i] = ' '; 1094 cmdline[sz] = 0; 1095 fprintf(out, "%s", cmdline); 1096 } 1097 if (sz == -1) { 1098 DEBUG(1, "error reading cmdline file %s %s\n", 1099 cmdline_file, strerror(errno)); 1100 fprintf(out, "(error reading process command line)"); 1101 } 1102 fprintf(out, "\n"); 1103 close (fd); 1104 } 1105 fflush(out); 1106 } 1107 1108 static 1109 void usage(void) 1110 { 1111 fprintf(stderr, 1112 "Usage: vgdb [OPTION]... [[-c] COMMAND]...\n" 1113 "vgdb (valgrind gdb) has two usages\n" 1114 " 1. standalone to send monitor commands to a Valgrind gdbserver.\n" 1115 " The OPTION(s) must be followed by the command to send\n" 1116 " To send more than one command, separate the commands with -c\n" 1117 " 2. relay application between gdb and a Valgrind gdbserver.\n" 1118 " Only OPTION(s) can be given.\n" 1119 "\n" 1120 " OPTIONS are [--pid=<number>] [--vgdb-prefix=<prefix>]\n" 1121 " [--wait=<number>] [--max-invoke-ms=<number>]\n" 1122 " [--port=<portnr>\n" 1123 " [--cmd-time-out=<number>] [-l] [-D] [-d]\n" 1124 " \n" 1125 " --pid arg must be given if multiple Valgrind gdbservers are found.\n" 1126 " --vgdb-prefix arg must be given to both Valgrind and vgdb utility\n" 1127 " if you want to change the prefix (default %s) for the FIFOs communication\n" 1128 " between the Valgrind gdbserver and vgdb.\n" 1129 " --wait (default 0) tells vgdb to check during the specified number\n" 1130 " of seconds if a Valgrind gdbserver can be found.\n" 1131 " --max-invoke-ms (default 100) gives the nr of milli-seconds after which vgdb\n" 1132 " will force the invocation of the Valgrind gdbserver (if the Valgrind\n" 1133 " process is blocked in a system call).\n" 1134 " --port instructs vgdb to listen for gdb on the specified port nr.\n" 1135 " --cmd-time-out (default 99999999) tells vgdb to exit if the found Valgrind\n" 1136 " gdbserver has not processed a command after number seconds\n" 1137 " -l arg tells to show the list of running Valgrind gdbserver and then exit.\n" 1138 " -D arg tells to show shared mem status and then exit.\n" 1139 " -d arg tells to show debug info. Multiple -d args for more debug info\n" 1140 "\n" 1141 " -h --help shows this message\n" 1142 " To get help from the Valgrind gdbserver, use vgdb help\n" 1143 "\n", vgdb_prefix_default() 1144 ); 1145 invoker_restrictions_msg(); 1146 } 1147 1148 /* If show_list, outputs on stdout the list of Valgrind processes with gdbserver activated. 1149 and then exits. 1150 1151 else if arg_pid == -1, waits maximum check_trials seconds to discover 1152 a valgrind pid appearing. 1153 1154 Otherwise verify arg_pid is valid and corresponds to a Valgrind process 1155 with gdbserver activated. 1156 1157 Returns the pid to work with 1158 or exits in case of error (e.g. no pid found corresponding to arg_pid */ 1159 1160 static 1161 int search_arg_pid(int arg_pid, int check_trials, Bool show_list) 1162 { 1163 int i; 1164 int pid = -1; 1165 1166 if (arg_pid == 0 || arg_pid < -1) { 1167 fprintf (stderr, "vgdb error: invalid pid %d given\n", arg_pid); 1168 exit (1); 1169 } else { 1170 /* search for a matching named fifo. 1171 If we have been given a pid, we will check that the matching FIFO is 1172 there (or wait the nr of check_trials for this to appear). 1173 If no pid has been given, then if we find only one FIFO, 1174 we will use this to build the pid to use. 1175 If we find multiple processes with valid FIFO, we report them and will 1176 exit with an error. */ 1177 DIR *vgdb_dir; 1178 char *vgdb_dir_name = vmalloc (strlen (vgdb_prefix) + 3); 1179 struct dirent *f; 1180 int is; 1181 int nr_valid_pid = 0; 1182 const char *suffix = "-from-vgdb-to-"; /* followed by pid */ 1183 char *vgdb_format = vmalloc (strlen(vgdb_prefix) + strlen(suffix) + 1); 1184 1185 strcpy (vgdb_format, vgdb_prefix); 1186 strcat (vgdb_format, suffix); 1187 1188 if (strchr(vgdb_prefix, '/') != NULL) { 1189 strcpy (vgdb_dir_name, vgdb_prefix); 1190 for (is = strlen(vgdb_prefix) - 1; is >= 0; is--) 1191 if (vgdb_dir_name[is] == '/') { 1192 vgdb_dir_name[is+1] = '\0'; 1193 break; 1194 } 1195 } else { 1196 strcpy (vgdb_dir_name, ""); 1197 } 1198 1199 DEBUG(1, "searching pid in directory %s format %s\n", 1200 vgdb_dir_name, vgdb_format); 1201 1202 /* try to find FIFOs with valid pid. 1203 On exit of the loop, pid is set to: 1204 the last pid found if show_list (or -1 if no process was listed) 1205 -1 if no FIFOs matching a running process is found 1206 -2 if multiple FIFOs of running processes are found 1207 otherwise it is set to the (only) pid found that can be debugged 1208 */ 1209 for (i = 0; i < check_trials; i++) { 1210 DEBUG(1, "check_trial %d \n", i); 1211 if (i > 0) 1212 /* wait one second before checking again */ 1213 sleep(1); 1214 1215 vgdb_dir = opendir (strlen (vgdb_dir_name) ? vgdb_dir_name : "./"); 1216 if (vgdb_dir == NULL) 1217 XERROR (errno, 1218 "vgdb error: opening directory %s searching vgdb fifo\n", 1219 vgdb_dir_name); 1220 1221 errno = 0; /* avoid complain if vgdb_dir is empty */ 1222 while ((f = readdir (vgdb_dir))) { 1223 struct stat st; 1224 char pathname[strlen(vgdb_dir_name) + strlen(f->d_name) + 1]; 1225 char *wrongpid; 1226 int newpid; 1227 1228 strcpy (pathname, vgdb_dir_name); 1229 strcat (pathname, f->d_name); 1230 DEBUG(3, "checking pathname is FIFO %s\n", pathname); 1231 if (stat (pathname, &st) != 0) { 1232 if (debuglevel >= 3) 1233 ERROR (errno, "vgdb error: stat %s searching vgdb fifo\n", 1234 pathname); 1235 } else if (S_ISFIFO (st.st_mode)) { 1236 DEBUG(3, "trying FIFO %s\n", pathname); 1237 if (strncmp (pathname, vgdb_format, 1238 strlen (vgdb_format)) == 0) { 1239 newpid = strtol(pathname + strlen (vgdb_format), 1240 &wrongpid, 10); 1241 if (*wrongpid == '-' && newpid > 0 1242 && kill (newpid, 0) == 0) { 1243 nr_valid_pid++; 1244 if (show_list) { 1245 report_pid (newpid, /*on_stdout*/ True); 1246 pid = newpid; 1247 } else if (arg_pid != -1) { 1248 if (arg_pid == newpid) { 1249 pid = newpid; 1250 } 1251 } else if (nr_valid_pid > 1) { 1252 if (nr_valid_pid == 2) { 1253 fprintf 1254 (stderr, 1255 "no --pid= arg given" 1256 " and multiple valgrind pids found:\n"); 1257 report_pid (pid, /*on_stdout*/ False); 1258 } 1259 pid = -2; 1260 report_pid (newpid, /*on_stdout*/ False); 1261 } else { 1262 pid = newpid; 1263 } 1264 } 1265 } 1266 } 1267 errno = 0; /* avoid complain if at the end of vgdb_dir */ 1268 } 1269 if (f == NULL && errno != 0) 1270 XERROR (errno, "vgdb error: reading directory %s for vgdb fifo\n", 1271 vgdb_dir_name); 1272 1273 closedir (vgdb_dir); 1274 if (pid != -1) 1275 break; 1276 } 1277 1278 free (vgdb_dir_name); 1279 free (vgdb_format); 1280 } 1281 1282 if (show_list) { 1283 exit (1); 1284 } else if (pid == -1) { 1285 if (arg_pid == -1) 1286 fprintf (stderr, "vgdb error: no FIFO found and no pid given\n"); 1287 else 1288 fprintf (stderr, "vgdb error: no FIFO found matching pid %d\n", 1289 arg_pid); 1290 exit (1); 1291 } 1292 else if (pid == -2) { 1293 /* no arg_pid given, multiple FIFOs found */ 1294 exit (1); 1295 } 1296 else { 1297 return pid; 1298 } 1299 } 1300 1301 /* return true if the numeric value of an option of the 1302 form --xxxxxxxxx=<number> could properly be extracted 1303 from arg. If True is returned, *value contains the 1304 extracted value.*/ 1305 static 1306 Bool numeric_val(char* arg, int *value) 1307 { 1308 const char *eq_pos = strchr(arg, '='); 1309 char *wrong; 1310 long long int long_value; 1311 1312 if (eq_pos == NULL) 1313 return False; 1314 1315 long_value = strtoll(eq_pos+1, &wrong, 10); 1316 if (long_value < 0 || long_value > INT_MAX) 1317 return False; 1318 if (*wrong) 1319 return False; 1320 1321 *value = (int) long_value; 1322 return True; 1323 } 1324 1325 /* true if arg matches the provided option */ 1326 static 1327 Bool is_opt(char* arg, const char *option) 1328 { 1329 int option_len = strlen(option); 1330 if (option[option_len-1] == '=') 1331 return (0 == strncmp(option, arg, option_len)); 1332 else 1333 return (0 == strcmp(option, arg)); 1334 } 1335 1336 /* Parse command lines options. If error(s), exits. 1337 Otherwise returns the options in *p_... args. 1338 commands must be big enough for the commands extracted from argv. 1339 On return, *p_last_command gives the position in commands where 1340 the last command has been allocated (using vmalloc). */ 1341 static 1342 void parse_options(int argc, char** argv, 1343 Bool *p_show_shared_mem, 1344 Bool *p_show_list, 1345 int *p_arg_pid, 1346 int *p_check_trials, 1347 int *p_port, 1348 int *p_last_command, 1349 char *commands[]) 1350 { 1351 Bool show_shared_mem = False; 1352 Bool show_list = False; 1353 int arg_pid = -1; 1354 int check_trials = 1; 1355 int last_command = -1; 1356 int int_port = 0; 1357 1358 int i; 1359 int arg_errors = 0; 1360 1361 for (i = 1; i < argc; i++) { 1362 if (is_opt(argv[i], "--help") || is_opt(argv[i], "-h")) { 1363 usage(); 1364 exit(0); 1365 } else if (is_opt(argv[i], "-d")) { 1366 debuglevel++; 1367 } else if (is_opt(argv[i], "-D")) { 1368 show_shared_mem = True; 1369 } else if (is_opt(argv[i], "-l")) { 1370 show_list = True; 1371 } else if (is_opt(argv[i], "--pid=")) { 1372 int newpid; 1373 if (!numeric_val(argv[i], &newpid)) { 1374 fprintf (stderr, "invalid --pid argument %s\n", argv[i]); 1375 arg_errors++; 1376 } else if (arg_pid != -1) { 1377 fprintf (stderr, "multiple --pid arguments given\n"); 1378 arg_errors++; 1379 } else { 1380 arg_pid = newpid; 1381 } 1382 } else if (is_opt(argv[i], "--wait=")) { 1383 if (!numeric_val(argv[i], &check_trials)) { 1384 fprintf (stderr, "invalid --wait argument %s\n", argv[i]); 1385 arg_errors++; 1386 } 1387 } else if (is_opt(argv[i], "--max-invoke-ms=")) { 1388 if (!numeric_val(argv[i], &max_invoke_ms)) { 1389 fprintf (stderr, "invalid --max-invoke-ms argument %s\n", argv[i]); 1390 arg_errors++; 1391 } 1392 } else if (is_opt(argv[i], "--cmd-time-out=")) { 1393 if (!numeric_val(argv[i], &cmd_time_out)) { 1394 fprintf (stderr, "invalid --cmd-time-out argument %s\n", argv[i]); 1395 arg_errors++; 1396 } 1397 } else if (is_opt(argv[i], "--port=")) { 1398 if (!numeric_val(argv[i], &int_port)) { 1399 fprintf (stderr, "invalid --port argument %s\n", argv[i]); 1400 arg_errors++; 1401 } 1402 } else if (is_opt(argv[i], "--vgdb-prefix=")) { 1403 vgdb_prefix = argv[i] + 14; 1404 } else if (is_opt(argv[i], "-c")) { 1405 last_command++; 1406 commands[last_command] = vmalloc (1); 1407 commands[last_command][0] = '\0'; 1408 } else if (0 == strncmp(argv[i], "-", 1)) { 1409 fprintf (stderr, "unknown or invalid argument %s\n", argv[i]); 1410 arg_errors++; 1411 } else { 1412 int len; 1413 if (last_command == -1) { 1414 /* only one command, no -c command indicator */ 1415 last_command++; 1416 commands[last_command] = vmalloc (1); 1417 commands[last_command][0] = '\0'; 1418 } 1419 len = strlen(commands[last_command]); 1420 commands[last_command] = vrealloc (commands[last_command], 1421 len + 1 + strlen(argv[i]) + 1); 1422 if (len > 0) 1423 strcat (commands[last_command], " "); 1424 strcat (commands[last_command], argv[i]); 1425 if (packet_len_for_command(commands[last_command]) > PBUFSIZ) { 1426 fprintf (stderr, "command %s too long\n", commands[last_command]); 1427 arg_errors++; 1428 } 1429 1430 } 1431 } 1432 1433 if (vgdb_prefix == NULL) 1434 vgdb_prefix = vgdb_prefix_default(); 1435 1436 if (isatty(0) 1437 && !show_shared_mem 1438 && !show_list 1439 && int_port == 0 1440 && last_command == -1) { 1441 arg_errors++; 1442 fprintf (stderr, 1443 "Using vgdb standalone implies to give -D or -l or a COMMAND\n"); 1444 } 1445 1446 if (show_shared_mem && show_list) { 1447 arg_errors++; 1448 fprintf (stderr, 1449 "Can't use both -D and -l options\n"); 1450 } 1451 1452 if (max_invoke_ms > 0 1453 && cmd_time_out != NEVER 1454 && (cmd_time_out * 1000) <= max_invoke_ms) { 1455 arg_errors++; 1456 fprintf (stderr, 1457 "--max-invoke-ms must be < --cmd-time-out * 1000\n"); 1458 } 1459 1460 if (show_list && arg_pid != -1) { 1461 arg_errors++; 1462 fprintf (stderr, 1463 "Can't use both --pid and -l options\n"); 1464 } 1465 1466 if (int_port > 0 && last_command != -1) { 1467 arg_errors++; 1468 fprintf (stderr, 1469 "Can't use --port to send commands\n"); 1470 } 1471 1472 if (arg_errors > 0) { 1473 fprintf (stderr, "args error. Try `vgdb --help` for more information\n"); 1474 exit(1); 1475 } 1476 1477 *p_show_shared_mem = show_shared_mem; 1478 *p_show_list = show_list; 1479 *p_arg_pid = arg_pid; 1480 *p_check_trials = check_trials; 1481 *p_port = int_port; 1482 *p_last_command = last_command; 1483 } 1484 1485 int main(int argc, char** argv) 1486 { 1487 int i; 1488 int pid; 1489 1490 Bool show_shared_mem; 1491 Bool show_list; 1492 int arg_pid; 1493 int check_trials; 1494 int in_port; 1495 int last_command; 1496 char *commands[argc]; // we will never have more commands than args. 1497 1498 parse_options(argc, argv, 1499 &show_shared_mem, 1500 &show_list, 1501 &arg_pid, 1502 &check_trials, 1503 &in_port, 1504 &last_command, 1505 commands); 1506 1507 /* when we are working as a relay for gdb, handle some signals by 1508 only reporting them (according to debug level). Also handle these 1509 when ptrace will be used: vgdb must clean up the ptrace effect before 1510 dying. */ 1511 if (max_invoke_ms > 0 || last_command == -1) 1512 install_handlers(); 1513 1514 pid = search_arg_pid (arg_pid, check_trials, show_list); 1515 1516 prepare_fifos_and_shared_mem(pid); 1517 1518 if (in_port > 0) 1519 wait_for_gdb_connect(in_port); 1520 1521 if (show_shared_mem) { 1522 fprintf(stderr, 1523 "vgdb %d " 1524 "written_by_vgdb %d " 1525 "seen_by_valgrind %d\n" 1526 "vgdb pid %d\n", 1527 VS_vgdb_pid, 1528 VS_written_by_vgdb, 1529 VS_seen_by_valgrind, 1530 VS_vgdb_pid); 1531 exit (0); 1532 } 1533 1534 if (last_command >= 0) { 1535 standalone_send_commands(pid, last_command, commands); 1536 } else { 1537 gdb_relay(pid); 1538 } 1539 1540 1541 free (from_gdb_to_pid); 1542 free (to_gdb_from_pid); 1543 free (shared_mem); 1544 1545 for (i = 0; i <= last_command; i++) 1546 free (commands[i]); 1547 return 0; 1548 } 1549