> On Sep 11, 2017, at 4:05 PM, Leonard Mosescu via lldb-commits 
> <lldb-commits@lists.llvm.org> wrote:
> 
> 
> Process already has "Error Process::WillResume()" for this very reason. Just 
> have the Windows mini dump core file plug-in override it. The code in 
> Process::Resume already checks this:
> Status Process::PrivateResume() {
>   Status error(WillResume());
>   // Tell the process it is about to resume before the thread list
>   if (error.Success()) {
>       ...
>     }
>   }
>   return error;
> }
> Problem solved no???
> 
> It would be great, but that also happens too late (by the time 
> PrivateResume() is called the state has been already changed)
> 
> lldb command interruption requires two parts, one is the rollback, and the 
> other is to have someone listening for interruption.  To give an instance 
> that works in lldb today, if you run the "expr" command, while we are in the 
> process of compiling there's no way to interrupt "expr" because clang doesn't 
> listen for interrupts.  But once the expression is running, we're back in the 
> lldb event loop and so we can handle interruption.  And of course if you 
> interrupt an expression while running it knows how to clean up after itself.  
> That wasn't done for interruption primarily, rather "expr" already had to 
> know that to be able to clean up from expressions that crashed or raised 
> signals while running.
> 
> I don't think we need a general "interrupt me anywhere you want" mechanism to 
> support command interruption however.  Most of the time-consuming work in 
> lldb comes in self-contained chunks (reading in symbols from shared 
> libraries, reading in the debug info index tables, etc) or happens while lldb 
> is actually waiting for something to happen (that part already is 
> interruptible at a low level).  We try to do work as lazily as possible, so 
> if the chunk boundaries and the lazy work boundaries line up you won't really 
> need to roll-back at all.   The model where you check for interrupts after 
> each chunk of work is done will I think be responsive enough for user's 
> needs, and also greatly simplify the work to handle interruption.  This is a 
> little more manual, since you have to insert appropriate "yields", but I 
> think will be good enough for our purposes and much easier to make stable.
>  
> @Jim: I think we're thinking along the same lines, something intended for the 
> poor soul who's does something like "target modules dump symtab", rather than 
> the ability to interrupt at any arbitrary point (which as you point out it's 
> not really feasible).

Exactly.  The ^C in the driver is currently wired up to 
SBDebugger::DispatchInputInterrupt().  All that does at present is see if any 
targets under the debugger have running processes, and interrupt them.  That 
could be extended to do more general interrupting.  But I haven't taken any 
time to think of a good strategy for implementing that.
 
Jim


>  
> 
> On Mon, Sep 11, 2017 at 3:43 PM, Greg Clayton via lldb-commits 
> <lldb-commits@lists.llvm.org> wrote:
> 
>> On Sep 11, 2017, at 3:37 PM, Zachary Turner <ztur...@google.com> wrote:
>> 
>> On Mon, Sep 11, 2017 at 3:31 PM Greg Clayton via lldb-commits 
>> <lldb-commits@lists.llvm.org> wrote:
>> I know there are two points of view here so I will give my two cents:
>> 
>> If it comes down to something as easy as "always check for NULL before doing 
>> something", or something that is similar and very easy, I would say just 
>> code around it. Don't "assert(...)" or "llvm_unreachable(...)". Things that 
>> fall into this category: switch statements with defaults that might catch 
>> things, checking var/ivar for NULL, seeing if a collection is empty, bounds 
>> checking things.
>> 
>> One example here is LLDB has its own object file readers for mach-o and ELF. 
>> Mach-o has load commands in the file header and each load command has a 
>> "cmd" uint32_t whose value is an enum. It is followed by a uint32_t "length" 
>> of this data. The LLVM version of the mach-o file parser, a while back 
>> before changes were made, wanted to assert or llvm_unreachable for any load 
>> command that it didn't recognize. This kind of thing can't happen in a 
>> debugger.
>> 
>> Right, but that's user input.  On the other hand, suppose LLDB manually 
>> constructs some IR that it passes to the interpreter.  Since LLDB is in full 
>> control of the IR it generates, it can safely assert that the interpreter 
>> was successful at interpreting it.
> 
> Like when you run an expression, it generated some relocation that the JIT 
> doesn't handle and it crashes??? We ran into this a few times. So I don't 
> agree that anything in the expression stack is not subject to these rules. It 
> is something we should fix and we should not crash. So while unexpected 
> things are harder to handle, I still say we should recover if at all possible 
> and we ran into the relocations stuff not being handles many times over the 
> years. We don't control user input that is in the expression.
> 
> If you are a shared library, you shouldn't crash if you can help it. If you 
> are an executable, do what you want and feel free to crash yourself. We took 
> LLDB out of process in Xcode so we could load unsigned code from Swift 
> nightly builds, and another benefit was it didn't crash Xcode when things 
> went wrong in LLDB. 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to