From: Simon Marchi <simark@simark.ca>
To: Kamil Rytarowski <n54@gmx.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Add basic event handling in the NetBSD target
Date: Sun, 26 Apr 2020 17:14:34 -0400 [thread overview]
Message-ID: <e0506d93-4bfc-a38e-19bc-bff19f9dc0fa@simark.ca> (raw)
In-Reply-To: <c177ace7-82db-b108-3d01-e3619d21884a@gmx.com>
On 2020-04-24 6:09 a.m., Kamil Rytarowski wrote:
>> I know that you'll say it's because FreeBSD does it this way, but still it surprised
>> me. If the core of GDB asks to resume one specific thread, it doesn't mean you should
>> suspend the other threads, they should just be left in whatever state they are. Is there
>> a reason to stop the other threads here?
>>
>
> In Linux there can be non-stop mode and threads are managed (stopped,
> started, etc) individually. On NetBSD we can start and stop the whole
> process, regardless of the number of threads in it.
>
> We need to set the state of all threads before PT_CONTINUE (or assume
> unchanged state of them).
>
> If a thread is not expected to be suspended, we shall set its flag to
> resume. The same for single-step (PT_STEP). This approach simplifies the
> implementation as I don't need to track internally which thread has what
> status and merely save a few syscalls.
Ok.
>>> + }
>>> + else
>>> + {
>>> + /* If ptid is a wildcard, resume all matching threads (they won't run
>>> + until the process is continued however). */
>>> + for (thread_info *tp : all_non_exited_threads (this, ptid))
>>> + if (ptrace (PT_RESUME, tp->ptid.pid (), NULL, tp->ptid.lwp ()) == -1)
>>> + perror_with_name (("ptrace"));
>>> + ptid = inferior_ptid;
>>
>> Can you explain this? Ideally the resume method should not rely on inferior_ptid. We
>> are working on reducing the dependencies on this global, in favor of passing the context
>> by parameters. Here, the `ptid` parameter should be enough.
>>
>
> The caller can pass minus_one_ptid, which makes no sense for NetBSD and
> certainly in the multi-target support.
>
> Scenarios, as I can see them on NetBSD:
>
> - passing ptid_t (pid, 0, 0) -> resume the whole process with all the
> threads
> - passing ptid_t (pid, lwp, 0) -> resume pid::lwp with all the other
> threads suspended in pid (`set scheduler-lock')
> - passing ptid_t (-1, ?, ?) -> confusion to me so I try to find any
> fallback
>
> If we can abandon the -1 case, I can drop the inferior_ptid usage. If
> the core no longer passes -1 (it could be), we shall cleanup existing
> code that handles this as it could happen. If a refactoring can happen,
> this shall be followed by addition of gdb_assert(ptid != minus_one_ptid).
Or a 4th one: resume all threads of all processes that this target manages.
I don't know off-hand if the core of GDB today can pass minus_one_ptid. You could
add such an assert, run all your tests, and if everything works, conclude it's not
needed. If the assert is hit, you'll know why.
>>> + /* The common code passes WNOHANG that leads to crashes, overwrite it. */
>>> + pid = waitpid (ptid.pid (), &status, 0);
>>
>> What is crashing exactly?
>>
>
> The core code asks to waitpid() with WNOHANG, receives pid=0 (nobody)
> and crashes.
>
> It's a generic bug that shall be fixed... but it looks like nobody
> really obeys the core and the 3rd argument is overwritten (compare:
> rs6000-nat.c, obsd-nat.c, inf-ptrace.c or Linux...).
>
> I've landed into more similar generic nuances during my effort on GDB,
> that handling events promptly can crash the core and I need to change
> the behavior to emulate other kernels.
>
> It would be better to fix the core, but it is not NetBSD's fault and not
> a blocker for NetBSD support.
>
> If there is interest in fixing it, I can file a bug report
> independently. I don't pledge to work on it myself (at least as long as
> I can merely focus on one kernel support).
Ok, I'm fine with doing this and documenting it somewhere.
Simon
next prev parent reply other threads:[~2020-04-26 21:14 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-17 14:45 Kamil Rytarowski
2020-04-20 10:28 ` Kamil Rytarowski
2020-04-24 1:33 ` Simon Marchi
2020-04-24 10:09 ` Kamil Rytarowski
2020-04-26 21:14 ` Simon Marchi [this message]
2020-04-29 9:12 ` Kamil Rytarowski
2020-04-29 11:08 ` [PATCH v2] " Kamil Rytarowski
2020-04-29 15:44 ` Simon Marchi
2020-04-29 11:47 ` [PATCH v2] Implement the following events: - single step (TRAP_TRACE) - software breakpoint (TRAP_DBREG) - exec() (TRAP_EXEC) - syscall entry/exit (TRAP_SCE / TRAP_SCX) Kamil Rytarowski
2020-04-29 12:07 ` [PATCH v2] Add basic event handling in the NetBSD target Kamil Rytarowski
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=e0506d93-4bfc-a38e-19bc-bff19f9dc0fa@simark.ca \
--to=simark@simark.ca \
--cc=gdb-patches@sourceware.org \
--cc=n54@gmx.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