[Crash-utility] Re: [PATCH v1 2/5] Call cmd_bt silently after "set pid"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Lianbo,

Thanks for the patch review!

On Sun, Jan 26, 2025 at 8:02 PM lijiang <lijiang@xxxxxxxxxx> wrote:
>
> Hi, Tao and Alex
> Thank you for working on this.
>
> On Fri, Jan 3, 2025 at 1:54 PM <devel-request@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
>>
>> Date: Fri,  3 Jan 2025 18:48:14 +1300
>> From: Tao Liu <ltao@xxxxxxxxxx>
>> Subject:  [PATCH v1 2/5] Call cmd_bt silently after
>>         "set pid"
>> To: devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>> Cc: alexey.makhalov@xxxxxxxxxxxx
>> Message-ID: <20250103054817.364053-3-ltao@xxxxxxxxxx>
>> Content-Type: text/plain; charset="US-ASCII"; x-default=true
>>
>> Cmd bt will list multi-stacks of one task. After we "set <pid>" switch
>> context to one task, we first need a bt call to detect the multi-stacks,
>> however we don't want any console output from it, so a nullfp is used for
>> output receive. The silent bt call is only triggered once as part of task
>> context switch by cmd set.
>>
>> A array of user_regs pointers is reserved for each supported arch. If one
>> extra stack found, a user_regs structure will be allocated for storing regs
>> value of the stack.
>>
>> Co-developed-by: Alexey Makhalov <alexey.makhalov@xxxxxxxxxxxx>
>> Co-developed-by: Tao Liu <ltao@xxxxxxxxxx>
>> Signed-off-by: Tao Liu <ltao@xxxxxxxxxx>
>> ---
>>  arm64.c        |  4 ++++
>>  crash_target.c |  5 +++++
>>  gdb-10.2.patch |  2 +-
>>  kernel.c       | 20 ++++++++++++++++++++
>>  ppc64.c        |  4 ++++
>>  x86_64.c       |  3 +++
>>  6 files changed, 37 insertions(+), 1 deletion(-)
>>
>> diff --git a/arm64.c b/arm64.c
>> index 1cdde5f..8291301 100644
>> --- a/arm64.c
>> +++ b/arm64.c
>> @@ -126,6 +126,10 @@ struct user_regs_bitmap_struct {
>>         ulong bitmap[32];
>>  };
>>
>
> I have no more comments about the patchset, only two things:
> [1]  This was defined in various architectures such as X86 64, aarch64 and ppc64, can it be defined in a common file and included with define macros such as "#if defined(X86_64) || defined(ARM64) || defined(PPC64)"?

OK, will give this a try.

>
>> +#define MAX_EXCEPTION_STACKS 7
>> +ulong extra_stacks_idx = 0;
>> +struct user_regs_bitmap_struct *extra_stacks_regs[MAX_EXCEPTION_STACKS] = {0};
>> +
>
>
> And also add code comments to say why it(max exception stacks) is 7.
>
There is no reason for 7. Previously there has been a
MAX_EXCEPTION_STACKS for x86_64, so I take this for x86_64 multi-stack
support directly, and ported the code to arm64/ppc64 as well, so the
MAX_EXCEPTION_STACKS was there too. Frankly I have no idea the maximum
stacks a process may have, personally I think 3~4 is enough, e.g:
process stack/irq stack/exception stack. The max stacks I encountered
during coding is 3. So I think 7 is good enough for this on different
archs.

> [2] build warning
> cc -c -g -DX86_64 -DLZO -DGDB_10_2  kernel.c -I./gdb-10.2/bfd -I./gdb-10.2/include -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector -Wformat-security
> kernel.c:12009:6: warning: no previous prototype for ‘silent_call_bt’ [-Wmissing-prototypes]
> 12009 | void silent_call_bt(void)
>       |      ^~~~~~~~~~~~~~
>
Will get this fixed in v2.

>
>>  static inline bool is_mte_kvaddr(ulong addr)
>>  {
>>         /* check for ARM64_MTE enabled */
>> diff --git a/crash_target.c b/crash_target.c
>> index c5ad1df..8cfa744 100644
>> --- a/crash_target.c
>> +++ b/crash_target.c
>> @@ -31,6 +31,9 @@ extern "C" int crash_get_current_task_reg (int regno, const char *regname,
>>  extern "C" int gdb_change_thread_context (void);
>>  extern "C" int gdb_add_substack (int);
>>  extern "C" void crash_get_current_task_info(unsigned long *pid, char **comm);
>> +#if defined (TARGET_X86_64) || defined (TARGET_ARM64) || defined (TARGET_PPC64)
>> +extern "C" void silent_call_bt(void);
>> +#endif
>>
>>  /* The crash target.  */
>>
>> @@ -164,6 +165,10 @@ gdb_change_thread_context (void)
>>    /* 3rd, refresh regcache for tid 0 */
>>    target_fetch_registers(get_current_regcache(), -1);
>>    reinit_frame_cache();
>> +#if defined (TARGET_X86_64) || defined (TARGET_ARM64) || defined (TARGET_PPC64)
>> +  /* 4th, invoke bt silently to refresh the additional stacks */
>> +  silent_call_bt();
>
>
> This looks tricky, but I have no idea for the time being, maybe we can improve it in the future.
>
Thanks! Please note this patchset will have conflict on the "x86_64:
Fix 'bt -S/-I' segfault issue" one, please merge the latter one first.
I will update this patchset accordingly in v2.

Thanks,
Tao Liu

Tao Liu

> Other changes are fine to me.
>
> Thanks
> Lianbo
>
>> +#endif
>>    return TRUE;
>>  }
>>
>> diff --git a/gdb-10.2.patch b/gdb-10.2.patch
>> index c867660..7baa925 100644
>> --- a/gdb-10.2.patch
>> +++ b/gdb-10.2.patch
>> @@ -55,7 +55,7 @@ exit 0
>>   # your system doesn't have fcntl.h in /usr/include (which is where it
>>   # should be according to Posix).
>>  -DEFS = @DEFS@
>> -+DEFS = -DCRASH_MERGE @DEFS@
>> ++DEFS = -DCRASH_MERGE -DTARGET_${CRASH_TARGET} @DEFS@
>>   GDB_CFLAGS = -I. -I$(srcdir) -I$(srcdir)/config \
>>         -DLOCALEDIR="\"$(localedir)\"" $(DEFS)
>>
>> diff --git a/kernel.c b/kernel.c
>> index 8c2e0ca..1c8f500 100644
>> --- a/kernel.c
>> +++ b/kernel.c
>> @@ -12001,3 +12001,23 @@ int get_linux_banner_from_vmlinux(char *buf, size_t size)
>>
>>         return TRUE;
>>  }
>> +
>> +#if defined(X86_64) || defined(ARM64) || defined(PPC64)
>> +extern ulong extra_stacks_idx;
>> +extern void *extra_stacks_regs[];
>> +void silent_call_bt(void)
>> +{
>> +       FILE *fp_save = fp;
>> +       fp = pc->nullfp;
>> +
>> +       for (int i = 0; i < extra_stacks_idx; i++) {
>> +               FREEBUF(extra_stacks_regs[i]);
>> +               extra_stacks_regs[i] = NULL;
>> +       }
>> +       sprintf(pc->command_line, "bt\n");
>> +       argcnt = parse_line(pc->command_line, args);
>> +       optind = 1;
>> +       cmd_bt();
>> +       fp = fp_save;
>> +}
>> +#endif
>> \ No newline at end of file
>> diff --git a/ppc64.c b/ppc64.c
>> index 7ac12fe..532eb3f 100644
>> --- a/ppc64.c
>> +++ b/ppc64.c
>> @@ -80,6 +80,10 @@ struct user_regs_bitmap_struct {
>>         ulong bitmap[32];
>>  };
>>
>> +#define MAX_EXCEPTION_STACKS 7
>> +ulong extra_stacks_idx = 0;
>> +struct user_regs_bitmap_struct *extra_stacks_regs[MAX_EXCEPTION_STACKS] = {0};
>> +
>>  static int is_opal_context(ulong sp, ulong nip)
>>  {
>>         uint64_t opal_start, opal_end;
>> diff --git a/x86_64.c b/x86_64.c
>> index 53ae3ef..e544be8 100644
>> --- a/x86_64.c
>> +++ b/x86_64.c
>> @@ -160,6 +160,9 @@ struct user_regs_bitmap_struct {
>>         ulong bitmap[32];
>>  };
>>
>> +ulong extra_stacks_idx = 0;
>> +struct user_regs_bitmap_struct *extra_stacks_regs[MAX_EXCEPTION_STACKS] = {0};
>> +
>>  /*
>>   *  Do all necessary machine-specific setup here.  This is called several
>>   *  times during initialization.
>> --
>> 2.47.0
>
> --
> Crash-utility mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx
> To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxxxxxx
> https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki
--
Crash-utility mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxxxxxx
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux