On 04/20/2018 10:46 AM, Rajendra SY wrote: > > > Problem: > GDB "attach pid" command shows error message "Couldn't get registers: > Device busy" because of which below gdb tests fail. > > Cause: > On FreeBSD ptrace() syscall requires LWP id to fetch info from the > inferior process. > The current implementation is every command is executed completely and > then it wait's for asynchronous events. > > When attach command is executed it calls inf_ptrace_attach() function > which is currently doing just the ptrace(PT_ATTACH), it does not wait > for the process to stop to fetch LWP info. > The fbsd_wait() function is the one which fetches LWP info which is > being called after the command completes. > > Command execution code flow - > gdb_do_one_event() => .. => handle_file_event() => .. => > execute_command() => check_frame_language_change() > > The async event handling code flow where LWP info gets updated - > gdb_one_event() => check_async_event_handlers() => .. > ->do_target_wait() => .. => fbsd_wait() > > The check, if the frame language changed via > check_frame_language_change() function is trying to read registers > using ptrace(pid) which fails because LWP id is not fetched. > > The purposed patch tries to avoid this situation by avoiding calling > check_frame_language_change() function just for the "attach" command. > Thanks for the patch, but we need to find a better fix. It seems to me that the problem is that we fail to mark the thread as executing between the initial attach, and the subsequent target_wait. Can you give the attached patch a try? check_frame_language_change() then becomes a nop until the thread is marked not-executing again, after target_wait is called. We don't see the problem on Linux because there, the target_attach implementation waits for the thread to stop before returning. Still, that's supposedly hidden from the core, since the Linux target, like most targets, is a '!to_attach_no_wait' target. Pedro Alves