153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Main code for remote server for GDB. 253f17a9db278d33517d9888dd77848f554522a38JP Abgrall Copyright (C) 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 2004, 2005, 2006, 2011 453f17a9db278d33517d9888dd77848f554522a38JP Abgrall Free Software Foundation, Inc. 553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 653f17a9db278d33517d9888dd77848f554522a38JP Abgrall This file is part of GDB. 753f17a9db278d33517d9888dd77848f554522a38JP Abgrall It has been modified to integrate it in valgrind 853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 953f17a9db278d33517d9888dd77848f554522a38JP Abgrall This program is free software; you can redistribute it and/or modify 1053f17a9db278d33517d9888dd77848f554522a38JP Abgrall it under the terms of the GNU General Public License as published by 1153f17a9db278d33517d9888dd77848f554522a38JP Abgrall the Free Software Foundation; either version 2 of the License, or 1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (at your option) any later version. 1353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1453f17a9db278d33517d9888dd77848f554522a38JP Abgrall This program is distributed in the hope that it will be useful, 1553f17a9db278d33517d9888dd77848f554522a38JP Abgrall but WITHOUT ANY WARRANTY; without even the implied warranty of 1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1753f17a9db278d33517d9888dd77848f554522a38JP Abgrall GNU General Public License for more details. 1853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall You should have received a copy of the GNU General Public License 2053f17a9db278d33517d9888dd77848f554522a38JP Abgrall along with this program; if not, write to the Free Software 2153f17a9db278d33517d9888dd77848f554522a38JP Abgrall Foundation, Inc., 51 Franklin Street, Fifth Floor, 2253f17a9db278d33517d9888dd77848f554522a38JP Abgrall Boston, MA 02110-1301, USA. */ 2353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "server.h" 2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "regdef.h" 2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_options.h" 2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_translate.h" 2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_mallocfree.h" 2953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_initimg.h" 3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_execontext.h" 3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_syswrap.h" // VG_(show_open_fds) 3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_scheduler.h" 3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_transtab.h" 3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_debuginfo.h" 3553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_addrinfo.h" 3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 3753f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long cont_thread; 3853f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long general_thread; 3953f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long step_thread; 4053f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long thread_from_wait; 4153f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long old_thread_from_wait; 4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4353f17a9db278d33517d9888dd77848f554522a38JP Abgrallint pass_signals[TARGET_SIGNAL_LAST]; /* indexed by gdb signal nr */ 4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* for a gdbserver integrated in valgrind, resuming the process consists 4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall in returning the control to valgrind. 4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall The guess process resumes its execution. 4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall Then at the next error or break or ..., valgrind calls gdbserver again. 4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall A resume reply packet must then be built to inform GDB that the 5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall resume request is finished. 5153f17a9db278d33517d9888dd77848f554522a38JP Abgrall resume_reply_packet_needed records the fact that the next call to gdbserver 5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall must send a resume packet to gdb. */ 5353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic Bool resume_reply_packet_needed = False; 5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5553f17a9db278d33517d9888dd77848f554522a38JP AbgrallVG_MINIMAL_JMP_BUF(toplevel); 5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Decode a qXfer read request. Return 0 if everything looks OK, 5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall or -1 otherwise. */ 5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 6053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic 6153f17a9db278d33517d9888dd77848f554522a38JP Abgrallint decode_xfer_read (char *buf, const char **annex, CORE_ADDR *ofs, unsigned int *len) 6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Extract and NUL-terminate the annex. */ 6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *annex = buf; 6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (*buf && *buf != ':') 6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall buf++; 6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (*buf == '\0') 6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return -1; 6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall *buf++ = 0; 7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* After the read/write marker and annex, qXfer looks like a 7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall traditional 'm' packet. */ 7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall decode_m_packet (buf, ofs, len); 7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Write the response to a successful qXfer read. Returns the 7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length of the (binary) data stored in BUF, corresponding 8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall to as much of DATA/LEN as we could fit. IS_MORE controls 8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall the first character of the response. */ 8253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic 8353f17a9db278d33517d9888dd77848f554522a38JP Abgrallint write_qxfer_response (char *buf, unsigned char *data, int len, int is_more) 8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall int out_len; 8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (is_more) 8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall buf[0] = 'm'; 8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall buf[0] = 'l'; 9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return remote_escape_output (data, len, (unsigned char *) buf + 1, &out_len, 9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall PBUFSIZ - POVERHSIZ - 1) + 1; 9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 9653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic Bool initial_valgrind_sink_saved = False; 9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* True <=> valgrind log sink saved in initial_valgrind_sink */ 9853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic OutputSink initial_valgrind_sink; 9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 10053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic Bool command_output_to_log = False; 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* True <=> command output goes to log instead of gdb */ 10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 10353f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid reset_valgrind_sink(const char *info) 10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (VG_(log_output_sink).fd != initial_valgrind_sink.fd 10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall && initial_valgrind_sink_saved) { 10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(log_output_sink).fd = initial_valgrind_sink.fd; 10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(umsg) ("Reset valgrind output to log (%s)\n", 10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (info = NULL ? "" : info)); 11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11353f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid print_to_initial_valgrind_sink (const char *msg) 11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall vg_assert (initial_valgrind_sink_saved); 11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(write) (initial_valgrind_sink.fd, msg, strlen(msg)); 11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic 12153f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid kill_request (const char *msg) 12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(umsg) ("%s", msg); 12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(exit) (0); 12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall// s is a NULL terminated string made of O or more words (separated by spaces). 12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall// Returns a pointer to the Nth word in s. 12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall// If Nth word does not exist, return a pointer to the last (0) byte of s. 13053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic 13153f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst char *wordn (const char *s, int n) 13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall int word_seen = 0; 13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall Bool searching_word = True; 13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (*s) { 13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (*s == ' ') 13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall searching_word = True; 13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall else { 14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (searching_word) { 14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall searching_word = False; 14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall word_seen++; 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (word_seen == n) 14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return s; 14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall s++; 14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return s; 15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15253f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid VG_(print_all_stats) (Bool memory_stats, Bool tool_stats) 15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (memory_stats) { 15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(message)(Vg_DebugMsg, "\n"); 15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(message)(Vg_DebugMsg, 15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "------ Valgrind's internal memory use stats follow ------\n" ); 15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(sanity_check_malloc_all)(); 15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(message)(Vg_DebugMsg, "------\n" ); 16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_all_arena_stats)(); 16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (VG_(clo_profile_heap)) 16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_arena_cc_analysis) (); 16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(message)(Vg_DebugMsg, "\n"); 16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_translation_stats)(); 16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_tt_tc_stats)(); 16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_scheduler_stats)(); 16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_ExeContext_stats)( False /* with_stacktraces */ ); 17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(print_errormgr_stats)(); 17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tool_stats && VG_(needs).print_stats) { 17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_TDICT_CALL(tool_print_stats); 17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* handle_gdb_valgrind_command handles the provided mon string command. 17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall If command is recognised, return 1 else return 0. 17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall Note that in case of ambiguous command, 1 is returned. 17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *sink_wanted_at_return is modified if one of the commands 18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 'v.set *_output' is handled. 18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall*/ 18353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic 18453f17a9db278d33517d9888dd77848f554522a38JP Abgrallint handle_gdb_valgrind_command (char *mon, OutputSink *sink_wanted_at_return) 18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall UWord ret = 0; 18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall char s[strlen(mon)+1]; /* copy for strtok_r */ 18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall char *wcmd; 18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall HChar *ssaveptr; 19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall const char *endptr; 19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall int kwdid; 19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall int int_value; 19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall vg_assert (initial_valgrind_sink_saved); 19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall strcpy (s, mon); 19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd = strtok_r (s, " ", &ssaveptr); 19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* NB: if possible, avoid introducing a new command below which 19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall starts with the same 3 first letters as an already existing 20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall command. This ensures a shorter abbreviation for the user. */ 20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (VG_(keyword_id) ("help v.set v.info v.wait v.kill v.translate" 20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall " v.do", 20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd, kwd_report_duplicated_matches)) { 20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -2: 20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = 1; 20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -1: 20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0: /* help */ 21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = 1; 21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd = strtok_r (NULL, " ", &ssaveptr); 21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (wcmd == NULL) { 21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall int_value = 0; 21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (VG_(keyword_id) ("debug", wcmd, kwd_report_all)) { 21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -2: int_value = 0; break; 21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -1: int_value = 0; break; 21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0: int_value = 1; break; 21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: tl_assert (0); 22053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 22153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) ( 22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"general valgrind monitor commands:\n" 22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall" help [debug] : monitor command help. With debug: + debugging commands\n" 22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.wait [<ms>] : sleep <ms> (default 0) then continue\n" 22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info all_errors : show all errors found so far\n" 22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info last_error : show last error found\n" 22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info location <addr> : show information about location <addr>\n" 23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info n_errs_found [msg] : show the nr of errors found so far and the given msg\n" 23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info open_fds : show open file descriptors (only if --track-fds=yes)\n" 23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.kill : kill the Valgrind process\n" 23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set gdb_output : set valgrind output to gdb\n" 23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set log_output : set valgrind output to log\n" 23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set mixed_output : set valgrind output to log, interactive output to gdb\n" 23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set merge-recursive-frames <num> : merge recursive calls in max <num> frames\n" 23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set vgdb-error <errornr> : debug me at error >= <errornr> \n"); 23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (int_value) { VG_(gdb_printf) ( 23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall"debugging valgrind internals monitor commands:\n" 24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.do expensive_sanity_check_general : do an expensive sanity check now\n" 24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info gdbserver_status : show gdbserver status\n" 24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info memory [aspacemgr] : show valgrind heap memory stats\n" 24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall" (with aspacemgr arg, also shows valgrind segments on log ouput)\n" 24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info exectxt : show stacktraces and stats of all execontexts\n" 24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info scheduler : show valgrind thread state and stacktrace\n" 24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.info stats : show various valgrind and tool stats\n" 24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set debuglog <level> : set valgrind debug log level to <level>\n" 24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.set hostvisibility [yes*|no] : (en/dis)ables access by gdb/gdbserver to\n" 24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall" Valgrind internal host status/memory\n" 25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall" v.translate <addr> [<traceflags>] : debug translation of <addr> with <traceflags>\n" 25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall" (default traceflags 0b00100000 : show after instrumentation)\n" 25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall" An additional flag 0b100000000 allows to show gdbserver instrumentation\n"); 25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 1: /* v.set */ 25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = 1; 25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd = strtok_r (NULL, " ", &ssaveptr); 25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (kwdid = VG_(keyword_id) 25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ("vgdb-error debuglog merge-recursive-frames" 26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall " gdb_output log_output mixed_output hostvisibility ", 26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd, kwd_report_all)) { 26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -2: 26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -1: 26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0: /* vgdb-error */ 26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 1: /* debuglog */ 26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 2: /* merge-recursive-frames */ 26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd = strtok_r (NULL, " ", &ssaveptr); 26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (wcmd == NULL) { 27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall int_value = 0; 27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall endptr = "empty"; /* to report an error below */ 27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall HChar *the_end; 27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall int_value = strtol (wcmd, &the_end, 10); 27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall endptr = the_end; 27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (*endptr != '\0') { 27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) ("missing or malformed integer value\n"); 27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if (kwdid == 0) { 28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(printf) ("vgdb-error value changed from %d to %d\n", 28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(dyn_vgdb_error), int_value); 28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(dyn_vgdb_error) = int_value; 28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if (kwdid == 1) { 28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(printf) ("debuglog value changed from %d to %d\n", 28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(debugLog_getLevel)(), int_value); 28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(debugLog_startup) (int_value, "gdbsrv"); 28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if (kwdid == 2) { 28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(printf) 28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ("merge-recursive-frames value changed from %d to %d\n", 29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(clo_merge_recursive_frames), int_value); 29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(clo_merge_recursive_frames) = int_value; 29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall vg_assert (0); 29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 3: /* gdb_output */ 29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall (*sink_wanted_at_return).fd = -2; 29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall command_output_to_log = False; 29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) ("valgrind output will go to gdb\n"); 30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 4: /* log_output */ 30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (*sink_wanted_at_return).fd = initial_valgrind_sink.fd; 30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall command_output_to_log = True; 30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) ("valgrind output will go to log\n"); 30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 5: /* mixed output */ 30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall (*sink_wanted_at_return).fd = initial_valgrind_sink.fd; 30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall command_output_to_log = False; 30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) 31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ("valgrind output will go to log, interactive output will go to gdb\n"); 31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 6: /* hostvisibility */ 31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd = strtok_r (NULL, " ", &ssaveptr); 31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (wcmd != NULL) { 31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (VG_(keyword_id) ("yes no", wcmd, kwd_report_all)) { 31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -2: 31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -1: break; 31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0: 31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall hostvisibility = True; 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 1: 32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall hostvisibility = False; 32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: tl_assert (0); 32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall hostvisibility = True; 32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (hostvisibility) 33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) 33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ("Enabled access to Valgrind memory/status by GDB\n" 33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "If not yet done, tell GDB which valgrind file(s) to use:\n" 33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "add-symbol-file <tool or preloaded file> <loadaddr>\n"); 33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdb_printf) 33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ("Disabled access to Valgrind memory/status by GDB\n"); 33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall vg_assert (0); 34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 2: /* v.info */ { 34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = 1; 34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd = strtok_r (NULL, " ", &ssaveptr); 34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (kwdid = VG_(keyword_id) 34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ("all_errors n_errs_found last_error gdbserver_status memory" 34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall " scheduler stats open_fds exectxt location", 34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall wcmd, kwd_report_all)) { 34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -2: 35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case -1: 35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0: // all_errors 35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall // A verbosity of minimum 2 is needed to show the errors. 35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(show_all_errors)(/* verbosity */ 2, /* xml */ False); 35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 1: // n_errs_found 35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(printf) ("n_errs_found %d n_errs_shown %d (vgdb-error %d) %s\n", 35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(get_n_errs_found) (), 35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(get_n_errs_shown) (), 36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(dyn_vgdb_error), 36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall wordn (mon, 3)); 36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 2: // last_error 36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(show_last_error)(); 36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 3: // gdbserver_status 36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall VG_(gdbserver_status_output)(); 36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 369 case 4: /* memory */ 370 VG_(printf) ("%llu bytes have already been allocated.\n", 371 VG_(am_get_anonsize_total)()); 372 VG_(print_all_arena_stats) (); 373 if (VG_(clo_profile_heap)) 374 VG_(print_arena_cc_analysis) (); 375 wcmd = strtok_r (NULL, " ", &ssaveptr); 376 if (wcmd != NULL) { 377 switch (VG_(keyword_id) ("aspacemgr", wcmd, kwd_report_all)) { 378 case -2: 379 case -1: break; 380 case 0: 381 VG_(am_show_nsegments) (0, "gdbserver v.info memory aspacemgr"); 382 break; 383 default: tl_assert (0); 384 } 385 } 386 387 ret = 1; 388 break; 389 case 5: /* scheduler */ 390 VG_(show_sched_status) (True, // host_stacktrace 391 True, // valgrind_stack_usage 392 True); // exited_threads 393 ret = 1; 394 break; 395 case 6: /* stats */ 396 VG_(print_all_stats)(False, /* Memory stats */ 397 True /* Tool stats */); 398 ret = 1; 399 break; 400 case 7: /* open_fds */ 401 if (VG_(clo_track_fds)) 402 VG_(show_open_fds) (""); 403 else 404 VG_(gdb_printf) 405 ("Valgrind must be started with --track-fds=yes" 406 " to show open fds\n"); 407 ret = 1; 408 break; 409 case 8: /* exectxt */ 410 VG_(print_ExeContext_stats) (True /* with_stacktraces */); 411 ret = 1; 412 break; 413 case 9: { /* location */ 414 /* Note: we prefer 'v.info location' and not 'v.info address' as 415 v.info address is inconsistent with the GDB (native) 416 command 'info address' which gives the address for a symbol. 417 GDB equivalent command of 'v.info location' is 'info symbol'. */ 418 Addr address; 419 SizeT dummy_sz = 0x1234; 420 if (VG_(strtok_get_address_and_size) (&address, &dummy_sz, &ssaveptr)) { 421 // If tool provides location information, use that. 422 if (VG_(needs).info_location) { 423 VG_TDICT_CALL(tool_info_location, address); 424 } 425 // If tool does not provide location information, use the common one. 426 // Also use the common to compare with tool when debug log is set. 427 if (!VG_(needs).info_location || VG_(debugLog_getLevel)() > 0 ) { 428 AddrInfo ai; 429 ai.tag = Addr_Undescribed; 430 VG_(describe_addr) (address, &ai); 431 VG_(pp_addrinfo) (address, &ai); 432 VG_(clear_addrinfo) (&ai); 433 } 434 } 435 ret = 1; 436 break; 437 } 438 default: 439 vg_assert(0); 440 } 441 break; 442 } 443 case 3: /* v.wait */ 444 wcmd = strtok_r (NULL, " ", &ssaveptr); 445 if (wcmd != NULL) { 446 int_value = strtol (wcmd, NULL, 10); 447 VG_(printf) ("gdbserver: continuing in %d ms ...\n", int_value); 448 VG_(poll)(NULL, 0, int_value); 449 } 450 VG_(printf) ("gdbserver: continuing after wait ...\n"); 451 ret = 1; 452 break; 453 case 4: /* v.kill */ 454 kill_request ("monitor command request to kill this process\n"); 455 break; 456 case 5: { /* v.translate */ 457 Addr address; 458 SizeT verbosity = 0x20; 459 460 ret = 1; 461 462 if (VG_(strtok_get_address_and_size) (&address, &verbosity, &ssaveptr)) { 463 /* we need to force the output to log for the translation trace, 464 as low level VEX tracing cannot be redirected to gdb. */ 465 int saved_command_output_to_log = command_output_to_log; 466 int saved_fd = VG_(log_output_sink).fd; 467 Bool single_stepping_on_entry = valgrind_single_stepping(); 468 int vex_verbosity = verbosity & 0xff; 469 VG_(log_output_sink).fd = initial_valgrind_sink.fd; 470 if ((verbosity & 0x100) && !single_stepping_on_entry) { 471 valgrind_set_single_stepping(True); 472 // to force gdbserver instrumentation. 473 } 474# if defined(VGA_arm) 475 // on arm, we need to (potentially) convert this address 476 // to the thumb form. 477 address = thumb_pc (address); 478# endif 479 480 VG_(translate) ( 0 /* dummy ThreadId; irrelevant due to debugging*/, 481 address, 482 /*debugging*/True, 483 (Int) vex_verbosity, 484 /*bbs_done*/0, 485 /*allow redir?*/True); 486 if ((verbosity & 0x100) && !single_stepping_on_entry) { 487 valgrind_set_single_stepping(False); 488 // reset single stepping. 489 } 490 command_output_to_log = saved_command_output_to_log; 491 VG_(log_output_sink).fd = saved_fd; 492 } 493 break; 494 } 495 496 case 6: /* v.do */ 497 ret = 1; 498 wcmd = strtok_r (NULL, " ", &ssaveptr); 499 switch (VG_(keyword_id) ("expensive_sanity_check_general", 500 wcmd, kwd_report_all)) { 501 case -2: 502 case -1: break; 503 case 0: { /* expensive_sanity_check_general */ 504 // Temporarily bump up sanity level to check e.g. the malloc arenas. 505 const Int save_clo_sanity_level = VG_(clo_sanity_level); 506 if (VG_(clo_sanity_level) < 4) VG_(clo_sanity_level) = 4; 507 VG_(sanity_check_general) (/* force_expensive */ True); 508 VG_(clo_sanity_level) = save_clo_sanity_level; 509 break; 510 } 511 default: tl_assert (0); 512 } 513 break; 514 515 default: 516 vg_assert (0); 517 } 518 return ret; 519} 520 521/* handle_gdb_monitor_command handles the provided mon string command, 522 which can be either a "standard" valgrind monitor command 523 or a tool specific monitor command. 524 If command recognised, return 1 else return 0. 525 Note that in case of ambiguous command, 1 is returned. 526*/ 527static 528int handle_gdb_monitor_command (char *mon) 529{ 530 UWord ret = 0; 531 UWord tool_ret = 0; 532 // initially, we assume that when returning, the desired sink is the 533 // one we have when entering. It can however be changed by the standard 534 // valgrind command handling. 535 OutputSink sink_wanted_at_return = VG_(log_output_sink); 536 537 if (!initial_valgrind_sink_saved) { 538 /* first time we enter here, we save the valgrind default log sink */ 539 initial_valgrind_sink = sink_wanted_at_return; 540 initial_valgrind_sink_saved = True; 541 } 542 543 if (!command_output_to_log) 544 VG_(log_output_sink).fd = -2; /* redirect to monitor_output */ 545 546 ret = handle_gdb_valgrind_command (mon, &sink_wanted_at_return); 547 548 /* Even if command was recognised by valgrind core, we call the 549 tool command handler : this is needed to handle help command 550 and/or to let the tool do some additional processing of a 551 valgrind standard command. Note however that if valgrind 552 recognised the command, we will always return success. */ 553 if (VG_(needs).client_requests) { 554 /* If the tool reports an error when handling a monitor command, 555 we need to avoid calling gdbserver during this command 556 handling. So, we temporarily set VG_(dyn_vgdb_error) to 557 a huge value to ensure m_errormgr.c does not call gdbserver. */ 558 Int save_dyn_vgdb_error = VG_(dyn_vgdb_error); 559 UWord arg[2]; 560 VG_(dyn_vgdb_error) = 999999999; 561 arg[0] = (UWord) VG_USERREQ__GDB_MONITOR_COMMAND; 562 arg[1] = (UWord) mon; 563 VG_TDICT_CALL(tool_handle_client_request, VG_(running_tid), arg, 564 &tool_ret); 565 VG_(dyn_vgdb_error) = save_dyn_vgdb_error; 566 } 567 568 VG_(message_flush) (); 569 570 /* restore or set the desired output */ 571 VG_(log_output_sink).fd = sink_wanted_at_return.fd; 572 if (ret | tool_ret) 573 return 1; 574 else 575 return 0; 576} 577 578 579/* Handle all of the extended 'Q' packets. */ 580static 581void handle_set (char *arg_own_buf, int *new_packet_len_p) 582{ 583 if (strcmp ("QStartNoAckMode", arg_own_buf) == 0) { 584 noack_mode = True; 585 write_ok (arg_own_buf); 586 return; 587 } 588 589 if (strncmp ("QPassSignals:", arg_own_buf, 13) == 0) { 590 int i; 591 char *from, *to; 592 char *end = arg_own_buf + strlen(arg_own_buf); 593 CORE_ADDR sig; 594 for (i = 0; i < TARGET_SIGNAL_LAST; i++) 595 pass_signals[i] = 0; 596 597 from = arg_own_buf + 13; 598 while (from < end) { 599 to = strchr(from, ';'); 600 if (to == NULL) to = end; 601 decode_address (&sig, from, to - from); 602 pass_signals[(int)sig] = 1; 603 dlog(1, "pass_signal gdb_nr %d %s\n", 604 (int)sig, target_signal_to_name(sig)); 605 from = to; 606 if (*from == ';') from++; 607 } 608 write_ok (arg_own_buf); 609 return; 610 } 611 /* Otherwise we didn't know what packet it was. Say we didn't 612 understand it. */ 613 arg_own_buf[0] = 0; 614} 615 616Bool VG_(client_monitor_command) (HChar *cmd) 617{ 618 const Bool connected = remote_connected(); 619 const int saved_command_output_to_log = command_output_to_log; 620 Bool handled; 621 622 if (!connected) 623 command_output_to_log = True; 624 handled = handle_gdb_monitor_command (cmd); 625 if (!connected) { 626 // reset the log output unless cmd changed it. 627 if (command_output_to_log) 628 command_output_to_log = saved_command_output_to_log; 629 } 630 if (handled) 631 return False; // recognised 632 else 633 return True; // not recognised 634} 635 636/* Handle all of the extended 'q' packets. */ 637static 638void handle_query (char *arg_own_buf, int *new_packet_len_p) 639{ 640 static struct inferior_list_entry *thread_ptr; 641 642 /* qRcmd, monitor command handling. */ 643 if (strncmp ("qRcmd,", arg_own_buf, 6) == 0) { 644 char *p = arg_own_buf + 6; 645 int cmdlen = strlen(p)/2; 646 char cmd[cmdlen+1]; 647 648 if (unhexify (cmd, p, cmdlen) != cmdlen) { 649 write_enn (arg_own_buf); 650 return; 651 } 652 cmd[cmdlen] = '\0'; 653 654 if (handle_gdb_monitor_command (cmd)) { 655 write_ok (arg_own_buf); 656 return; 657 } else { 658 /* cmd not recognised */ 659 VG_(gdb_printf) 660 ("command '%s' not recognised\n" 661 "In gdb, try 'monitor help'\n" 662 "In a shell, try 'vgdb help'\n", 663 cmd); 664 write_ok (arg_own_buf); 665 return; 666 } 667 } 668 669 /* provide some valgrind specific info in return to qThreadExtraInfo. */ 670 if (strncmp ("qThreadExtraInfo,", arg_own_buf, 17) == 0) { 671 unsigned long gdb_id; 672 struct thread_info *ti; 673 ThreadState *tst; 674 char status[100]; 675 676 gdb_id = strtoul (&arg_own_buf[17], NULL, 16); 677 ti = gdb_id_to_thread (gdb_id); 678 if (ti != NULL) { 679 tst = (ThreadState *) inferior_target_data (ti); 680 /* Additional info is the tid, the thread status and the thread's 681 name, if any. */ 682 if (tst->thread_name) { 683 VG_(snprintf) (status, sizeof(status), "tid %d %s %s", 684 tst->tid, 685 VG_(name_of_ThreadStatus)(tst->status), 686 tst->thread_name); 687 } else { 688 VG_(snprintf) (status, sizeof(status), "tid %d %s", 689 tst->tid, 690 VG_(name_of_ThreadStatus)(tst->status)); 691 } 692 hexify (arg_own_buf, status, strlen(status)); 693 return; 694 } else { 695 write_enn (arg_own_buf); 696 return; 697 } 698 } 699 700 if (strcmp ("qAttached", arg_own_buf) == 0) { 701 /* tell gdb to always detach, never kill the process */ 702 arg_own_buf[0] = '1'; 703 arg_own_buf[1] = 0; 704 return; 705 } 706 707 if (strcmp ("qSymbol::", arg_own_buf) == 0) { 708 /* We have no symbol to read. */ 709 write_ok (arg_own_buf); 710 return; 711 } 712 713 if (strcmp ("qfThreadInfo", arg_own_buf) == 0) { 714 thread_ptr = all_threads.head; 715 VG_(sprintf) (arg_own_buf, "m%x", 716 thread_to_gdb_id ((struct thread_info *)thread_ptr)); 717 thread_ptr = thread_ptr->next; 718 return; 719 } 720 721 if (strcmp ("qsThreadInfo", arg_own_buf) == 0) { 722 if (thread_ptr != NULL) { 723 VG_(sprintf) (arg_own_buf, "m%x", 724 thread_to_gdb_id ((struct thread_info *)thread_ptr)); 725 thread_ptr = thread_ptr->next; 726 return; 727 } else { 728 VG_(sprintf) (arg_own_buf, "l"); 729 return; 730 } 731 } 732 733 if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL 734 && strncmp ("qXfer:features:read:", arg_own_buf, 20) == 0) { 735 CORE_ADDR ofs; 736 unsigned int len, doc_len; 737 const char *annex = NULL; 738 // First, the annex is extracted from the packet received. 739 // Then, it is replaced by the corresponding file name. 740 int fd; 741 742 /* Grab the annex, offset, and length. */ 743 if (decode_xfer_read (arg_own_buf + 20, &annex, &ofs, &len) < 0) { 744 strcpy (arg_own_buf, "E00"); 745 return; 746 } 747 748 if (strcmp (annex, "target.xml") == 0) { 749 annex = valgrind_target_xml(VG_(clo_vgdb_shadow_registers)); 750 if (annex != NULL && VG_(clo_vgdb_shadow_registers)) { 751 /* Ensure the shadow registers are initialized. */ 752 initialize_shadow_low(True); 753 } 754 if (annex == NULL) { 755 strcpy (arg_own_buf, "E00"); 756 return; 757 } 758 } 759 760 { 761 char doc[VG_(strlen)(VG_(libdir)) + 1 + VG_(strlen)(annex) + 1]; 762 struct vg_stat stat_doc; 763 char toread[len]; 764 int len_read; 765 766 VG_(sprintf)(doc, "%s/%s", VG_(libdir), annex); 767 fd = VG_(fd_open) (doc, VKI_O_RDONLY, 0); 768 if (fd == -1) { 769 strcpy (arg_own_buf, "E00"); 770 return; 771 } 772 if (VG_(fstat) (fd, &stat_doc) != 0) { 773 VG_(close) (fd); 774 strcpy (arg_own_buf, "E00"); 775 return; 776 } 777 doc_len = stat_doc.size; 778 779 if (len > PBUFSIZ - POVERHSIZ) 780 len = PBUFSIZ - POVERHSIZ; 781 782 if (ofs > doc_len) { 783 write_enn (arg_own_buf); 784 VG_(close) (fd); 785 return; 786 } 787 VG_(lseek) (fd, ofs, VKI_SEEK_SET); 788 len_read = VG_(read) (fd, toread, len); 789 *new_packet_len_p = write_qxfer_response (arg_own_buf, (unsigned char *)toread, 790 len_read, ofs + len_read < doc_len); 791 VG_(close) (fd); 792 return; 793 } 794 } 795 796 if (strncmp ("qXfer:auxv:read:", arg_own_buf, 16) == 0) { 797 unsigned char *data; 798 int n; 799 CORE_ADDR ofs; 800 unsigned int len; 801 const char *annex; 802 803 /* Reject any annex; grab the offset and length. */ 804 if (decode_xfer_read (arg_own_buf + 16, &annex, &ofs, &len) < 0 805 || annex[0] != '\0') { 806 strcpy (arg_own_buf, "E00"); 807 return; 808 } 809 810 if (len > PBUFSIZ - 2) 811 len = PBUFSIZ - 2; 812 data = malloc (len); 813 814 { 815 UWord *client_auxv = VG_(client_auxv); 816 unsigned int client_auxv_len = 0; 817 while (*client_auxv != 0) { 818 dlog(4, "auxv %lld %llx\n", 819 (ULong)*client_auxv, 820 (ULong)*(client_auxv+1)); 821 client_auxv++; 822 client_auxv++; 823 client_auxv_len += 2 * sizeof(UWord); 824 } 825 client_auxv_len += 2 * sizeof(UWord); 826 dlog(4, "auxv len %d\n", client_auxv_len); 827 828 if (ofs >= client_auxv_len) 829 n = -1; 830 else { 831 n = client_auxv_len - ofs; 832 VG_(memcpy) (data, (unsigned char *) VG_(client_auxv), n); 833 } 834 } 835 836 if (n < 0) 837 write_enn (arg_own_buf); 838 else if (n > len) 839 *new_packet_len_p = write_qxfer_response (arg_own_buf, data, len, 1); 840 else 841 *new_packet_len_p = write_qxfer_response (arg_own_buf, data, n, 0); 842 843 free (data); 844 845 return; 846 } 847 848 849 /* Protocol features query. */ 850 if (strncmp ("qSupported", arg_own_buf, 10) == 0 851 && (arg_own_buf[10] == ':' || arg_own_buf[10] == '\0')) { 852 VG_(sprintf) (arg_own_buf, "PacketSize=%x", PBUFSIZ - 1); 853 /* Note: max packet size including frame and checksum, but without 854 trailing null byte, which is not sent/received. */ 855 856 strcat (arg_own_buf, ";QStartNoAckMode+"); 857 strcat (arg_own_buf, ";QPassSignals+"); 858 if (VG_(client_auxv)) 859 strcat (arg_own_buf, ";qXfer:auxv:read+"); 860 861 if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL) { 862 strcat (arg_own_buf, ";qXfer:features:read+"); 863 /* if a new gdb connects to us, we have to reset the register 864 set to the normal register sets to allow this new gdb to 865 decide to use or not the shadow registers. 866 867 Note that the reset is only done for gdb that are sending 868 qSupported packets. If a user first connected with a recent 869 gdb using shadow registers and then with a very old gdb 870 that does not use qSupported packet, then the old gdb will 871 not properly connect. */ 872 initialize_shadow_low(False); 873 } 874 return; 875 } 876 877 /* Otherwise we didn't know what packet it was. Say we didn't 878 understand it. */ 879 arg_own_buf[0] = 0; 880} 881 882/* Handle all of the extended 'v' packets. */ 883static 884void handle_v_requests (char *arg_own_buf, char *status, int *zignal) 885{ 886 /* vcont packet code from gdb 6.6 removed */ 887 888 /* Otherwise we didn't know what packet it was. Say we didn't 889 understand it. */ 890 arg_own_buf[0] = 0; 891 return; 892} 893 894static 895void myresume (int step, int sig) 896{ 897 struct thread_resume resume_info[2]; 898 int n = 0; 899 900 if (step || sig) { 901 resume_info[0].step = step; 902 resume_info[0].sig = sig; 903 n++; 904 } 905 resume_info[n].step = 0; 906 resume_info[n].sig = 0; 907 908 resume_reply_packet_needed = True; 909 valgrind_resume (resume_info); 910} 911 912/* server_main global variables */ 913static char *own_buf; 914static unsigned char *mem_buf; 915 916void gdbserver_init (void) 917{ 918 dlog(1, "gdbserver_init gdbserver embedded in valgrind: %s\n", version); 919 noack_mode = False; 920 valgrind_initialize_target (); 921 // After a fork, gdbserver_init can be called again. 922 // We do not have to re-malloc the buffers in such a case. 923 if (own_buf == NULL) 924 own_buf = malloc (PBUFSIZ+POVERHSIZ); 925 if (mem_buf == NULL) 926 mem_buf = malloc (PBUFSIZ+POVERHSIZ); 927 // Note: normally, we should only malloc PBUFSIZ. However, 928 // GDB has a bug, and in some cases, sends e.g. 'm' packets 929 // asking for slightly more than the PacketSize given at 930 // connection initialisation. So, we bypass the GDB bug 931 // by allocating slightly more. 932} 933 934void gdbserver_terminate (void) 935{ 936 /* last call to gdbserver is cleanup call */ 937 if (VG_MINIMAL_SETJMP(toplevel)) { 938 dlog(0, "error caused VG_MINIMAL_LONGJMP to gdbserver_terminate\n"); 939 return; 940 } 941 remote_close(); 942} 943 944void server_main (void) 945{ 946 static char status; 947 static int zignal; 948 949 char ch; 950 int i = 0; 951 unsigned int len; 952 CORE_ADDR mem_addr; 953 954 zignal = valgrind_wait (&status); 955 if (VG_MINIMAL_SETJMP(toplevel)) { 956 dlog(0, "error caused VG_MINIMAL_LONGJMP to server_main\n"); 957 } 958 while (1) { 959 unsigned char sig; 960 int packet_len; 961 int new_packet_len = -1; 962 963 if (resume_reply_packet_needed) { 964 /* Send the resume reply to reply to last GDB resume 965 request. */ 966 resume_reply_packet_needed = False; 967 prepare_resume_reply (own_buf, status, zignal); 968 putpkt (own_buf); 969 } 970 971 /* If we our status is terminal (exit or fatal signal) get out 972 as quickly as we can. We won't be able to handle any request 973 anymore. */ 974 if (status == 'W' || status == 'X') { 975 return; 976 } 977 978 packet_len = getpkt (own_buf); 979 if (packet_len <= 0) 980 break; 981 982 i = 0; 983 ch = own_buf[i++]; 984 switch (ch) { 985 case 'Q': 986 handle_set (own_buf, &new_packet_len); 987 break; 988 case 'q': 989 handle_query (own_buf, &new_packet_len); 990 break; 991 case 'd': 992 /* set/unset debugging is done through valgrind debug level. */ 993 own_buf[0] = '\0'; 994 break; 995 case 'D': 996 reset_valgrind_sink("gdb detaching from process"); 997 998 /* When detaching or kill the process, gdb expects to get 999 an packet OK back. Any other output will make gdb 1000 believes detach did not work. */ 1001 write_ok (own_buf); 1002 putpkt (own_buf); 1003 remote_finish (reset_after_error); 1004 remote_open (VG_(clo_vgdb_prefix)); 1005 myresume (0, 0); 1006 resume_reply_packet_needed = False; 1007 return; 1008 case '!': 1009 /* We can not use the extended protocol with valgrind, 1010 because we can not restart the running 1011 program. So return unrecognized. */ 1012 own_buf[0] = '\0'; 1013 break; 1014 case '?': 1015 prepare_resume_reply (own_buf, status, zignal); 1016 break; 1017 case 'H': 1018 if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') { 1019 unsigned long gdb_id, thread_id; 1020 1021 gdb_id = strtoul (&own_buf[2], NULL, 16); 1022 thread_id = gdb_id_to_thread_id (gdb_id); 1023 if (thread_id == 0) { 1024 write_enn (own_buf); 1025 break; 1026 } 1027 1028 if (own_buf[1] == 'g') { 1029 general_thread = thread_id; 1030 set_desired_inferior (1); 1031 } else if (own_buf[1] == 'c') { 1032 cont_thread = thread_id; 1033 } else if (own_buf[1] == 's') { 1034 step_thread = thread_id; 1035 } 1036 1037 write_ok (own_buf); 1038 } else { 1039 /* Silently ignore it so that gdb can extend the protocol 1040 without compatibility headaches. */ 1041 own_buf[0] = '\0'; 1042 } 1043 break; 1044 case 'g': 1045 set_desired_inferior (1); 1046 registers_to_string (own_buf); 1047 break; 1048 case 'G': 1049 set_desired_inferior (1); 1050 registers_from_string (&own_buf[1]); 1051 write_ok (own_buf); 1052 break; 1053 case 'P': { 1054 int regno; 1055 char *regbytes; 1056 Bool mod; 1057 ThreadState *tst; 1058 regno = strtol(&own_buf[1], NULL, 16); 1059 regbytes = strchr(&own_buf[0], '=') + 1; 1060 set_desired_inferior (1); 1061 tst = (ThreadState *) inferior_target_data (current_inferior); 1062 /* Only accept changing registers in "runnable state3. 1063 In fact, it would be ok to change most of the registers 1064 except a few "sensitive" registers such as the PC, SP, BP. 1065 We assume we do not need to very specific here, and that we 1066 can just refuse all of these. */ 1067 if (tst->status == VgTs_Runnable || tst->status == VgTs_Yielding) { 1068 supply_register_from_string (regno, regbytes, &mod); 1069 write_ok (own_buf); 1070 } else { 1071 /* at least from gdb 6.6 onwards, an E. error 1072 reply is shown to the user. So, we do an error 1073 msg which both is accepted by gdb as an error msg 1074 and is readable by the user. */ 1075 VG_(sprintf) 1076 (own_buf, 1077"E.\n" 1078"ERROR changing register %s regno %d\n" 1079"gdb commands changing registers (pc, sp, ...) (e.g. 'jump',\n" 1080"set pc, calling from gdb a function in the debugged process, ...)\n" 1081"can only be accepted if the thread is VgTs_Runnable or VgTs_Yielding state\n" 1082"Thread status is %s\n", 1083 find_register_by_number (regno)->name, regno, 1084 VG_(name_of_ThreadStatus)(tst->status)); 1085 if (VG_(clo_verbosity) > 1) 1086 VG_(umsg) ("%s\n", own_buf); 1087 } 1088 break; 1089 } 1090 case 'm': 1091 decode_m_packet (&own_buf[1], &mem_addr, &len); 1092 if (valgrind_read_memory (mem_addr, mem_buf, len) == 0) 1093 convert_int_to_ascii (mem_buf, own_buf, len); 1094 else 1095 write_enn (own_buf); 1096 break; 1097 case 'M': 1098 decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); 1099 if (valgrind_write_memory (mem_addr, mem_buf, len) == 0) 1100 write_ok (own_buf); 1101 else 1102 write_enn (own_buf); 1103 break; 1104 case 'X': 1105 if (decode_X_packet (&own_buf[1], packet_len - 1, 1106 &mem_addr, &len, mem_buf) < 0 1107 || valgrind_write_memory (mem_addr, mem_buf, len) != 0) 1108 write_enn (own_buf); 1109 else 1110 write_ok (own_buf); 1111 break; 1112 case 'C': 1113 convert_ascii_to_int (own_buf + 1, &sig, 1); 1114 if (target_signal_to_host_p (sig)) 1115 zignal = target_signal_to_host (sig); 1116 else 1117 zignal = 0; 1118 set_desired_inferior (0); 1119 myresume (0, zignal); 1120 return; // return control to valgrind 1121 case 'S': 1122 convert_ascii_to_int (own_buf + 1, &sig, 1); 1123 if (target_signal_to_host_p (sig)) 1124 zignal = target_signal_to_host (sig); 1125 else 1126 zignal = 0; 1127 set_desired_inferior (0); 1128 myresume (1, zignal); 1129 return; // return control to valgrind 1130 case 'c': 1131 set_desired_inferior (0); 1132 myresume (0, 0); 1133 return; // return control to valgrind 1134 case 's': 1135 set_desired_inferior (0); 1136 myresume (1, 0); 1137 return; // return control to valgrind 1138 case 'Z': { 1139 char *lenptr; 1140 char *dataptr; 1141 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); 1142 int zlen = strtol (lenptr + 1, &dataptr, 16); 1143 char type = own_buf[1]; 1144 1145 if (type < '0' || type > '4') { 1146 /* Watchpoint command type unrecognized. */ 1147 own_buf[0] = '\0'; 1148 } else { 1149 int res; 1150 1151 res = valgrind_insert_watchpoint (type, addr, zlen); 1152 if (res == 0) 1153 write_ok (own_buf); 1154 else if (res == 1) 1155 /* Unsupported. */ 1156 own_buf[0] = '\0'; 1157 else 1158 write_enn (own_buf); 1159 } 1160 break; 1161 } 1162 case 'z': { 1163 char *lenptr; 1164 char *dataptr; 1165 CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); 1166 int zlen = strtol (lenptr + 1, &dataptr, 16); 1167 char type = own_buf[1]; 1168 1169 if (type < '0' || type > '4') { 1170 /* Watchpoint command type unrecognized. */ 1171 own_buf[0] = '\0'; 1172 } else { 1173 int res; 1174 1175 res = valgrind_remove_watchpoint (type, addr, zlen); 1176 if (res == 0) 1177 write_ok (own_buf); 1178 else if (res == 1) 1179 /* Unsupported. */ 1180 own_buf[0] = '\0'; 1181 else 1182 write_enn (own_buf); 1183 } 1184 break; 1185 } 1186 case 'k': 1187 kill_request("Gdb request to kill this process\n"); 1188 break; 1189 case 'T': { 1190 unsigned long gdb_id, thread_id; 1191 1192 gdb_id = strtoul (&own_buf[1], NULL, 16); 1193 thread_id = gdb_id_to_thread_id (gdb_id); 1194 if (thread_id == 0) { 1195 write_enn (own_buf); 1196 break; 1197 } 1198 1199 if (valgrind_thread_alive (thread_id)) 1200 write_ok (own_buf); 1201 else 1202 write_enn (own_buf); 1203 break; 1204 } 1205 case 'R': 1206 /* Restarting the inferior is only supported in the 1207 extended protocol. 1208 => It is a request we don't understand. Respond with an 1209 empty packet so that gdb knows that we don't support this 1210 request. */ 1211 own_buf[0] = '\0'; 1212 break; 1213 case 'v': 1214 /* Extended (long) request. */ 1215 handle_v_requests (own_buf, &status, &zignal); 1216 break; 1217 default: 1218 /* It is a request we don't understand. Respond with an 1219 empty packet so that gdb knows that we don't support this 1220 request. */ 1221 own_buf[0] = '\0'; 1222 break; 1223 } 1224 1225 if (new_packet_len != -1) 1226 putpkt_binary (own_buf, new_packet_len); 1227 else 1228 putpkt (own_buf); 1229 1230 if (status == 'W') 1231 VG_(umsg) ("\nChild exited with status %d\n", zignal); 1232 if (status == 'X') 1233 VG_(umsg) ("\nChild terminated with signal = 0x%x (%s)\n", 1234 target_signal_to_host (zignal), 1235 target_signal_to_name (zignal)); 1236 if (status == 'W' || status == 'X') { 1237 VG_(umsg) ("Process exiting\n"); 1238 VG_(exit) (0); 1239 } 1240 } 1241 1242 /* We come here when getpkt fails => close the connection, 1243 and re-open. Then return control to valgrind. 1244 We return the control to valgrind as we assume that 1245 the connection was closed due to vgdb having finished 1246 to execute a command. */ 1247 if (VG_(clo_verbosity) > 1) 1248 VG_(umsg) ("Remote side has terminated connection. " 1249 "GDBserver will reopen the connection.\n"); 1250 remote_finish (reset_after_error); 1251 remote_open (VG_(clo_vgdb_prefix)); 1252 myresume (0, 0); 1253 resume_reply_packet_needed = False; 1254 return; 1255} 1256