Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Guinevere Larsen via Gdb <gdb@sourceware.org>
To: Navin P <navinp0304@gmail.com>, gdb@sourceware.org
Subject: Re: Error record and replay target doesn't support syscall number 435
Date: Mon, 13 May 2024 15:17:05 -0300	[thread overview]
Message-ID: <56759b21-f854-4cd8-84ce-3fd11246e84a@redhat.com> (raw)
In-Reply-To: <CALO2TqL2nyornGqMhSHo8gKKPgK=S-hP+UBBf8q+XvxMoj2BAQ@mail.gmail.com>

Re-adding gdb list, since you mentioned you dropped on accident
On 5/13/24 12:13, Navin P wrote:
> On Mon, May 13, 2024 at 6:40 PM Guinevere Larsen <blarsen@redhat.com> wrote:
>> On 5/13/24 08:06, Navin P wrote:
>>> Hi,
>> Hi! :)
>>> On Fri, May 10, 2024 at 7:29 PM Guinevere Larsen <blarsen@redhat.com> wrote:
>>>> On 5/10/24 05:07, Navin P via Gdb wrote:
>>>>> Hi,
>>>>>         I tried to record a program calling C++ threads and then did a
>>>>> break on main , then record and continue it throws the error message
>>>>> "record and replay target doesn't support syscall number 435" . What
>>>>> should I do to support syscall number 435 ?
>>>> Hi!
>>>>
>>>> I can't answer everything, since I'm not too familiar with syscalls
>>>> specifically, but I'll do my best!
>>>>
>>>> My first road bump with this is that we record that a clone has
>>>> happened, but we can only record the process that GDB is following
>>>> (parent or child, depending on follow-fork-mode). This is
>>>> counter-intuitive to me, since I would have expected the full inferior
>>>> to be replayed.
>>> To get this working you need minimum changes of current_inferior to
>>> for each inferior in all_inferiors() and execute that function for
>>> each inferior.
>>> return values have to be captured in a list. Similarly for each return value
>>> you have to perform the actions in a loop.
>> There is an extra complication, the recording subsystem was added before
>> GDB could handle multiple inferiors, so it works on the assumption that
>> you only need one global history. Meaning if we did record for all
>> inferiors or all processes, the history would be mangled, jumping from
>> one inferior to the next. It is already a problem in handling
>> multi-threaded inferiors, so a proper fix would require having a
>> per-thread history, and possibly some way to serialize the execution.
>>
>> I added the explanation more as a motivator to why I think we should
>> warn the user of the counter-intuitive behavior, at least in the
>> documentation.
>>
>>> It is going to definitely slow down execution by orders of magnitude.
>> Absolutely! I'm almost wondering if we should try to spawn a recording
>> thread per process or thread, to at least make multi-threaded recording
>> not worse. But that is far in the future, unrelated to this change
> static void
> record_full_core_open_1 ()
> {
>    regcache *regcache = get_thread_regcache (inferior_thread ())
>
> In record-full.c we have inferior_thread() which is the current thread,
>   so only 1 thread is recorded ?  That is my observation too.
I am not sure if only thread 1 is recorded, or if it is mixing 
instructions from all threads, but only changing register values for one 
of the threads. You can disassemble thread 1, then reverse-stepi to see 
if the PC changes wildly or if phantom instructions show up.
> If so, what is required to fix it for all threads.
I haven't fully accounted for everything that is required to make record 
work for multi-threaded inferiors. What I know we strictly need to 
either double-check or improve is:
     * If you check gdb/record-full.c:197, you'll see how we store the 
full history. Its a single global variable for everything that is 
recorded. This needs to be turned into a thread specific member.
     * I think the way GDB handles step means multiple threads will all 
be handled by a single record target, in a single thread. This needs to 
be verified, and if I'm right, we need to find a way to serialize the 
threads, so that we can replay thread in the correct order.
     * There's an open bug for gdb not properly handling (at least) 
sigtrap when an inferior is added: 
https://sourceware.org/bugzilla/show_bug.cgi?id=30025. We need to fix 
that if multiple processes are handled like multiple inferiors as you 
mentioned.

Properly handling multi-threaded has been in my backlog for a bit, but I 
have one task for record that's much more important - adding support to 
AVX instructions - and I have limited time for record stuff, unfortunately.
> Here there is only
> one process
> with multiple threads. I expect it to catch the segfault in thread 2
> but it fails
> and goes into an infinite loop.

Instead of a global variable, try using a counter on the while loops, 
and set it to a small value like 3-4. The current slowdown for execution 
is unbelievable (was also a backlogged thing for me).

Also, I don't know if your system doesn't use a libc++ that's very 
optimized, but I can't record the creation of std::thread objects. 
That's because std::thread::_M_start_thread uses memset somewhere, and 
my glibc has the optimized avx512 version of memset, an instruction gdb 
can't disassemble yet. So we can add "supporting newer x86_64 
instructions" to the list of tasks to do if we want to _properly_ 
support multi-threading. And if you want to double check what I 
mentioned above, I'd also recommend not printing, because that's also 
libc++, so likely to be using optimized instructions.

-- 
Cheers,
Guinevere Larsen
She/Her/Hers

>
> #include<thread>
> #include<iostream>
> #include<unistd.h>
> using namespace std;
> bool run=true;
> int i=6;
> int *p=&i,g;
>
> void t1() {
> while(run){
>       g++;
>       if(g>=16)
>            p=nullptr;
>        cout <<"t1 "<<g<<endl;
>    }
> }
>
> void t2(){
> int t=0;
> while(run){
>         g++;
>         t=*p + 5;
>         cout <<"t2 "<<g<<endl;
>    }
> }
>
>
> int main(){
> thread x1{t1},x2{t2};
> sleep(5);
> run=false;
> x1.join();x2.join();
> }
>
>
> Regards,
> Navin
>


      parent reply	other threads:[~2024-05-13 18:17 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-10  8:07 Navin P via Gdb
2024-05-10 13:59 ` Guinevere Larsen via Gdb
2024-05-13 11:06   ` Navin P via Gdb
2024-05-13 13:10     ` Guinevere Larsen via Gdb
     [not found]       ` <CALO2TqL2nyornGqMhSHo8gKKPgK=S-hP+UBBf8q+XvxMoj2BAQ@mail.gmail.com>
2024-05-13 18:17         ` Guinevere Larsen via Gdb [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56759b21-f854-4cd8-84ce-3fd11246e84a@redhat.com \
    --to=gdb@sourceware.org \
    --cc=blarsen@redhat.com \
    --cc=navinp0304@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox