mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
Introduce an RSP packet, 'x', for reading from the remote server memory in binary format. The binary write packet, 'X' already exists. The 'x' packet is essentially the same as 'm', except that the returned data is in binary format. For transferring relatively large data from the memory of the remote process, the 'x' packet can reduce the transfer costs. For example, without this patch, fetching ~100MB of data from a remote target takes (gdb) dump binary memory temp.o 0x00007f3ba4c576c0 0x00007f3bab709400 2024-03-13 16:17:42.626 - command started 2024-03-13 16:18:24.151 - command finished Command execution time: 32.136785 (cpu), 41.525515 (wall) (gdb) whereas with this patch, we obtain (gdb) dump binary memory temp.o 0x00007fec39fce6c0 0x00007fec40a80400 2024-03-13 16:20:48.609 - command started 2024-03-13 16:21:16.873 - command finished Command execution time: 20.447970 (cpu), 28.264202 (wall) (gdb) We see improvements not only when reading bulk data as above, but also when making a large number of small memory access requests. For example, without this patch: (gdb) pipe x/100000xw $pc | wc -l 2024-03-13 16:04:57.112 - command started 25000 2024-03-13 16:05:10.798 - command finished Command execution time: 9.952364 (cpu), 13.686581 (wall) With this patch: (gdb) pipe x/100000xw $pc | wc -l 2024-03-13 16:06:48.160 - command started 25000 2024-03-13 16:06:57.750 - command finished Command execution time: 6.541425 (cpu), 9.589839 (wall) (gdb) Another example, where we create a core file of a GDB process. (gdb) gcore /tmp/core.1 ... Command execution time: 85.496967 (cpu), 133.224373 (wall) vs. (gdb) gcore /tmp/core.1 ... Command execution time: 48.328885 (cpu), 115.032289 (wall) Regression-tested on X86-64 using the unix (default) and native-extended-gdbserver board files. Reviewed-By: Eli Zaretskii <eliz@gnu.org> Approved-By: Tom Tromey <tom@tromey.com>
81 lines
3.1 KiB
C
81 lines
3.1 KiB
C
/* Remote utility routines for the remote server for GDB.
|
|
Copyright (C) 1993-2024 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GDBSERVER_REMOTE_UTILS_H
|
|
#define GDBSERVER_REMOTE_UTILS_H
|
|
|
|
int gdb_connected (void);
|
|
|
|
#define STDIO_CONNECTION_NAME "stdio"
|
|
int remote_connection_is_stdio (void);
|
|
|
|
ptid_t read_ptid (const char *buf, const char **obuf);
|
|
char *write_ptid (char *buf, ptid_t ptid);
|
|
|
|
int putpkt (char *buf);
|
|
int putpkt_binary (char *buf, int len);
|
|
int putpkt_notif (char *buf);
|
|
int getpkt (char *buf);
|
|
void remote_prepare (const char *name);
|
|
void remote_open (const char *name);
|
|
void remote_close (void);
|
|
void write_ok (char *buf);
|
|
void write_enn (char *buf);
|
|
void initialize_async_io (void);
|
|
void enable_async_io (void);
|
|
void disable_async_io (void);
|
|
void check_remote_input_interrupt_request (void);
|
|
void prepare_resume_reply (char *buf, ptid_t ptid,
|
|
const target_waitstatus &status);
|
|
|
|
const char *decode_address_to_semicolon (CORE_ADDR *addrp, const char *start);
|
|
void decode_address (CORE_ADDR *addrp, const char *start, int len);
|
|
|
|
/* Given an input string FROM, decode MEM_ADDR_PTR, a memory address in hex
|
|
form, and LEN_PTR, a length argument in hex form, from the pattern
|
|
"<MEM_ADDR_PTR>,<LEN_PTR><END_MARKER>", with END_MARKER being an end marker
|
|
character. */
|
|
const char *decode_m_packet_params (const char *from, CORE_ADDR *mem_addr_ptr,
|
|
unsigned int *len_ptr,
|
|
const char end_marker);
|
|
void decode_m_packet (const char *from, CORE_ADDR * mem_addr_ptr,
|
|
unsigned int *len_ptr);
|
|
void decode_M_packet (const char *from, CORE_ADDR * mem_addr_ptr,
|
|
unsigned int *len_ptr, unsigned char **to_p);
|
|
void decode_x_packet (const char *from, CORE_ADDR *mem_addr_ptr,
|
|
unsigned int *len_ptr);
|
|
int decode_X_packet (char *from, int packet_len, CORE_ADDR * mem_addr_ptr,
|
|
unsigned int *len_ptr, unsigned char **to_p);
|
|
int decode_xfer_write (char *buf, int packet_len,
|
|
CORE_ADDR *offset, unsigned int *len,
|
|
unsigned char *data);
|
|
int decode_search_memory_packet (const char *buf, int packet_len,
|
|
CORE_ADDR *start_addrp,
|
|
CORE_ADDR *search_space_lenp,
|
|
gdb_byte *pattern,
|
|
unsigned int *pattern_lenp);
|
|
|
|
void clear_symbol_cache (struct sym_cache **symcache_p);
|
|
int look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb);
|
|
|
|
int relocate_instruction (CORE_ADDR *to, CORE_ADDR oldloc);
|
|
|
|
void monitor_output (const char *msg);
|
|
|
|
#endif /* GDBSERVER_REMOTE_UTILS_H */
|