Commit Graph
19 Commits
Author SHA1 Message Date
Rene Gollent d1c9ffed34 Debugger: Cleanup.
Team:
- Remove expression evaluation event / listener hook. This doesn't
  really belong to the Team anyways.

UserInterfaceListener:
- ExpressionEvaluationRequested() now takes an ExpressionInfo object
  rather than the individual subcomponents.

ExpressionEvaluationJob:
- Notification of expression evaluation completion is now handled
  via the info object's listener interface rather than the Team.

Others:
- Adjust all users of expressions to set themselves up as
  ExpressionInfo::Listener subclasses, and consequently add themselves
  to the respective info object when requesting evaluation. This
  significantly simplifies various things, and also ensures that no
  one accidentally gets notified of an expression they didn't actually
  ask for, which could occur with the previous Team-based listener
  interface. Make all other required adjustments for new interface
  usage.

No functional change intended.
2014-11-08 18:42:53 -05:00
Rene Gollent fe47f15fb4 Debugger: ThreadHandler cleanups.
- Ask the architecture for a stack trace directly, as we only
  need the top frame.
- Properly update thread state before we go into condition
  evaluation. Otherwise, other parts of the debugger potentially
  wouldn't notice that we had continued execution in the case
  where the condition evaluates to false, and would indicate a
  program stop at the breakpoint erroneously.
2014-10-30 20:59:52 -04:00
Rene Gollent a5ce4678c0 Debugger: Implement conditional breakpoints.
ThreadHandler:
- When a breakpoint event is hit, we now check if there is an
  associated UserBreakpoint with a condition attached. If so,
  we schedule an evaluation request, and only stop the thread if
  that one evaluates to true (or if evaluation fails in some way).

This implements #9713.
2014-10-30 16:54:33 -04:00
Rene Gollent d44d8207a8 Debugger: Finish handling of missing debug information.
Add a listener interface for LoadImageDebugInfoJob that allows it to request
user assistance based on its current state. Adjust callers to pass in said
listener accordingly.

Implement the aforementioned listener interface in TeamDebugger, and use the
loading state handler roster to find the appropriate handler / handle the request.

This implements most of what's needed for #10138, the main piece still missing
is for the dwarf handler to detect whether the image in question comes from a package,
and if so, to offer to install the corresponding debug information package rather than
locating the file manually, assuming such a package exists.
2014-06-15 11:03:24 -04:00
Rene Gollent ea84db9e2f ThreadHandler: allow an optional stop reason to be passed to...
...HandleThreadDebugged().
2013-07-07 12:55:23 -04:00
Rene Gollent 3c26fbf06b Fix #9854.
The post syscall debug events used for output capture have an
unfortunate side effect: when asked to debug a thread, the thread is
interrupted, which, if currently blocked in a syscall will cause it to
unblock and send a post syscall event indicating such. However, this
will also absorb the debug stop flag that was set by the initial debug
request, and so we won't actually get the separate event indicating
thread debugged.

Consequently, we now set a pending stop request flag on the
corresponding Thread object, and check if it's set when processing
syscall events. If so, we treat such an event as having triggered a
debug stop even though the received event type is not explicitly
B_DEBUGGER_MESSAGE_THREAD_DEBUGGED.
2013-07-04 07:39:42 -04:00
Rene Gollent 93b54e54a4 Add MSG_THREAD_SET_ADDRESS and implement handling. 2013-05-16 22:22:47 -04:00
Rene Gollent 42d73abab9 Add "Run to cursor" context action.
- UserInterfaceListener/TeamDebugger: Extend ThreadActionRequested()
  to allow passing a target address. Adjust TeamDebugger's
  implementation accordingly.

- ThreadHandler: The MSG_THREAD_RUN action can now optionally take an
  address parameter to run until. If this is specified, set a temporary
  breakpoint for said address before resuming execution.

- SourceView: On right click, present a context menu showing possible
  actions for the current line if we're currently in a stopped thread.
  For the moment, this only yields the "Run to cursor" action, but
  more will be added in the future.
2013-05-12 16:03:47 -04:00
Rene Gollent 3f3ade6223 Fix incorrect return value problem in STEP_OUT.
A similar problem to that described in my previous commit afflicted the
step out case as well. We now store the current IP when issuing a step
out, and use that as the function address once execution returns.
2013-05-11 19:08:09 -04:00
Rene Gollent d9d42ec6bf Fix case of incorrect return value detection.
When using step over to step out of a function, we need to use the
address range of the step statement to determine the function which
returned said value, not the current IP, as that has already exited the
function and will consequently be that of the caller, leading to such
returns being attributed to the wrong function, and consequently also
the wrong type.
2013-05-11 18:48:29 -04:00
Rene Gollent 88e692e89f Ignore calls whose purpose is to calculate the GOT address.
- Fixes several false positives where we'd show a return value for the
  current function.
2013-03-29 22:33:51 -04:00
Rene Gollent 47ffc32bc0 Minor refactoring.
- Factor out a _HasExitedFrame() function.
- Reorder how/where return values are added a bit.
2013-03-29 21:11:21 -04:00
Rene Gollent 76ed6d72a5 Refactoring to handle multiple return values.
- Replace use of address + CpuState pair in Thread,
  SpecificImageDebugInfo::CreateStackTrace() with a ReturnValueInfoList.
  Adjust all implementing subclasses and callers accordingly.

- DwarfImageDebugInfo::CreateReturnValue() -> CreateReturnValues().
  Now processes a list of return value information structures rather
  than just a single one. This means we can now handle multiple return
  values in a single statement. This still isn't entirely correct though,
  since, e.g. for functions whose return types fit in a register we need
  to either retrieve them immediately after function return, or store the
  CPU state at that point in time for later use in value retrieval,
  otherwise the return values will all be those of the last called function.
2013-03-27 23:27:49 -04:00
Rene Gollent 029fcc4ad6 Add CPU state at time of function call to Thread.
- When we detect that we're stepping over a function call, also store
  the CPU state at the time it occurred. This information is needed
  in order to correctly reconstruct target addresses later since some
  operands may be register-based.

- Add the aforementioned CPU state to CreateFrame()'s arguments and
  adjust implementations and callers accordingly.
2013-03-26 18:50:44 -04:00
Rene Gollent 5745a40dd1 Rework how return values are handled.
- ArchitectureX86 now hands off the work for GetInstructionInfo() to
  DisassemblerX86, since the latter has all the information we need
  to properly classify and evaluate instructions. Correspondingly a
  CpuState is passed down to it in order to perform address calculations
  for the instruction if it's a jump or call instruction. The latter's
  targets are then stored on the thread for later retrieval when
  constructing a stack trace. Adjust X86_64 accordingly for the
  signature changes. This also fixes a bug where Step Over would
  sometimes result in a Step Into instead due to the previous
  implementation of GetInstructionInfo() occasionally failing to
  classify call instructions correctly.

- Architecture::CreateStackTrace() now takes an argument specifying
  the address of the last executed function if applicable. This is used
  to decide who/where to decode a return value from. Adjust callers.

- DwarfImageDebugInfo::_CreateReturnValue() uses the above information
  in order to know directly who the caller it needs to look up a return
  value for is, rather than trying to walk backwards to find them.
  Type resolution is now also a bit more sophisticated due to various
  cases where the subprogram entry didn't directly contain the return
  type but referred to another DIE that did. Retrieving return value
  now appears to work properly in all cases except when position
  independent code is involved. The latter however will require
  resolving the appropriate function address in the PLT, which will
  need some additional work.
2012-12-31 23:02:24 -05:00
Rene Gollent cf2e209b2d More improvements to return value handling.
- Thread now has a data member indicating if a subroutine was
  executed during the last set of steps.
- ThreadHandler now sets the aforementioned state appropriate during
  Step Over/Step Out.
- Architecture::CreateStackTrace() now takes a parameter indicating
  whether return value retrieval is desired (based on aforementioned
  thread value). Adjust callers accordingly.
- DwarfImageDebugInfo: If return value retrieval is requested, loop
  backwards from the current IP to find the call instruction.
2012-12-31 20:25:11 -05:00
Rene Gollent bd26704e42 Use minimal frame info optimization in a few more places. 2012-12-28 22:23:06 -05:00
Rene Gollent 1167ae5274 Some optimizations for ThreadHandler.
- CreateStackTrace() now takes a parameter indicating whether or not
  to try and retrieve full frame information. This in turn is passed
  on to SpecificImageDebugInfo, where e.g. DwarfImageDebugInfo can
  use it to avoid constructing variables and parameters. This is
  used by ThreadHandler since, when it requests the top frame for
  its stepping  calculations, this additional data/work is completely
  unnecessary.
2012-12-26 00:20:33 -05:00
Rene Gollent 4549786bad Code reorganization. 2012-11-07 23:19:23 +01:00