Thanks for your comments, applied with fix:
https://github.com/crash-utility/crash/commit/6642b2729067399696f8f24f29267b3483d895c6

On Fri, Jul 11, 2025 at 3:13 PM lijiang <liji...@redhat.com> wrote:
>
> Hi, Tao
>
> On Wed, Jul 9, 2025 at 1:42 PM <devel-requ...@lists.crash-utility.osci.io> 
> wrote:
>>
>> Date: Tue,  8 Jul 2025 13:26:38 +1200
>> From: Tao Liu <l...@redhat.com>
>> Subject: [Crash-utility] [PATCH] Fix a regression for eppic extension
>>         on gdb-16.2
>> To: devel@lists.crash-utility.osci.io
>> Cc: Tao Liu <l...@redhat.com>
>> Message-ID: <20250708012638.97698-1-l...@redhat.com>
>> Content-Type: text/plain; charset="US-ASCII"; x-default=true
>>
>> There is a regression found when testing eppic extension on gdb-16.2
>> crash:
>>
>>    crash> cgroup
>>    /root/.eppic/cgroup.c : line 99 : Error: undefined variable 'cgroup_roots'
>>
>> The root cause is when doing gdb upgrading, the replacement of
>> gdb_get_datatype() is incorrect:
>>
>> The original gdb-10.2 version:
>>
>>    long value = SYMBOL_VALUE(expr->elts[2].symbol);
>>
>> The incorrect gdb-16.2 replacement:
>>
>>    long value = value_as_long(expr->evaluate());
>>
>> According to gdb/tracepoint.c, the correct gdb-16.2 replacement should be:
>>
>>    symbol *sym;
>>    expr::var_value_operation *vvop
>>      = (gdb::checked_static_cast<expr::var_value_operation *>
>>         (exp->op.get ()));
>>    sym = vvop->get_symbol ();
>>    long value = sym->value_longest ();
>>
>> Otherwise, the value_as_long() will throw an exception when trying to
>> convert a struct into long, such as "cgroup_roots". The reason why this
>> issue only observed on crash extensions, is the faulty code block
>> triggered with "req->tcb", which is a callback for gdb_interface(), and
>> the callback is used by eppic extension, but the normal crash internal calls
>> hardly use it.
>>
>> After:
>>    crash> cgroup
>>    0:/user.slice/user-1000.slice/session-2.scope
>>
>> Signed-off-by: Tao Liu <l...@redhat.com>
>> ---
>>  gdb-16.2.patch | 29 +++++++++++++++++++++++++++++
>>  1 file changed, 29 insertions(+)
>>
>> diff --git a/gdb-16.2.patch b/gdb-16.2.patch
>> index 151e4e2..eb620f7 100644
>> --- a/gdb-16.2.patch
>> +++ b/gdb-16.2.patch
>
>
> Can you help to add the gdb-16.2/gdb/symtab.c to gdb-16.2.patch, and it looks 
> like this:
>
>  # to all subsequent patch applications.
>
>  tar xvzmf gdb-16.2.tar.gz \
> -       gdb-16.2/gdb/symfile.c
> +       gdb-16.2/gdb/symfile.c \
> +       gdb-16.2/gdb/symtab.c
>
>  exit 0
>
> In addition, also please add a prefix "gdb: " to patch title, E.g:
>  gdb:  Fix a regression for eppic extension on gdb-16.2
>
> Other changes are fine to me. So: Ack(with the above change)
>
> Thanks
> Lianbo
>
>>
>> @@ -1952,3 +1952,32 @@ exit 0
>>       }
>>
>>     /* Remember the bfd indexes for the .text, .data, .bss and
>> +--- gdb-16.2/gdb/symtab.c.orig
>> ++++ gdb-16.2/gdb/symtab.c
>> +@@ -7690,7 +7690,11 @@
>> +                         console("expr->first_opcode(): OP_VAR_VALUE\n");
>> +                 type = expr->evaluate_type()->type();
>> +                 if (req->tcb) {
>> +-                        long value = value_as_long(expr->evaluate());
>> ++                      expr::var_value_operation *vvop
>> ++                          = 
>> (gdb::checked_static_cast<expr::var_value_operation *>
>> ++                             (expr->op.get ()));
>> ++                      sym = vvop->get_symbol ();
>> ++                      long value = sym->value_longest ();
>> +                         /* callback with symbol value */
>> +                         req->typecode = TYPE_CODE(type);
>> +                         req->tcb(EOP_VALUE, req, &value, 0, 0, 0);
>> +@@ -7701,8 +7705,12 @@
>> +                                 req->length = type->length();
>> +                         }
>> +                         if (TYPE_CODE(type) == TYPE_CODE_ENUM) {
>> ++                              expr::var_value_operation *vvop
>> ++                                  = 
>> (gdb::checked_static_cast<expr::var_value_operation *>
>> ++                                     (expr->op.get ()));
>> ++                              sym = vvop->get_symbol ();
>> +                                 req->typecode = TYPE_CODE(type);
>> +-                                req->value = 
>> value_as_long(expr->evaluate());
>> ++                                req->value = sym->value_longest ();
>> +                                 req->tagname = (char *)TYPE_TAG_NAME(type);
>> +                                 if (!req->tagname) {
>> +                                         val = expr->evaluate_type();
>> --
>> 2.47.0
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to