Hi Tao,
Sorry to be a bother, but the author of this patch changed again.
Maybe while rebasing and editing the patch series, this might have
happened, thanks for sending out this series again though.
Thanks,
Aditya Gupta
On 29/07/24 16:14, Tao Liu wrote:
> Currently for most gdb_interface call, in which a non-null file pointer
> is passed, GDB's output stream is replaced with the passed file pointer
>
> Due to this, 'info threads', which is a gdb passthrough, doesn't print
any
> thread, after support was added to get registers from crash_target:
>
> crash> info threads
> Id Target Id Frame
>
> This empty output of 'info threads' was due to a subtle bug in
> gdb_interface.
>
> After this gdb passthrough is run, 'datatype_info' is called, with file
> pointer set to null_fp (pointing to /dev/null). And after
> 'datatype_info' returns, any output by gdb goes to /dev/null, and hence
> the output is lost.
>
> Fix this by restoring the original output streams, after gdb_interface
> has handled the output
>
> After this patch:
>
> crash> info threads
> Id Target Id Frame
> * 1 2131 bash 0xc000000000051e40 in crash_fadump (regs=0x0,
str=0xc000000002c60510 <buf> "sysrq triggered crash") at
arch/powerpc/kernel/fadump.c:735
>
> Cc: Sourabh Jain <sourabhjain(a)linux.ibm.com>
> Cc: Hari Bathini <hbathini(a)linux.ibm.com>
> Cc: Mahesh J Salgaonkar <mahesh(a)linux.ibm.com>
> Cc: Naveen N. Rao <naveen.n.rao(a)linux.vnet.ibm.com>
> Cc: Lianbo Jiang <lijiang(a)redhat.com>
> Cc: HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab(a)nec.com>
> Cc: Tao Liu <ltao(a)redhat.com>
> Cc: Alexey Makhalov <alexey.makhalov(a)broadcom.com>
> Signed-off-by: Aditya Gupta <adityag(a)linux.ibm.com>
> Signed-off-by: Tao Liu <ltao(a)redhat.com>
> ---
> gdb-10.2.patch | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 53 insertions(+)
>
> diff --git a/gdb-10.2.patch b/gdb-10.2.patch
> index 3694b13..0bed96a 100644
> --- a/gdb-10.2.patch
> +++ b/gdb-10.2.patch
> @@ -16118,3 +16118,56 @@ exit 0
> subclass (SYMBOL_NONE)
> {
> /* We can't use an initializer list for members of a base class, and
> +--- gdb-10.2/gdb/ui-file.h.orig
> ++++ gdb-10.2/gdb/ui-file.h
> +@@ -195,6 +195,7 @@ public:
> +
> + bool can_emit_style_escape () override;
> +
> ++ FILE *get_stream(void);
> + /* Sets the internal stream to FILE, and saves the FILE's file
> + descriptor in M_FD. */
> + void set_stream (FILE *file);
> +--- gdb-10.2/gdb/ui-file.c.orig
> ++++ gdb-10.2/gdb/ui-file.c
> +@@ -161,6 +161,12 @@ stdio_file::~stdio_file ()
> + fclose (m_file);
> + }
> +
> ++FILE*
> ++stdio_file::get_stream(void)
> ++{
> ++ return m_file;
> ++}
> ++
> + void
> + stdio_file::set_stream (FILE *file)
> + {
> +--- gdb-10.2/gdb/symtab.c.orig
> ++++ gdb-10.2/gdb/symtab.c
> +@@ -6964,8 +6964,12 @@ void
> + gdb_command_funnel_1(struct gnu_request *req)
> + {
> + struct symbol *sym;
> ++ FILE *original_stdout_stream = nullptr;
> ++ FILE *original_stderr_stream = nullptr;
> +
> + if (req->command != GNU_VERSION && req->command !=
GNU_USER_PRINT_OPTION) {
> ++ original_stdout_stream = (dynamic_cast< stdio_file *
>gdb_stdout)->get_stream();
> ++ original_stderr_stream = (dynamic_cast< stdio_file *
>gdb_stderr)->get_stream();
> + (dynamic_cast<stdio_file
*>gdb_stdout)->set_stream(req->fp);
> + (dynamic_cast<stdio_file
*>gdb_stderr)->set_stream(req->fp);
> + }
> +@@ -7068,6 +7072,12 @@ gdb_command_funnel_1(struct gnu_request *req)
> + req->flags |= GNU_COMMAND_FAILED;
> + break;
> + }
> ++
> ++ /* Restore the streams gdb output was using */
> ++ if (original_stdout_stream)
> ++ (dynamic_cast<stdio_file
*>gdb_stdout)->set_stream(original_stdout_stream);
> ++ if (original_stderr_stream)
> ++ (dynamic_cast<stdio_file
*>gdb_stderr)->set_stream(original_stderr_stream);
> + }
> +
> + /*