mirror of
https://github.com/mii443/qemu.git
synced 2025-12-07 13:08:31 +00:00
gdbstub: Add support for info proc mappings
Currently the GDB's generate-core-file command doesn't work well with
qemu-user: the resulting dumps are huge [1] and at the same time
incomplete (argv and envp are missing). The reason is that GDB has no
access to proc mappings and therefore has to fall back to using
heuristics for discovering them. This is, in turn, because qemu-user
does not implement the Host I/O feature of the GDB Remote Serial
Protocol.
Implement vFile:{open,close,pread,readlink} and also
qXfer:exec-file:read+. With that, generate-core-file begins to work on
aarch64 and s390x.
[1] https://sourceware.org/pipermail/gdb-patches/2023-May/199432.html
Co-developed-by: Dominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-Id: <20230621203627.1808446-7-iii@linux.ibm.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20230630180423.558337-37-alex.bennee@linaro.org>
This commit is contained in:
committed by
Alex Bennée
parent
dc14a7a6e9
commit
e282010b2e
@@ -1327,6 +1327,36 @@ static const GdbCmdParseEntry gdb_v_commands_table[] = {
|
||||
.cmd = "Kill;",
|
||||
.cmd_startswith = 1
|
||||
},
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
/*
|
||||
* Host I/O Packets. See [1] for details.
|
||||
* [1] https://sourceware.org/gdb/onlinedocs/gdb/Host-I_002fO-Packets.html
|
||||
*/
|
||||
{
|
||||
.handler = gdb_handle_v_file_open,
|
||||
.cmd = "File:open:",
|
||||
.cmd_startswith = 1,
|
||||
.schema = "s,L,L0"
|
||||
},
|
||||
{
|
||||
.handler = gdb_handle_v_file_close,
|
||||
.cmd = "File:close:",
|
||||
.cmd_startswith = 1,
|
||||
.schema = "l0"
|
||||
},
|
||||
{
|
||||
.handler = gdb_handle_v_file_pread,
|
||||
.cmd = "File:pread:",
|
||||
.cmd_startswith = 1,
|
||||
.schema = "l,L,L0"
|
||||
},
|
||||
{
|
||||
.handler = gdb_handle_v_file_readlink,
|
||||
.cmd = "File:readlink:",
|
||||
.cmd_startswith = 1,
|
||||
.schema = "s0"
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static void handle_v_commands(GArray *params, void *user_ctx)
|
||||
@@ -1472,11 +1502,14 @@ static void handle_query_supported(GArray *params, void *user_ctx)
|
||||
";ReverseStep+;ReverseContinue+");
|
||||
}
|
||||
|
||||
#if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX)
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
#if defined(CONFIG_LINUX)
|
||||
if (gdbserver_state.c_cpu->opaque) {
|
||||
g_string_append(gdbserver_state.str_buf, ";qXfer:auxv:read+");
|
||||
}
|
||||
#endif
|
||||
g_string_append(gdbserver_state.str_buf, ";qXfer:exec-file:read+");
|
||||
#endif
|
||||
|
||||
if (params->len &&
|
||||
strstr(get_param(params, 0)->data, "multiprocess+")) {
|
||||
@@ -1615,13 +1648,21 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = {
|
||||
.cmd_startswith = 1,
|
||||
.schema = "s:l,l0"
|
||||
},
|
||||
#if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX)
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
#if defined(CONFIG_LINUX)
|
||||
{
|
||||
.handler = gdb_handle_query_xfer_auxv,
|
||||
.cmd = "Xfer:auxv:read::",
|
||||
.cmd_startswith = 1,
|
||||
.schema = "l,l0"
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.handler = gdb_handle_query_xfer_exec_file,
|
||||
.cmd = "Xfer:exec-file:read:",
|
||||
.cmd_startswith = 1,
|
||||
.schema = "l:l,l0"
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.handler = gdb_handle_query_attached,
|
||||
|
||||
Reference in New Issue
Block a user