> On Apr 24, 2018, at 5:58 PM, Jim Ingham <jing...@apple.com> wrote:
> 
> 
> 
>> On Apr 24, 2018, at 5:24 PM, Александр Поляков <polyakov....@gmail.com> 
>> wrote:
>> 
>> Thanks Jim, it helped me a lot.
>> 
>> Can we do something like this: 
>>   1) having empty dummy target;
> 
> Yes, you don't need to do anything here.  The Debugger object always makes a 
> dummy target.
> 
>>   2) setting breakpoints to this dummy target until getting real file 
>> through -file-exec-and-symbols;
> 
> Right, the Debugger has an API: GetDummyTarget that will get this for you, 
> and then you call GetDummyTarget().BreakpointCreate...

It looks like all you will need to do is modify the existing 
CMICmnLLDBDebugSessionInfo::GetTarget() function from:

lldb::SBTarget CMICmnLLDBDebugSessionInfo::GetTarget() const {
  return GetDebugger().GetSelectedTarget();
}

to:

lldb::SBTarget CMICmnLLDBDebugSessionInfo::GetTarget() const {
  auto target = GetDebugger().GetSelectedTarget();
  if (target.IsValid())
    return target;
  return GetDebugger().GetDummyTarget();
}

> 
>>   3) creating new target and moving all breakpoints from dummy target to it;
> 
> The move will happen automatically.

Yes, nothing to do here unless we do anything other than setting breakpoints 
and stop hooks. I don't believe MI does any stop hook stuff, so the only thing 
we should be doing to a dummy target is setting breakpoints otherwise we will 
lose any actions we take on the dummy target.

> 
>>   4) clearing all breakpoints from the dummy target;
> 
> This seems reasonable.  Note however that you might inherit some breakpoints 
> without seeing MI commands to do so - for instance from the user's .lldbinit 
> file - and you probably want to propagate them every time you get a new 
> -file-exec-and-symbols.  So you should keep track of the breakpoints that 
> were in the dummy target when you got started, and only delete the ones you 
> made after that.
> 
>>   5) back to 1);
>> 
> 
> Jim
> 
>> 
>> 
>> 
>> 
>> 
>> Regards,
>> Alexander Polyakov
>> 
>> 2018-04-25 2:56 GMT+03:00 Jim Ingham <jing...@apple.com>:
>> In lldb, one Debugger can debug multiple different processes at a time.  
>> This is one of the ways lldb differs from gdb (*)...  In lldb, the Target is 
>> the entity that represents a thing that you could debug.  A Target might or 
>> might not actually be debugging anything.  If it is, the Target will have a 
>> Process.  You generally make a target by giving it a file and maybe an 
>> architecture.  Note the "file" command in lldb is just an alias for "target 
>> create".  It makes a target out of a file.  Then when you want to debug that 
>> file, you would say Target::Launch.
>> 
>> But a Target need not have a file.  For instance, if you do:
>> 
>> $ lldb --pid 12345
>> 
>> lldb has to make an empty target, attach it to the process with pid 12345, 
>> and only then will it actually know what the file is.
>> 
>> Note also, in both lldb and gdb, you can set breakpoints in the 
>> .lldbinit/.gdbinit file.  But both these init files get read in BEFORE any 
>> of the command line arguments (including the one with the file command) get 
>> processed.
>> 
>> So there has to be a way to hold onto breakpoints before any target is 
>> created.  This was simple in gdb since it only supports one target, so you 
>> can just stuff the breakpoints into the global list of breakpoint you were 
>> going to use.  But you can't do that in lldb, because we could have many 
>> targets. That's what the lldb "dummy target" is for.  It holds onto 
>> breakpoints that are made in the absence of any target, and then each time a 
>> new target gets made, it gets seeded with breakpoints from the dummy target.
>> 
>> Greg was worried that you could do:
>> 
>> -break-set
>> -file-exec-and-symbols
>> 
>> and he wanted to make sure that works.  I think that's what you understood 
>> as well.  
>> 
>> Since the gdb-mi interface models the way gdb works, it really only supports 
>> having one target.  So I was suggesting that the lldb-mi module keep track 
>> of this one privileged Target, and to make sure that -break-set sets 
>> breakpoints in the dummy target if that privileged Target is still empty.
>> 
>> Jim
>> 
>> (*) one lldb process can also support multiple Debuggers, but that's another 
>> story...
>> 
>> Jim
>> 
>> 
>> 
>>> On Apr 24, 2018, at 4:41 PM, Александр Поляков <polyakov....@gmail.com> 
>>> wrote:
>>> 
>>> I don't completely understand how it possible to add breakpoint before 
>>> choosing a file(did you mean -file-exec-and-symbols cmd?).
>>> And another important thing: could you explain me what is target in terms 
>>> of lldb?
>>> 
>>> Thanks in advance.
>>> 
>>> Regards,
>>> Alexander Polyakov
>>> 
>>> 2018-04-25 1:32 GMT+03:00 Ted Woodward <ted.woodw...@codeaurora.org>:
>>> 
>>> You'll still need HandleCommand for pass through commands. lldb commands 
>>> send to lldb-mi are handled normally, so something like "file a.out" would 
>>> set up a target using a.out. "-interpreter exec console <cmd>" does the 
>>> same thing. Other than that, I'm all for cleaning up lldb-mi. There were 
>>> some funky decisions made when it was first developed.
>>> 
>>> Ted
>>> 
>>> --
>>> Qualcomm Innovation Center, Inc.
>>> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
>>> Linux Foundation Collaborative Project
>>> 
>>>> -----Original Message-----
>>>> From: lldb-dev [mailto:lldb-dev-boun...@lists.llvm.org] On Behalf Of Jim
>>>> Ingham via lldb-dev
>>>> Sent: Tuesday, April 24, 2018 5:19 PM
>>>> To: Greg Clayton <clayb...@gmail.com>
>>>> Cc: LLDB <lldb-dev@lists.llvm.org>
>>>> Subject: Re: [lldb-dev] Welcome Alexander!
>>>> 
>>>> 
>>>> 
>>>>> On Apr 24, 2018, at 3:08 PM, Greg Clayton <clayb...@gmail.com> wrote:
>>>>> 
>>>>> 
>>>>> 
>>>>>> On Apr 24, 2018, at 3:00 PM, Jim Ingham <jing...@apple.com> wrote:
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Apr 24, 2018, at 2:46 PM, Greg Clayton <clayb...@gmail.com> wrote:
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> On Apr 24, 2018, at 2:35 PM, Jim Ingham <jing...@apple.com> wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On Apr 24, 2018, at 9:44 AM, Greg Clayton <clayb...@gmail.com>
>>>> wrote:
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> On Apr 24, 2018, at 9:37 AM, Jim Ingham <jing...@apple.com>
>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> On Apr 24, 2018, at 7:43 AM, Greg Clayton via lldb-dev <lldb-
>>>> d...@lists.llvm.org> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> Welcome Alexander!
>>>>>>>>>> 
>>>>>>>>>> Yes, welcome!
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> The title might be more stated as "Reimplement lldb-mi to correctly
>>>> use the SB API instead of using HandleCommand and regular expressions to
>>>> parse the command results" as it is already using the SB API, just not 
>>>> using it
>>>> anywhere close to correctly!
>>>>>>>>>>> 
>>>>>>>>>>> I look forward to seeing the changes.
>>>>>>>>>>> 
>>>>>>>>>>> A few things I ran into when playing with lldb-mi:
>>>>>>>>>>> - file-exec or exec-file packet might come _after_ some breakpoints
>>>> are set. We should make sure we create a lldb::SBTarget right away and set 
>>>> the
>>>> breakpoints on the empty target so that we don't miss these breakpoints if 
>>>> this
>>>> is still an issue. Then the when we receive the exec-file packet, we set 
>>>> the file
>>>> on the target
>>>>>>>>>> 
>>>>>>>>>> Breakpoints set before any target is created are set on the dummy
>>>> target.  Breakpoints on the dummy target are copied into any new targets.  
>>>> So
>>>> this should not be necessary.  If that wasn't working we should figure 
>>>> that out,
>>>> but it's not the responsibility of the MI to get this right.
>>>>>>>>> 
>>>>>>>>> We are trying not to use the command line and the command line is
>>>> what uses the dummy target automatically. When using the SB API you use a
>>>> lldb::SBTarget to set the breakpoint on so you need a target. What do you
>>>> suggest we use for the target? I would rather the lldb-mi code not rely on 
>>>> the
>>>> currently selected target or the dummy target.
>>>>>>>> 
>>>>>>>> lldb-MI models gdb's behavior, which is one debugger with one target.
>>>> There is no command to add or switch to targets, etc.  So it doesn't seem
>>>> unreasonable for MI to keep track of its one actual target and if that is 
>>>> empty,
>>>> use SBDebugger::GetDummyTarget.  The other option is to make a blank target
>>>> up front and then add files to it when you see the -file-exec command. But 
>>>> that
>>>> seems more error-prone than using the mechanism lldb provides for doing
>>>> things before you have a target.  Again, if we were modeling an API that 
>>>> could
>>>> switch targets we might want to do something more clever.  But that isn't 
>>>> how
>>>> the GDB-MI was set up to work.
>>>>>>>> 
>>>>>>> 
>>>>>>> lldb-mi code may or may not have a target when it needs one. If it 
>>>>>>> doesn't
>>>> have a target, use the SB API to get the dummy target and use that.
>>>>>>> 
>>>>>>> Jim: is the dummy target good for anything other than adding breakpoints
>>>> to? What all gets copied from a the dummy target to the new target when one
>>>> gets created?
>>>>>> 
>>>>>> At present it only does breakpoints and stop hooks (see
>>>> Target::PrimeFromDummyTarget.)  I didn't do watchpoints since those are
>>>> seldom things you want to set generically, but you could probably add that.
>>>> Was there anything else you were thinking of?
>>>>>> 
>>>>> 
>>>>> No, just mostly trying to let Alexander know what he should use the Dummy
>>>> target for and also for my own knowledge. If there are MI clients that do 
>>>> other
>>>> things, we will need to know if we need to create an empty real target if 
>>>> they
>>>> aren't breakpoints or stop hooks.
>>>> 
>>>> I can't think of any other things you add to a target like this.  The 
>>>> settings get
>>>> inherited, and once you've started adding modules, I think you should 
>>>> create a
>>>> new target to hold them.  But for anything interesting that's missing, as 
>>>> long as
>>>> they are copiable it would be easy to add them.  Just call
>>>> GetSelectedOrDummyTarget when you go to set them, and then put the copy in
>>>> PrimeFromDummyTarget.
>>>> 
>>>>> 
>>>>> Greg
>>>>> 
>>>>>> Jim
>>>>>> 
>>>>>>> 
>>>>>>> Alexander, feel free to ask questions if you didn't understand any of 
>>>>>>> the
>>>> above information.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> Jim
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> - remove all uses of HandleCommand and use SB APIs where possible
>>>>>>>>>>> - Add any SB API that might be missing and require us to use
>>>> HandleCommand
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> The rest of these seem good guidelines.
>>>>>>>>>> 
>>>>>>>>>> Jim
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> Good luck and let us know if you have any questions,
>>>>>>>>>>> 
>>>>>>>>>>> Greg Clayton
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On Apr 23, 2018, at 3:19 PM, Adrian Prantl via lldb-dev <lldb-
>>>> d...@lists.llvm.org> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Please join me in welcoming Alexander Polyakov, who will be
>>>> working on cleaning up and completing LLDB's lldb-mi fronted as part of his
>>>> Google Summer Of Code project:
>>>>>>>>>>>> 
>>>>>>>>>>>> Reimplement lldb-mi on top of the LLDB public SB API
>>>>>>>>>>>> 
>>>> https://summerofcode.withgoogle.com/projects/#5427847301169152
>>>>>>>>>>>> 
>>>>>>>>>>>> -- adrian
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> 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
>>>> 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