> On Mar 29, 2018, at 11:07 AM, Jim Ingham <jing...@apple.com> wrote:
> 
> 
> 
>> On Mar 29, 2018, at 10:40 AM, Greg Clayton via lldb-dev 
>> <lldb-dev@lists.llvm.org> wrote:
>> 
>> 
>> 
>>> On Mar 29, 2018, at 10:36 AM, Frédéric Riss <fr...@apple.com> wrote:
>>> 
>>> 
>>> 
>>>> On Mar 29, 2018, at 9:27 AM, Greg Clayton <clayb...@gmail.com> wrote:
>>>> 
>>>> 
>>>> 
>>>>> On Mar 29, 2018, at 9:10 AM, Frédéric Riss <fr...@apple.com> wrote:
>>>>> 
>>>>> 
>>>>> 
>>>>>> On Mar 29, 2018, at 7:32 AM, Greg Clayton via lldb-dev 
>>>>>> <lldb-dev@lists.llvm.org> wrote:
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Mar 29, 2018, at 2:08 AM, Ramana via lldb-dev 
>>>>>>> <lldb-dev@lists.llvm.org> wrote:
>>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> It appears that the lldb-server, as of v5.0, did not implement the GDB 
>>>>>>> RSPs non-stop mode 
>>>>>>> (https://sourceware.org/gdb/onlinedocs/gdb/Remote-Non_002dStop.html#Remote-Non_002dStop).
>>>>>>>  Am I wrong?
>>>>>>> 
>>>>>>> If the support is actually not there, what needs to be changed to 
>>>>>>> enable the same in lldb-server?
>>>>>> 
>>>>>> As Pavel said, adding support into lldb-server will be easy. Adding 
>>>>>> support to LLDB will be harder. One downside of enabling this mode will 
>>>>>> be a performance loss in the GDB remote packet transfer. Why? IIRC this 
>>>>>> mode requires a read thread where one thread is always reading packets 
>>>>>> and putting them into a packet buffer. Threads that want to send a 
>>>>>> packet an get a reply must not send the packet then use a condition 
>>>>>> variable + mutex to wait for the response. This threading overhead 
>>>>>> really slows down the packet transfers. Currently we have a mutex on the 
>>>>>> GDB remote communication where each thread that needs to send a packet 
>>>>>> will take the mutex and then send the packet and wait for the response 
>>>>>> on the same thread. I know the performance differences are large on 
>>>>>> MacOS, not sure how they are on other systems. If you do end up enabling 
>>>>>> this, please run the "process plugin packet speed-test" command which is 
>>>>>> available only when debugging with ProcessGDBRemote. It will send an 
>>>>>> receive various packets of various sizes and report speed statistics 
>>>>>> back to you.
>>>>>>> 
>>>>>>> Also, in lldb at least I see some code relevant to non-stop mode, but 
>>>>>>> is non-stop mode fully implemented in lldb or there is only partial 
>>>>>>> support?
>>>>>> 
>>>>>> Everything in LLDB right now assumes a process centric debugging model 
>>>>>> where when one thread stops all threads are stopped. There will be quite 
>>>>>> a large amount of changes needed for a thread centric model. The biggest 
>>>>>> issue I know about is breakpoints. Any time you need to step over a 
>>>>>> breakpoint, you must stop all threads, disable the breakpoint, single 
>>>>>> step the thread and re-enable the breakpoint, then start all threads 
>>>>>> again. So even the thread centric model would need to start and stop all 
>>>>>> threads many times. 
>>>>> 
>>>>> If we work on this, that’s not the way we should approach breakpoints in 
>>>>> non-stop mode (and it’s not how GDB does it). I’m not sure why Ramana is 
>>>>> interested in it, but I think one of the main motivations to add it to 
>>>>> GDB was systems where stopping all some threads for even a small amount 
>>>>> of time would just break things. You want a way to step over breakpoints 
>>>>> without disrupting the other threads.
>>>>> 
>>>>> Instead of removing the breakpoint, you can just teach the debugger to 
>>>>> execute the code that has been patched in a different context. You can 
>>>>> either move the code someplace else and execute it there or emulate it. 
>>>>> Sometimes you’ll need to patch it if it is PC-relative. IIRC, GDB calls 
>>>>> this displaced stepping. It’s relatively simple and works great.
>>>> 
>>>> This indeed is one of the changes we would need to do for non-stop mode. 
>>>> We have the EmulateInstruction class in LLDB that is designed just for 
>>>> this kind of thing. You can give the emulator function a read/write memory 
>>>> and read/write register callbacks and a baton and it can execute the 
>>>> instruction and read/write memory and regisrters as needed through the 
>>>> context. It would be very easy to have the read register callback know to 
>>>> take the PC of the original instruction and return it if the PC is 
>>>> requested.
>>>> 
>>>> We always got push back in the past about adding full instruction 
>>>> emulation support as Chris Lattner wanted it to exist in LLVM in the 
>>>> tablegen tables, but no one ever got around to doing that part. So we 
>>>> added prologue instruction parsing and any instructions that can modify 
>>>> the PC (for single stepping) to the supported emulated instructions. 
>>>> 
>>>> So yes, emulating instructions without removing them from the code is one 
>>>> of the things required for this feature. Not impossible, just very time 
>>>> consuming to be able to emulate every instruction out of place. I would 
>>>> _love_ to see that go in and would be happy to review patches for anyone 
>>>> wanting to take this on. Though the question still remains: does this 
>>>> happen in LLVM or in LLDB. Emulating instruction in LLVM might provide 
>>>> some great testing that could happen in the LLVM layers.
>>> 
>>> In my porting experience, emulation is actually rarely needed. Of course, 
>>> if LLVM had a readily available emulation library we could just use that, 
>>> but it’s not the case. Most of the time, just copying the instruction to 
>>> some scratch space and executing it there is enough (you potentially need 
>>> to patch offsets if the instruction uses PC-relative addressing).
>>> 
>> 
>> That is true but that involves starting and stopping the thread one time 
>> which can be time consuming. It is easier to do it this way, but the 
>> starting and stopping of a thread is very costly. It would be better to try 
>> and emulate all the instructions we can and then fall back to emulating the 
>> instruction at another address if needed. Of course, you might be able to 
>> emulate the instruction and have a branch that branches to the next real 
>> instruction so we just have to start the process again without having to 
>> stop it. That would be a nice approach.
> 
> The really cool trick would be to insert the breakpoint as a branch to a 
> landing pad we insert.  Then the landing pad could look like:
> 
> if (thread_is_supposed_to_stop_at_breakpoints() && breakpoint_condition())
>  __builtin_trap();
> 
> emulate_instructions_you_needed_to_remove();
> jump_back_to_next_instruction();
> 
> Then we could support some threads that NEVER stop, and also run breakpoint 
> conditions locally which would make them really cheap.  You could even 
> squirrel away some state in the target that told you that a NEVER stop 
> breakpoint hit the breakpoint, so your accounting would still be correct.

Even better if we get IDE support to insert a NOP big enough for a branch for 
each target where the user sets breakpoints if there is a condition on the 
breakpoint so we don't need to execute any instructions out of place.

> 
>> 
>>> Fred
>>> 
>>>>> 
>>>>> I’ve been interested in displaced stepping for different reasons. If we 
>>>>> had that capability, it would become much easier to patch code. I’d love 
>>>>> to use this to have breakpoint conditions injected and evaluated without 
>>>>> round tripping to the debugger when the condition returns false.
>>>> 
>>>> Agreed!
>>>> 
>>>>> 
>>>>> Fred  
>>>>> 
>>>>>> Be sure to speak with myself, Jim Ingham and Pavel in depth before 
>>>>>> undertaking this task as there will be many changes required.
>>>>>> 
>>>>>> Greg 
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> Ramana
>>>>>>> 
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> lldb-dev mailing list
>>>>>>> lldb-dev@lists.llvm.org
>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>>>>> 
>>>>>> _______________________________________________
>>>>>> lldb-dev mailing list
>>>>>> lldb-dev@lists.llvm.org
>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>> 
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev 
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev>
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to