> On Apr 4, 2016, at 11:24 AM, Zachary Turner <ztur...@google.com> wrote: > > It seems like we already have some precedent for conditional command > arguments. For example: > > (lldb) help platform process list > ... > -u <unsigned-integer> ( --uid <unsigned-integer> ) > [POSIX] Find processes that have a matching user ID. > > So on Windows this argument doesn't make sense. Could we make an argument > that is conditional on the *target* rather than the host? Then, for example, > you could have something like this: > > (lldb) help break set > ... > --code <hex-integer> ( --code <hex-integer> ) > [Windows Target] Break when the exception with code <code> is > raised. > > How to plumb this to the ProcessWindows plugin is an open question, but > should be mostly mechanical.
This is like my suggestion of: (lldb) breakpoint set --exception-code 0x40010005 The code can be passed to the current Platform along with the current target: Error Platform::SetExceptionBreakpointWithExceptionCode (lldb_private::Target *target, uint64_t exception_code); The process can be extracted from the target when the breakpoint needs to be resolved. > On Mon, Apr 4, 2016 at 11:17 AM Jim Ingham <jing...@apple.com> wrote: > Interesting. > > For the other windows exceptions, could we do something abstract like: > > (lldb) break set --platform <data> > > (-P for short) to set a "platform breakpoint", where "data" is a string that > the current platform will understand, but the breakpoint machinery doesn't > have to. > > The way breakpoints work internally is that somebody provides a > "BreakpointResolver" subclass which gets called when anything interesting > happens in the program (rerun, shared library load, etc). It's the > BreakpointResolver's job to add locations to the breakpoint, describe itself > and the like. But this is a fairly abstract interface, and it wouldn't be > hard to have a Platform function that got passed "data" and returned a > breakpoint resolver to turn on the watch for these exceptions. > > Then when the breakpoint gets set, the model is Breakpoints have > "BreakpointLocations" which each add one place a stop might occur: a > "BreakpointSite". The division between Sites & Locations is because two > logically different Locations could map to the same physical Site. Then the > Sites are used at the lowest level to map a stop reason back into the > breakpoint(s) that caused it. To date, the only BreakpointSites are PC > based, so the BreakpointList gets asked "is there a site at this PC". But > that all happens in the process plugins, so it wouldn't be hard to map other > stop reasons to particular sites. The lower layers of the process (e.g. > ProcessGDBRemote) figure out which site maps to the stop reason, and makes a > StopInfoBreakpoint with that BreakpointSite. And after that the Site -> > Location -> Breakpoint logic is done w/o much care how the Site actually > works. > > > WRT language exceptions in specific, in lldb you say: > > (lldb) break set -E c++ > > to break on C++ exception throws. You would say: > > (lldb) break set -E c++ -O <OBJECT_NAME> > > to restrict the exception throw to a particular object type, except I haven't > implemented this for anything but Swift errors yet, but it wouldn't be hard > to do that. So regardless of what we do with the other Windows exceptions, > we should implement the language exceptions consistently this way at the > command line level just to keep things consistent. But again, once we're > able to hand out "BreakpointResolverWindowsExceptions" in general, we could > create them on Windows for the C++ ABI as well (another reason you'll > probably want a Windows C++ language runtime since it's the itanium ABI that > does this job on other platforms. The object filtering is mostly runtime ABI > work - to figure out the thrown exception from the throw site. But that's > just some ABI function that the general matching code would call. > > This would be some work, for sure, but I don't think it would be terribly > hard to do. > > Jim > > > > > > On Apr 4, 2016, at 10:46 AM, Zachary Turner <ztur...@google.com> wrote: > > > > Windows works a little differently. Windows has the notion of a Windows > > exception, which the best way I can describe it is like a signal. But it's > > an arbitrary 32-bit value, and there are hundreds, if not thousands of > > different values. here's a few: > > > > 0x40010005 Ctrl+C > > 0x80000003 Breakpoint (e.g. int 3) > > 0x80000004 Single Step > > 0xC0000005 Access violation > > 0xC000001D Illegal Instruction > > 0xC0000095 Integer overflow > > 0xE06D7363 C++ Exception > > > > Note the last one. It's interesting, because it illustrates that on > > Windows, C++ exceptions are just Windows exceptions with a different code. > > And if you were to implement some other programming language such as swift > > on Windows, you would probably even do it the same way, by finding an > > unused exception code and raising it with your language-specific exception > > context. > > > > When any of these happen in the inferior, the debugger gets a notification > > (called a first-chance exception), and the debugger can decide what to do, > > such as break into the debugger, or ignore it and pass it on to the > > application > > > > It's possible this makes more sense as a windows specific debugger command, > > or perhaps a windows specific subcommand of the "break" command that is > > only available if the selected target is windows. > > > > Existing Windows debuggers allow exception breakpoints of this nature > > through a consistent interface, with the ability to drill down into > > different types of exceptions. What I mean is, you can set the debugger to > > stop on all access violations or all C++ exceptions, but you can get more > > advanced for C++ exceptions and set an exception when a specific type is > > thrown (like a std::string, for example). The debugger would implement > > this by installing a 0xE06D7363 exception breakpoint, and ignoring any > > where the type wasn't std::string (by analyzing the context record). > > > > So, there is at least one aspect of this work that shares some behavior > > with how C++ language exceptions might work with clang on non-Windows > > platforms. Being able to say "break when a std::string is thrown" is not > > OS-specific and very useful. > > > > But the other aspect is not, and there's not an obvious way to present a > > consistent interface (e.g. command line command) to the OS-independent > > functionality across platforms, while also presenting a consistent > > interface to the OS specific functionality on Windows. > > > > On Mon, Apr 4, 2016 at 10:23 AM Jim Ingham <jing...@apple.com> wrote: > > The exception breakpoints Greg is talking about are language exceptions > > (C++ throws, Swift Errors and the like.) > > > > I don't know what kind of exception you are talking about here, but at > > least from a command interface standpoint, it would be good to keep alike > > things that actually are alike, but only if they ARE actually alike. > > > > Jim > > > > > On Apr 4, 2016, at 10:07 AM, Greg Clayton <gclay...@apple.com> wrote: > > > > > > You should talk to Jim Ingham on this. We have special exception > > > breakpoints that we did for Swift and you will want to follow the same > > > methodology. I am not sure what the methodology is so I'm CC'ing Jim so > > > can can comment. > > > > > > Greg > > >> On Apr 4, 2016, at 9:52 AM, Zachary Turner via lldb-dev > > >> <lldb-dev@lists.llvm.org> wrote: > > >> > > >> Take a look at ProcessWindowsLive.cpp in Plugins/Process/Windows. > > >> There's a function called ProcessWindowsLive::OnDebugException. If > > >> you're working in a fork and you don't intend to upstream any changes, > > >> you could just modify the default case of the switch statement there to > > >> not return ExceptionResult::SendToApplication. > > >> > > >> If you wanted to upstream something, you'd probably want a way to > > >> specify what types of exceptions to break on. For this you'd need to > > >> implement a new command so that you could do something like "break set > > >> --exception 0xC0000005" and pass that information to the > > >> ProcessWindowsLive plugin somehow, so that it could decide when to break > > >> and when to pass it on to the application for a second chance. > > >> > > >> On Mon, Apr 4, 2016 at 8:26 AM Carlo Kok <c...@remobjects.com> wrote: > > >> > > >> > > >> Op 2016-04-04 om 16:00 schreef Zachary Turner: > > >>> Not possible currently, although it wouldn't be too hard to add. Would > > >>> be a welcome feature if you are interested > > >> > > >> > > >> I'm (obviously?) interested. But wouldn't know where to start. > > >> > > >> -- > > >> Carlo Kok > > >> RemObjects Software > > >> _______________________________________________ > > >> 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