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-2013 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 succesful, 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, 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 521 host = getenv("HOST"); 522 if (host == NULL) host = getenv("HOSTNAME"); 523 if (host == NULL) host = "???"; 524 525 len = strlen(vgdb_prefix) + strlen(user) + strlen(host) + 40; 526 from_gdb_to_pid = vmalloc (len); 527 to_gdb_from_pid = vmalloc (len); 528 shared_mem = vmalloc (len); 529 /* below 3 lines must match the equivalent in remote-utils.c */ 530 sprintf(from_gdb_to_pid, "%s-from-vgdb-to-%d-by-%s-on-%s", vgdb_prefix, 531 pid, user, host); 532 sprintf(to_gdb_from_pid, "%s-to-vgdb-from-%d-by-%s-on-%s", vgdb_prefix, 533 pid, user, host); 534 sprintf(shared_mem, "%s-shared-mem-vgdb-%d-by-%s-on-%s", vgdb_prefix, 535 pid, user, host); 536 DEBUG (1, "vgdb: using %s %s %s\n", 537 from_gdb_to_pid, to_gdb_from_pid, shared_mem); 538 539 map_vgdbshared(shared_mem); 540 } 541 542 /* Convert hex digit A to a number. */ 543 544 static int 545 fromhex (int a) 546 { 547 if (a >= '0' && a <= '9') 548 return a - '0'; 549 else if (a >= 'a' && a <= 'f') 550 return a - 'a' + 10; 551 else 552 XERROR(0, "Reply contains invalid hex digit %c\n", a); 553 return 0; 554 } 555 556 /* Returns next char from fd. -1 if error, -2 if EOF. 557 NB: must always call it with the same fd */ 558 static int 559 readchar (int fd) 560 { 561 static char buf[PBUFSIZ+1]; // +1 for trailing \0 562 static int bufcnt = 0; 563 static unsigned char *bufp; 564 // unsigned bufp to e.g. avoid having 255 converted to int -1 565 566 if (bufcnt-- > 0) 567 return *bufp++; 568 569 bufcnt = read_buf (fd, buf, "static buf readchar"); 570 571 if (bufcnt <= 0) { 572 if (bufcnt == 0) { 573 fprintf (stderr, "readchar: Got EOF\n"); 574 return -2; 575 } else { 576 ERROR (errno, "readchar\n"); 577 return -1; 578 } 579 } 580 581 bufp = (unsigned char *)buf; 582 bufcnt--; 583 return *bufp++; 584 } 585 586 /* Read a packet from fromfd, with error checking, 587 and store it in BUF. 588 Returns length of packet, or -1 if error or -2 if EOF. 589 Writes ack on ackfd */ 590 591 static int 592 getpkt (char *buf, int fromfd, int ackfd) 593 { 594 char *bp; 595 unsigned char csum, c1, c2; 596 int c; 597 598 while (1) { 599 csum = 0; 600 601 while (1) { 602 c = readchar (fromfd); 603 if (c == '$') 604 break; 605 DEBUG(2, "[getpkt: discarding char '%c']\n", c); 606 if (c < 0) 607 return c; 608 } 609 610 bp = buf; 611 while (1) { 612 c = readchar (fromfd); 613 if (c < 0) 614 return c; 615 if (c == '#') 616 break; 617 if (c == '*') { 618 int repeat; 619 int r; 620 int prev; 621 prev = *(bp-1); 622 csum += c; 623 repeat = readchar (fromfd); 624 csum += repeat; 625 for (r = 0; r < repeat - 29; r ++) 626 *bp++ = prev; 627 } else { 628 *bp++ = c; 629 csum += c; 630 } 631 } 632 *bp = 0; 633 634 c1 = fromhex (readchar (fromfd)); 635 c2 = fromhex (readchar (fromfd)); 636 637 if (csum == (c1 << 4) + c2) 638 break; 639 640 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", 641 (c1 << 4) + c2, csum, buf); 642 if (write (ackfd, "-", 1) != 1) 643 ERROR(0, "error when writing - (nack)\n"); 644 else 645 add_written(1); 646 } 647 648 DEBUG(2, "getpkt (\"%s\"); [sending ack] \n", buf); 649 if (write (ackfd, "+", 1) != 1) 650 ERROR(0, "error when writing + (ack)\n"); 651 else 652 add_written(1); 653 return bp - buf; 654 } 655 656 static int sigint = 0; 657 static int sigterm = 0; 658 static int sigpipe = 0; 659 static int sighup = 0; 660 static int sigusr1 = 0; 661 static int sigalrm = 0; 662 static int sigusr1_fd = -1; 663 static pthread_t invoke_gdbserver_in_valgrind_thread; 664 665 static 666 void received_signal (int signum) 667 { 668 if (signum == SIGINT) 669 sigint++; 670 else if (signum == SIGUSR1) { 671 sigusr1++; 672 if (sigusr1_fd >= 0) { 673 char control_c = '\003'; 674 write_buf(sigusr1_fd, &control_c, 1, 675 "write \\003 on SIGUSR1", /* notify */ True); 676 } 677 } 678 else if (signum == SIGTERM) { 679 shutting_down = True; 680 sigterm++; 681 } else if (signum == SIGHUP) { 682 shutting_down = True; 683 sighup++; 684 } else if (signum == SIGPIPE) { 685 sigpipe++; 686 } else if (signum == SIGALRM) { 687 sigalrm++; 688 #if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \ 689 || defined(VGPV_mips32_linux_android) 690 /* Android has no pthread_cancel. As it also does not have 691 an invoker implementation, there is no need for cleanup action. 692 So, we just do nothing. */ 693 DEBUG(1, "sigalrm received, no action on android\n"); 694 #else 695 /* Note: we cannot directly invoke restore_and_detach : this must 696 be done by the thread that has attached. 697 We have in this thread pushed a cleanup handler that will 698 cleanup what is needed. */ 699 DEBUG(1, "pthread_cancel invoke_gdbserver_in_valgrind_thread\n"); 700 pthread_cancel(invoke_gdbserver_in_valgrind_thread); 701 #endif 702 } else { 703 ERROR(0, "unexpected signal %d\n", signum); 704 } 705 } 706 707 /* install the signal handlers allowing e.g. vgdb to cleanup in 708 case of termination. */ 709 static 710 void install_handlers(void) 711 { 712 struct sigaction action, oldaction; 713 714 action.sa_handler = received_signal; 715 sigemptyset (&action.sa_mask); 716 action.sa_flags = 0; 717 718 /* SIGINT: when user types C-c in gdb, this sends 719 a SIGINT to vgdb + causes a character to be sent to remote gdbserver. 720 The later is enough to wakeup the valgrind process. */ 721 if (sigaction (SIGINT, &action, &oldaction) != 0) 722 XERROR (errno, "vgdb error sigaction SIGINT\n"); 723 /* We might do something more intelligent than just 724 reporting this SIGINT E.g. behave similarly to the gdb: two 725 control-C without feedback from the debugged process would 726 mean to stop debugging it. */ 727 728 /* SIGUSR1: this is used to facilitate automatic testing. When 729 vgdb receives this signal, it will simulate the user typing C-c. */ 730 if (sigaction (SIGUSR1, &action, &oldaction) != 0) 731 XERROR (errno, "vgdb error sigaction SIGUSR1\n"); 732 733 734 /* SIGTERM: can receive this signal (e.g. from gdb) to terminate vgdb 735 when detaching or similar. A clean shutdown will be done as both 736 the read and write side will detect an end of file. */ 737 if (sigaction (SIGTERM, &action, &oldaction) != 0) 738 XERROR (errno, "vgdb error sigaction SIGTERM\n"); 739 740 /* SIGPIPE: can receive this signal when gdb detaches or kill the 741 process debugged: gdb will close its pipes to vgdb. vgdb 742 must resist to this signal to allow a clean shutdown. */ 743 if (sigaction (SIGPIPE, &action, &oldaction) != 0) 744 XERROR (errno, "vgdb error sigaction SIGPIPE\n"); 745 746 /* SIGALRM: in case invoke thread is blocked, alarm is used 747 to cleanup. */ 748 if (sigaction (SIGALRM, &action, &oldaction) != 0) 749 XERROR (errno, "vgdb error sigaction SIGALRM\n"); 750 } 751 752 /* close the FIFOs provided connections, terminate the invoker thread. */ 753 static 754 void close_connection(int to_pid, int from_pid) 755 { 756 DEBUG(1, "nr received signals: sigint %d sigterm %d sighup %d sigpipe %d\n", 757 sigint, sigterm, sighup, sigpipe); 758 /* Note that we do not forward sigterm to the valgrind process: 759 a sigterm signal is (probably) received from gdb if the user wants to 760 kill the debugged process. The kill instruction has been given to 761 the valgrind process, which should execute a clean exit. */ 762 763 /* We first close the connection to pid. The pid will then 764 terminates its gdbserver work. We keep the from pid 765 fifo opened till the invoker thread is finished. 766 This allows the gdbserver to finish sending its last reply. */ 767 if (close(to_pid) != 0) 768 ERROR(errno, "close to_pid\n"); 769 770 /* if there is a task that was busy trying to wake up valgrind 771 process, we wait for it to be terminated otherwise threads 772 in the valgrind process can stay stopped if vgdb main 773 exits before the invoke thread had time to detach from 774 all valgrind threads. */ 775 if (max_invoke_ms > 0 || cmd_time_out != NEVER) { 776 int join; 777 778 /* It is surprisingly complex to properly shutdown or exit the 779 valgrind process in which gdbserver has been invoked through 780 ptrace. In the normal case (gdb detaches from the process, 781 or process is continued), the valgrind process will reach the 782 breakpoint place. Using ptrace, vgdb will ensure the 783 previous activity of the process is resumed (e.g. restart a 784 blocking system call). The special case is when gdb asks the 785 valgrind process to exit (using either the "kill" command or 786 "monitor exit"). In such a case, the valgrind process will 787 call exit. But a ptraced process will be blocked in exit, 788 waiting for the ptracing process to detach or die. vgdb 789 cannot detach unconditionally as otherwise, in the normal 790 case, the valgrind process would stop abnormally with SIGSTOP 791 (as vgdb would not be there to catch it). vgdb can also not 792 die unconditionally otherwise again, similar problem. So, we 793 assume that most of the time, we arrive here in the normal 794 case, and so, the breakpoint has been encountered by the 795 valgrind process, so the invoker thread will exit and the 796 join will succeed. For the "kill" case, we cause an alarm 797 signal to be sent after a few seconds. This means that in the 798 normal case, the gdbserver code in valgrind process must have 799 returned the control in less than the alarm nr of seconds, 800 otherwise, valgrind will stop abnormally with SIGSTOP. */ 801 (void) alarm (3); 802 803 DEBUG(1, "joining with invoke_gdbserver_in_valgrind_thread\n"); 804 join = pthread_join(invoke_gdbserver_in_valgrind_thread, NULL); 805 if (join != 0) 806 XERROR 807 (join, 808 "vgdb error pthread_join invoke_gdbserver_in_valgrind_thread\n"); 809 } 810 if (close(from_pid) != 0) 811 ERROR(errno, "close from_pid\n"); 812 } 813 814 /* Relay data between gdb and Valgrind gdbserver, till EOF or an 815 error is encountered. */ 816 static 817 void gdb_relay (int pid) 818 { 819 int from_pid = -1; /* fd to read from pid */ 820 int to_pid = -1; /* fd to write to pid */ 821 822 int shutdown_loop = 0; 823 fprintf (stderr, "relaying data between gdb and process %d\n", pid); 824 fflush (stderr); 825 826 if (max_invoke_ms > 0) 827 pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL, 828 invoke_gdbserver_in_valgrind, (void *) &pid); 829 to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid"); 830 acquire_lock (shared_mem_fd, pid); 831 832 from_pid = open_fifo (to_gdb_from_pid, O_RDONLY|O_NONBLOCK, 833 "read mode from pid"); 834 835 sigusr1_fd = to_pid; /* allow simulating user typing control-c */ 836 837 while (1) { 838 ConnectionKind ck; 839 int ret; 840 struct pollfd pollfds[NumConnectionKind]; 841 842 /* watch data written by gdb, watch POLLERR on both gdb fd */ 843 pollfds[FROM_GDB].fd = from_gdb; 844 pollfds[FROM_GDB].events = POLLIN; 845 pollfds[FROM_GDB].revents = 0; 846 pollfds[TO_GDB].fd = to_gdb; 847 pollfds[TO_GDB].events = 0; 848 pollfds[TO_GDB].revents = 0; 849 850 /* watch data written by pid, watch POLLERR on both pid fd */ 851 pollfds[FROM_PID].fd = from_pid; 852 pollfds[FROM_PID].events = POLLIN; 853 pollfds[FROM_PID].revents = 0; 854 pollfds[TO_PID].fd = to_pid; 855 pollfds[TO_PID].events = 0; 856 pollfds[TO_PID].revents = 0; 857 858 ret = poll(pollfds, 859 NumConnectionKind, 860 (shutting_down ? 861 1 /* one second */ 862 : -1 /* infinite */)); 863 DEBUG(2, "poll ret %d errno %d\n", ret, errno); 864 865 /* check for unexpected error */ 866 if (ret <= 0 && errno != EINTR) { 867 ERROR (errno, "unexpected poll ret %d\n", ret); 868 shutting_down = True; 869 break; 870 } 871 872 /* check for data to read */ 873 for (ck = 0; ck < NumConnectionKind; ck ++) { 874 if (pollfds[ck].revents & POLLIN) { 875 switch (ck) { 876 case FROM_GDB: 877 if (!read_from_gdb_write_to_pid(to_pid)) 878 shutting_down = True; 879 break; 880 case FROM_PID: 881 if (!read_from_pid_write_to_gdb(from_pid)) 882 shutting_down = True; 883 break; 884 default: XERROR(0, "unexpected POLLIN on %s\n", 885 ppConnectionKind(ck)); 886 } 887 } 888 } 889 890 /* check for an fd being in error condition */ 891 for (ck = 0; ck < NumConnectionKind; ck ++) { 892 if (pollfds[ck].revents & POLLERR) { 893 DEBUG(1, "connection %s fd %d POLLERR error condition\n", 894 ppConnectionKind(ck), pollfds[ck].fd); 895 invoker_valgrind_dying(); 896 shutting_down = True; 897 } 898 if (pollfds[ck].revents & POLLHUP) { 899 DEBUG(1, "connection %s fd %d POLLHUP error condition\n", 900 ppConnectionKind(ck), pollfds[ck].fd); 901 invoker_valgrind_dying(); 902 shutting_down = True; 903 } 904 if (pollfds[ck].revents & POLLNVAL) { 905 DEBUG(1, "connection %s fd %d POLLNVAL error condition\n", 906 ppConnectionKind(ck), pollfds[ck].fd); 907 invoker_valgrind_dying(); 908 shutting_down = True; 909 } 910 } 911 912 if (shutting_down) { 913 /* we let some time to the final packets to be transferred */ 914 shutdown_loop++; 915 if (shutdown_loop > 3) 916 break; 917 } 918 } 919 close_connection(to_pid, from_pid); 920 } 921 922 static int packet_len_for_command(char *cmd) 923 { 924 /* cmd will be send as a packet $qRcmd,xxxx....................xx#cc */ 925 return 7+ 2*strlen(cmd) +3 + 1; 926 } 927 928 /* hyper-minimal protocol implementation that 929 sends the provided commands (using qRcmd packets) 930 and read and display their replies. */ 931 static 932 void standalone_send_commands(int pid, 933 int last_command, 934 char *commands[] ) 935 { 936 int from_pid = -1; /* fd to read from pid */ 937 int to_pid = -1; /* fd to write to pid */ 938 939 int i; 940 int hi; 941 char hex[3]; 942 unsigned char cksum; 943 char *hexcommand; 944 char buf[PBUFSIZ+1]; // +1 for trailing \0 945 int buflen; 946 int nc; 947 948 949 if (max_invoke_ms > 0 || cmd_time_out != NEVER) 950 pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL, 951 invoke_gdbserver_in_valgrind, (void *) &pid); 952 953 to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid"); 954 acquire_lock (shared_mem_fd, pid); 955 956 /* first send a C-c \003 to pid, so that it wakes up the process 957 After that, we can open the fifo from the pid in read mode 958 We then start to wait for packets (normally first a resume reply) 959 At that point, we send our command and expect replies */ 960 buf[0] = '\003'; 961 write_buf(to_pid, buf, 1, "write \\003 to wake up", /* notify */ True); 962 from_pid = open_fifo(to_gdb_from_pid, O_RDONLY, 963 "read cmd result from pid"); 964 965 for (nc = 0; nc <= last_command; nc++) { 966 fprintf (stderr, "sending command %s to pid %d\n", commands[nc], pid); 967 fflush (stderr); 968 969 /* prepare hexcommand $qRcmd,xxxx....................xx#cc */ 970 hexcommand = vmalloc (packet_len_for_command(commands[nc])); 971 hexcommand[0] = 0; 972 strcat (hexcommand, "$qRcmd,"); 973 for (i = 0; i < strlen(commands[nc]); i++) { 974 sprintf(hex, "%02x", (unsigned char) commands[nc][i]); 975 // Need to use unsigned char, to avoid sign extension. 976 strcat (hexcommand, hex); 977 } 978 /* checksum (but without the $) */ 979 cksum = 0; 980 for (hi = 1; hi < strlen(hexcommand); hi++) 981 cksum+=hexcommand[hi]; 982 strcat(hexcommand, "#"); 983 sprintf(hex, "%02x", cksum); 984 strcat(hexcommand, hex); 985 write_buf(to_pid, hexcommand, strlen(hexcommand), 986 "writing hex command to pid", /* notify */ True); 987 988 /* we exit of the below loop explicitely when the command has 989 been handled or because a signal handler will set 990 shutting_down. */ 991 while (!shutting_down) { 992 buflen = getpkt(buf, from_pid, to_pid); 993 if (buflen < 0) { 994 ERROR (0, "error reading packet\n"); 995 if (buflen == -2) 996 invoker_valgrind_dying(); 997 break; 998 } 999 if (strlen(buf) == 0) { 1000 DEBUG(0, "empty packet rcvd (packet qRcmd not recognised?)\n"); 1001 break; 1002 } 1003 if (strcmp(buf, "OK") == 0) { 1004 DEBUG(1, "OK packet rcvd\n"); 1005 break; 1006 } 1007 if (buf[0] == 'E') { 1008 DEBUG(0, 1009 "E NN error packet rcvd: %s (unknown monitor command?)\n", 1010 buf); 1011 break; 1012 } 1013 if (buf[0] == 'W') { 1014 DEBUG(0, "W stopped packet rcvd: %s\n", buf); 1015 break; 1016 } 1017 if (buf[0] == 'T') { 1018 DEBUG(1, "T resume reply packet received: %s\n", buf); 1019 continue; 1020 } 1021 1022 /* must be here an O packet with hex encoded string reply 1023 => decode and print it */ 1024 if (buf[0] != 'O') { 1025 DEBUG(0, "expecting O packet, received: %s\n", buf); 1026 continue; 1027 } 1028 { 1029 char buf_print[buflen/2 + 1]; 1030 for (i = 1; i < buflen; i = i + 2) 1031 buf_print[i/2] = (fromhex(*(buf+i)) << 4) 1032 + fromhex(*(buf+i+1)); 1033 buf_print[buflen/2] = 0; 1034 printf("%s", buf_print); 1035 fflush(stdout); 1036 } 1037 } 1038 free (hexcommand); 1039 } 1040 shutting_down = True; 1041 1042 close_connection(to_pid, from_pid); 1043 } 1044 1045 /* report to user the existence of a vgdb-able valgrind process 1046 with given pid */ 1047 static 1048 void report_pid (int pid, Bool on_stdout) 1049 { 1050 char cmdline_file[100]; 1051 char cmdline[1000]; 1052 int fd; 1053 int i, sz; 1054 1055 sprintf(cmdline_file, "/proc/%d/cmdline", pid); 1056 fd = open (cmdline_file, O_RDONLY); 1057 if (fd == -1) { 1058 DEBUG(1, "error opening cmdline file %s %s\n", 1059 cmdline_file, strerror(errno)); 1060 sprintf(cmdline, "(could not open process command line)"); 1061 } else { 1062 sz = read(fd, cmdline, 1000); 1063 for (i = 0; i < sz; i++) 1064 if (cmdline[i] == 0) 1065 cmdline[i] = ' '; 1066 if (sz >= 0) 1067 cmdline[sz] = 0; 1068 else { 1069 DEBUG(1, "error reading cmdline file %s %s\n", 1070 cmdline_file, strerror(errno)); 1071 sprintf(cmdline, "(could not read process command line)"); 1072 } 1073 close (fd); 1074 } 1075 fprintf((on_stdout ? stdout : stderr), "use --pid=%d for %s\n", pid, cmdline); 1076 fflush((on_stdout ? stdout : stderr)); 1077 } 1078 1079 static 1080 void usage(void) 1081 { 1082 fprintf(stderr, 1083 "Usage: vgdb [OPTION]... [[-c] COMMAND]...\n" 1084 "vgdb (valgrind gdb) has two usages\n" 1085 " 1. standalone to send monitor commands to a Valgrind gdbserver.\n" 1086 " The OPTION(s) must be followed by the command to send\n" 1087 " To send more than one command, separate the commands with -c\n" 1088 " 2. relay application between gdb and a Valgrind gdbserver.\n" 1089 " Only OPTION(s) can be given.\n" 1090 "\n" 1091 " OPTIONS are [--pid=<number>] [--vgdb-prefix=<prefix>]\n" 1092 " [--wait=<number>] [--max-invoke-ms=<number>]\n" 1093 " [--port=<portnr>\n" 1094 " [--cmd-time-out=<number>] [-l] [-D] [-d]\n" 1095 " \n" 1096 " --pid arg must be given if multiple Valgrind gdbservers are found.\n" 1097 " --vgdb-prefix arg must be given to both Valgrind and vgdb utility\n" 1098 " if you want to change the prefix (default %s) for the FIFOs communication\n" 1099 " between the Valgrind gdbserver and vgdb.\n" 1100 " --wait (default 0) tells vgdb to check during the specified number\n" 1101 " of seconds if a Valgrind gdbserver can be found.\n" 1102 " --max-invoke-ms (default 100) gives the nr of milli-seconds after which vgdb\n" 1103 " will force the invocation of the Valgrind gdbserver (if the Valgrind\n" 1104 " process is blocked in a system call).\n" 1105 " --port instructs vgdb to listen for gdb on the specified port nr.\n" 1106 " --cmd-time-out (default 99999999) tells vgdb to exit if the found Valgrind\n" 1107 " gdbserver has not processed a command after number seconds\n" 1108 " -l arg tells to show the list of running Valgrind gdbserver and then exit.\n" 1109 " -D arg tells to show shared mem status and then exit.\n" 1110 " -d arg tells to show debug info. Multiple -d args for more debug info\n" 1111 "\n" 1112 " -h --help shows this message\n" 1113 " To get help from the Valgrind gdbserver, use vgdb help\n" 1114 "\n", vgdb_prefix_default() 1115 ); 1116 invoker_restrictions_msg(); 1117 } 1118 1119 /* If show_list, outputs on stdout the list of Valgrind processes with gdbserver activated. 1120 and then exits. 1121 1122 else if arg_pid == -1, waits maximum check_trials seconds to discover 1123 a valgrind pid appearing. 1124 1125 Otherwise verify arg_pid is valid and corresponds to a Valgrind process 1126 with gdbserver activated. 1127 1128 Returns the pid to work with 1129 or exits in case of error (e.g. no pid found corresponding to arg_pid */ 1130 1131 static 1132 int search_arg_pid(int arg_pid, int check_trials, Bool show_list) 1133 { 1134 int i; 1135 int pid = -1; 1136 1137 if (arg_pid == 0 || arg_pid < -1) { 1138 fprintf (stderr, "vgdb error: invalid pid %d given\n", arg_pid); 1139 exit (1); 1140 } else { 1141 /* search for a matching named fifo. 1142 If we have been given a pid, we will check that the matching FIFO is 1143 there (or wait the nr of check_trials for this to appear). 1144 If no pid has been given, then if we find only one FIFO, 1145 we will use this to build the pid to use. 1146 If we find multiple processes with valid FIFO, we report them and will 1147 exit with an error. */ 1148 DIR *vgdb_dir; 1149 char *vgdb_dir_name = vmalloc (strlen (vgdb_prefix) + 3); 1150 struct dirent *f; 1151 int is; 1152 int nr_valid_pid = 0; 1153 const char *suffix = "-from-vgdb-to-"; /* followed by pid */ 1154 char *vgdb_format = vmalloc (strlen(vgdb_prefix) + strlen(suffix) + 1); 1155 1156 strcpy (vgdb_format, vgdb_prefix); 1157 strcat (vgdb_format, suffix); 1158 1159 if (strchr(vgdb_prefix, '/') != NULL) { 1160 strcpy (vgdb_dir_name, vgdb_prefix); 1161 for (is = strlen(vgdb_prefix) - 1; is >= 0; is--) 1162 if (vgdb_dir_name[is] == '/') { 1163 vgdb_dir_name[is+1] = '\0'; 1164 break; 1165 } 1166 } else { 1167 strcpy (vgdb_dir_name, ""); 1168 } 1169 1170 DEBUG(1, "searching pid in directory %s format %s\n", 1171 vgdb_dir_name, vgdb_format); 1172 1173 /* try to find FIFOs with valid pid. 1174 On exit of the loop, pid is set to: 1175 the last pid found if show_list (or -1 if no process was listed) 1176 -1 if no FIFOs matching a running process is found 1177 -2 if multiple FIFOs of running processes are found 1178 otherwise it is set to the (only) pid found that can be debugged 1179 */ 1180 for (i = 0; i < check_trials; i++) { 1181 DEBUG(1, "check_trial %d \n", i); 1182 if (i > 0) 1183 /* wait one second before checking again */ 1184 sleep(1); 1185 1186 vgdb_dir = opendir (strlen (vgdb_dir_name) ? vgdb_dir_name : "./"); 1187 if (vgdb_dir == NULL) 1188 XERROR (errno, 1189 "vgdb error: opening directory %s searching vgdb fifo\n", 1190 vgdb_dir_name); 1191 1192 errno = 0; /* avoid complain if vgdb_dir is empty */ 1193 while ((f = readdir (vgdb_dir))) { 1194 struct stat st; 1195 char pathname[strlen(vgdb_dir_name) + strlen(f->d_name) + 1]; 1196 char *wrongpid; 1197 int newpid; 1198 1199 strcpy (pathname, vgdb_dir_name); 1200 strcat (pathname, f->d_name); 1201 DEBUG(3, "checking pathname is FIFO %s\n", pathname); 1202 if (stat (pathname, &st) != 0) { 1203 if (debuglevel >= 3) 1204 ERROR (errno, "vgdb error: stat %s searching vgdb fifo\n", 1205 pathname); 1206 } else if (S_ISFIFO (st.st_mode)) { 1207 DEBUG(3, "trying FIFO %s\n", pathname); 1208 if (strncmp (pathname, vgdb_format, 1209 strlen (vgdb_format)) == 0) { 1210 newpid = strtol(pathname + strlen (vgdb_format), 1211 &wrongpid, 10); 1212 if (*wrongpid == '-' && newpid > 0 1213 && kill (newpid, 0) == 0) { 1214 nr_valid_pid++; 1215 if (show_list) { 1216 report_pid (newpid, /*on_stdout*/ True); 1217 pid = newpid; 1218 } else if (arg_pid != -1) { 1219 if (arg_pid == newpid) { 1220 pid = newpid; 1221 } 1222 } else if (nr_valid_pid > 1) { 1223 if (nr_valid_pid == 2) { 1224 fprintf 1225 (stderr, 1226 "no --pid= arg given" 1227 " and multiple valgrind pids found:\n"); 1228 report_pid (pid, /*on_stdout*/ False); 1229 } 1230 pid = -2; 1231 report_pid (newpid, /*on_stdout*/ False); 1232 } else { 1233 pid = newpid; 1234 } 1235 } 1236 } 1237 } 1238 errno = 0; /* avoid complain if at the end of vgdb_dir */ 1239 } 1240 if (f == NULL && errno != 0) 1241 XERROR (errno, "vgdb error: reading directory %s for vgdb fifo\n", 1242 vgdb_dir_name); 1243 1244 closedir (vgdb_dir); 1245 if (pid != -1) 1246 break; 1247 } 1248 1249 free (vgdb_dir_name); 1250 free (vgdb_format); 1251 } 1252 1253 if (show_list) { 1254 exit (1); 1255 } else if (pid == -1) { 1256 if (arg_pid == -1) 1257 fprintf (stderr, "vgdb error: no FIFO found and no pid given\n"); 1258 else 1259 fprintf (stderr, "vgdb error: no FIFO found matching pid %d\n", 1260 arg_pid); 1261 exit (1); 1262 } 1263 else if (pid == -2) { 1264 /* no arg_pid given, multiple FIFOs found */ 1265 exit (1); 1266 } 1267 else { 1268 return pid; 1269 } 1270 } 1271 1272 /* return true if the numeric value of an option of the 1273 form --xxxxxxxxx=<number> could properly be extracted 1274 from arg. If True is returned, *value contains the 1275 extracted value.*/ 1276 static 1277 Bool numeric_val(char* arg, int *value) 1278 { 1279 const char *eq_pos = strchr(arg, '='); 1280 char *wrong; 1281 long long int long_value; 1282 1283 if (eq_pos == NULL) 1284 return False; 1285 1286 long_value = strtoll(eq_pos+1, &wrong, 10); 1287 if (long_value < 0 || long_value > INT_MAX) 1288 return False; 1289 if (*wrong) 1290 return False; 1291 1292 *value = (int) long_value; 1293 return True; 1294 } 1295 1296 /* true if arg matches the provided option */ 1297 static 1298 Bool is_opt(char* arg, const char *option) 1299 { 1300 int option_len = strlen(option); 1301 if (option[option_len-1] == '=') 1302 return (0 == strncmp(option, arg, option_len)); 1303 else 1304 return (0 == strcmp(option, arg)); 1305 } 1306 1307 /* Parse command lines options. If error(s), exits. 1308 Otherwise returns the options in *p_... args. 1309 commands must be big enough for the commands extracted from argv. 1310 On return, *p_last_command gives the position in commands where 1311 the last command has been allocated (using vmalloc). */ 1312 static 1313 void parse_options(int argc, char** argv, 1314 Bool *p_show_shared_mem, 1315 Bool *p_show_list, 1316 int *p_arg_pid, 1317 int *p_check_trials, 1318 int *p_port, 1319 int *p_last_command, 1320 char *commands[]) 1321 { 1322 Bool show_shared_mem = False; 1323 Bool show_list = False; 1324 int arg_pid = -1; 1325 int check_trials = 1; 1326 int last_command = -1; 1327 int int_port = 0; 1328 1329 int i; 1330 int arg_errors = 0; 1331 1332 for (i = 1; i < argc; i++) { 1333 if (is_opt(argv[i], "--help") || is_opt(argv[i], "-h")) { 1334 usage(); 1335 exit(0); 1336 } else if (is_opt(argv[i], "-d")) { 1337 debuglevel++; 1338 } else if (is_opt(argv[i], "-D")) { 1339 show_shared_mem = True; 1340 } else if (is_opt(argv[i], "-l")) { 1341 show_list = True; 1342 } else if (is_opt(argv[i], "--pid=")) { 1343 int newpid; 1344 if (!numeric_val(argv[i], &newpid)) { 1345 fprintf (stderr, "invalid --pid argument %s\n", argv[i]); 1346 arg_errors++; 1347 } else if (arg_pid != -1) { 1348 fprintf (stderr, "multiple --pid arguments given\n"); 1349 arg_errors++; 1350 } else { 1351 arg_pid = newpid; 1352 } 1353 } else if (is_opt(argv[i], "--wait=")) { 1354 if (!numeric_val(argv[i], &check_trials)) { 1355 fprintf (stderr, "invalid --wait argument %s\n", argv[i]); 1356 arg_errors++; 1357 } 1358 } else if (is_opt(argv[i], "--max-invoke-ms=")) { 1359 if (!numeric_val(argv[i], &max_invoke_ms)) { 1360 fprintf (stderr, "invalid --max-invoke-ms argument %s\n", argv[i]); 1361 arg_errors++; 1362 } 1363 } else if (is_opt(argv[i], "--cmd-time-out=")) { 1364 if (!numeric_val(argv[i], &cmd_time_out)) { 1365 fprintf (stderr, "invalid --cmd-time-out argument %s\n", argv[i]); 1366 arg_errors++; 1367 } 1368 } else if (is_opt(argv[i], "--port=")) { 1369 if (!numeric_val(argv[i], &int_port)) { 1370 fprintf (stderr, "invalid --port argument %s\n", argv[i]); 1371 arg_errors++; 1372 } 1373 } else if (is_opt(argv[i], "--vgdb-prefix=")) { 1374 vgdb_prefix = argv[i] + 14; 1375 } else if (is_opt(argv[i], "-c")) { 1376 last_command++; 1377 commands[last_command] = vmalloc (1); 1378 commands[last_command][0] = '\0'; 1379 } else if (0 == strncmp(argv[i], "-", 1)) { 1380 fprintf (stderr, "unknown or invalid argument %s\n", argv[i]); 1381 arg_errors++; 1382 } else { 1383 int len; 1384 if (last_command == -1) { 1385 /* only one command, no -c command indicator */ 1386 last_command++; 1387 commands[last_command] = vmalloc (1); 1388 commands[last_command][0] = '\0'; 1389 } 1390 len = strlen(commands[last_command]); 1391 commands[last_command] = vrealloc (commands[last_command], 1392 len + 1 + strlen(argv[i]) + 1); 1393 if (len > 0) 1394 strcat (commands[last_command], " "); 1395 strcat (commands[last_command], argv[i]); 1396 if (packet_len_for_command(commands[last_command]) > PBUFSIZ) { 1397 fprintf (stderr, "command %s too long\n", commands[last_command]); 1398 arg_errors++; 1399 } 1400 1401 } 1402 } 1403 1404 if (vgdb_prefix == NULL) 1405 vgdb_prefix = vgdb_prefix_default(); 1406 1407 if (isatty(0) 1408 && !show_shared_mem 1409 && !show_list 1410 && int_port == 0 1411 && last_command == -1) { 1412 arg_errors++; 1413 fprintf (stderr, 1414 "Using vgdb standalone implies to give -D or -l or a COMMAND\n"); 1415 } 1416 1417 if (show_shared_mem && show_list) { 1418 arg_errors++; 1419 fprintf (stderr, 1420 "Can't use both -D and -l options\n"); 1421 } 1422 1423 if (max_invoke_ms > 0 1424 && cmd_time_out != NEVER 1425 && (cmd_time_out * 1000) <= max_invoke_ms) { 1426 arg_errors++; 1427 fprintf (stderr, 1428 "--max-invoke-ms must be < --cmd-time-out * 1000\n"); 1429 } 1430 1431 if (show_list && arg_pid != -1) { 1432 arg_errors++; 1433 fprintf (stderr, 1434 "Can't use both --pid and -l options\n"); 1435 } 1436 1437 if (int_port > 0 && last_command != -1) { 1438 arg_errors++; 1439 fprintf (stderr, 1440 "Can't use --port to send commands\n"); 1441 } 1442 1443 if (arg_errors > 0) { 1444 fprintf (stderr, "args error. Try `vgdb --help` for more information\n"); 1445 exit(1); 1446 } 1447 1448 *p_show_shared_mem = show_shared_mem; 1449 *p_show_list = show_list; 1450 *p_arg_pid = arg_pid; 1451 *p_check_trials = check_trials; 1452 *p_port = int_port; 1453 *p_last_command = last_command; 1454 } 1455 1456 int main(int argc, char** argv) 1457 { 1458 int i; 1459 int pid; 1460 1461 Bool show_shared_mem; 1462 Bool show_list; 1463 int arg_pid; 1464 int check_trials; 1465 int in_port; 1466 int last_command; 1467 char *commands[argc]; // we will never have more commands than args. 1468 1469 parse_options(argc, argv, 1470 &show_shared_mem, 1471 &show_list, 1472 &arg_pid, 1473 &check_trials, 1474 &in_port, 1475 &last_command, 1476 commands); 1477 1478 /* when we are working as a relay for gdb, handle some signals by 1479 only reporting them (according to debug level). Also handle these 1480 when ptrace will be used: vgdb must clean up the ptrace effect before 1481 dying. */ 1482 if (max_invoke_ms > 0 || last_command == -1) 1483 install_handlers(); 1484 1485 pid = search_arg_pid (arg_pid, check_trials, show_list); 1486 1487 prepare_fifos_and_shared_mem(pid); 1488 1489 if (in_port > 0) 1490 wait_for_gdb_connect(in_port); 1491 1492 if (show_shared_mem) { 1493 fprintf(stderr, 1494 "vgdb %d " 1495 "written_by_vgdb %d " 1496 "seen_by_valgrind %d\n" 1497 "vgdb pid %d\n", 1498 VS_vgdb_pid, 1499 VS_written_by_vgdb, 1500 VS_seen_by_valgrind, 1501 VS_vgdb_pid); 1502 exit (0); 1503 } 1504 1505 if (last_command >= 0) { 1506 standalone_send_commands(pid, last_command, commands); 1507 } else { 1508 gdb_relay(pid); 1509 } 1510 1511 1512 free (from_gdb_to_pid); 1513 free (to_gdb_from_pid); 1514 free (shared_mem); 1515 1516 for (i = 0; i <= last_command; i++) 1517 free (commands[i]); 1518 return 0; 1519 } 1520