Hello Tao,
>>
https://github.com/liutgnu/crash-dev/commits/tao-rebase-v4??
This may
>> be better for testing.
>>
>> Sure, I will test that Tao.
> Thanks for your testing!
>
Kindly ping... Any results for your testing?
Thanks for the ping Tao, I had gone on a vacation, Sorry, should have
tested it before going.
Will test today and let you know.
Thanks,
Aditya Gupta
> Thanks,
> Tao Liu
>
>> Thanks,
>> Tao Liu
>>>
>>> Thanks,
>>>
>>> Aditya Gupta
>>>
>>> Thanks,
>>> Tao Liu
>>>
>>> Thanks,
>>> Aditya Gupta
>>>
>>> On 28/04/24 09:32, 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>
>>> 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);
>>> + }
>>> +
>>> + /*