27 Commits

Author SHA1 Message Date
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
dc693e9265 Extend Architecture to help retrieve return values.
- Architecture now has a new function to retrieve the location where
  a return value can be found. Added implementation for x86 and stub
  for x86-64.
2012-12-31 20:25:09 -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
6be4555f92 Also report back the number of bytes each register can watch. 2012-11-12 20:22:15 -05:00
Rene Gollent
22fc56ce8c Correct an oversight. Thanks Ingo! 2012-11-11 12:03:28 -05:00
Rene Gollent
4f9eec722c Add watchpoint capabilities hook to Architecture.
Will be used by the watchpoint manager and/or watchpoint UI to
present and/or handle the relative limitations of the current platform.
2012-11-11 11:32:30 -05:00
Rene Gollent
26334a8a66 Fix unwinding of partial stack traces.
- Architecture::CreateStackTrace() now uses the last frame's
  PreviousCpuState() as the basis to continue unwinding when passed
  a partial trace to continue from, rather than the (incorrect) actual
  cpu state of that frame, which would have resulted in the last frame
  being duplicated in the trace.

- Renamed variables to be more clear.
2011-12-15 22:43:38 -05:00
Rene Gollent
16875b8c58 Make CreateStackTrace() more flexible.
CreateStackTrace() can now optionally be asked to limit the maximum
number of frames it tries to unwind. In conjunction, it can also be
passed an already existing partial stack trace, and be asked to
unwind more frames from it.
2011-12-14 22:30:07 -05:00
Rene Gollent
4b64cd3de3 Add architecture function for retrieving the stack growth direction.
Also add corresponding implementation for x86.
2011-12-12 08:40:49 -05:00
Ingo Weinhold
c3e066cf6d Replaced uses of obsolescent BReference[able] API.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39869 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-12-16 13:50:30 +00:00
Rene Gollent
87d85ea382 - Refactor setting up the default register rules to happen in the Architecture
class in order to allow us to set up architecture specific default rules
for registers that aren't explicitly set by the CFI program.
- Set up default rule for EIP on x86.
- Theoretically set up a default rule for the stack pointer. Disabled for the
time being though until I determine why that rule's not yielding the expected
values for ESP in anything other than the top frame, though the other location
offset rules work as expected.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39816 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-12-11 19:05:54 +00:00
Ingo Weinhold
f3516af2ca Added AddressSize(), IsBigEndian, IsHostEndian().
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31634 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-07-18 23:18:06 +00:00
Ingo Weinhold
ade8662ece Added ReadValueFromMemory() version taking an "address space" + address pair as
used by DWARF. Not needed/supported for x86.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31576 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-07-15 02:07:42 +00:00
Ingo Weinhold
614e1dc42f * Register:
- Added a type constant describing the format of the register value.
  - Added flag "is callee-preserved" indicating whether the ABI requires the
    register to be preserved by a called function.
* CpuState: Added SetRegisterValue(), made GetRegisterValue() const.
* Added RegisterMap interface for mapping register indices between different
  models.
* Architecture:
  - Added CreateCpuState() version to create a clean CpuState.
  - Added GetDwarfRegisterMaps(), which returns to RegisterMaps, converting
    from and to DWARF register indices.
  - Added ReadValueFromMemory() reading a value from the target team's memory.
    The value type is specified by a type constant and the value return via a
    BVariant.
  - CreateStackTrace: No longer decide whether to adjust the instruction pointer
    of the previous CPU state depending on who created the CPU state. Instead
    compare it with the return address of the next frame. If they are equal it
    obviously has to be adjusted.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31539 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-07-13 18:45:49 +00:00
Ingo Weinhold
18ca318a3d * Since disassembled code is actually function instance specific,
FunctionInstance does now also have a (DisassembledCode) source code
  attribute. Function keeps its attribute, but it explicitly is a
  FileSourceCode now.
* SourceCode:
  - Removed GetStatementAtLocation(). Instead DisassembledCode has a
    StatementAtLocation() now. As well as a StatementAtAddress() and
    StatementAddressRange(). Rather cast to the subclass (in two instances)
    instead of having those methods in the base class. In most cases we already
    have the subclasses now, anyway.
  - Added Lock()/Unlock(), which are implemented in FileSourceCode. The
    statement ranges are no longer immutable, so we have to lock.
* TeamDebugModel:
  - Revived GetBreakpointsInAddressRange().
  - GetBreakpointsForSourceCode(): Optimized for DisassembledCode and fixed
    in the FileSourceCode case. We need to compare with the functions' source
    file instead of their source code, since they might not have the source
    code set yet. Fixed two instances of the same problem in SourceView. Setting
    breakpoints in functions that have no associated source code yet, works now.
* Team:
  - GetStatementAtAddress(): Optimized by using the DisassembledCode, if
    available.
  - GetStatementAtSourceLocation(): If the supplied source code is
    DisassembledCode, we have to get the statement from it directly, since
    we can't get that information from the image debug info.
* TeamDebugInfo: Added LoadSourceCode() and DisassembleFunction(), the new way
  to get FileSourceCode respectively DisassembledCode. SpecificTeamDebugInfo
  has lost LoadSourceCode() and gained service methods AddSourceCodeInfo() and
  ReadCode(). This avoids unnecessary code duplication in the subclasses.
  Moreover it allows for joining source location info source files from
  different images (and compilation units) -- interesting for inline functions
  in headers.
* Adjusted LoadSourceCodeJob and TeamDebugger::FunctionSourceCodeRequested()
  accordingly.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31514 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-07-11 00:05:26 +00:00
Ingo Weinhold
5b60969c5c * Renamed ArchitectureTypes.h to Types.h.
* Created "types" subdirectory for basic types and moved Types.h,
  SourceLocation, TargetAddressRange there.
* Added TargetAddressRangeList, representing a list of address ranges.
* Array: Added copy constructor and assignment operator.
* Added DwarfFunctionDebugInfo.
* ElfFile: Also read the program headers and provide access to the segment
  information.
* DWARF:
  - Some work on DIECompileUnitBase and DIESubprogram to handle attributes we
    need.
  - Added DwarfUtils class which provides static utility methods. Currently some
    to get DIE names. Only provisionally implemented yet.
  - Read range list attribute values from the .debug_ranges section. Extended
    AttributeValue to handle them correctly (ref-counting).
* DwarfImageDebugInfo:
  - Implemented GetFunctions() for real, i.e. we return functions for all
    subprogram debug info entries we find (those that refer to actual
    functions, that is).
  - Implemented the fallback part of LoadSourceCode() (reading the code from the
    file and disassembling it).

Things should hopefully work as before, just a bit slower and with less accurate
function names, if DWARF debug info is available. Promising, eh? ;-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31321 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-29 22:38:15 +00:00
Ingo Weinhold
1c6fd17f75 Pulled interface TeamMemory out of DebuggerInterface to make the arch and model
packages indepent of the latter.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31246 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-26 00:39:23 +00:00
Ingo Weinhold
43b0f7e0d7 * Moved breakpoint management into new class BreakpointManager and added
support for temporary breakpoints.
* TeamDebugger: No longer handle debug events in the listener thread. Instead
  post a message to the looper thread. Makes the locking a bit easier.
* Architecture: Added virtual GetInstructionInfo() and GetStatement() returning
  information on the instruction respectively a statement at a given address.
  Implemented for x86.
* DebugInfo: Added virtual GetStatement() and implemented it for
  DebuggerDebugInfo by means of using the Architecture.
* Implemented step over/into/out support. Works in principle, but has no
  handling for PLTs yet, i.e. stepping into functions of other libraries
  requires two steps ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31244 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-25 23:51:09 +00:00
Ingo Weinhold
2460bf468b * Changes that should already have been part of r31228: StackFrame and
SourceView.
* Fixed the information flow problem in Architecture::CreateStackTrace()/
  ArchitectureX86::UpdateStackCpuState() by introducing a virtual
  UpdateStackFrameCpuState() which allows the architecture to update the CPU
  state it generated before after the function the state belongs to is known.
  That's where moving the instruction pointer to the previous instruction
  happens now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31229 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-24 22:10:07 +00:00
Ingo Weinhold
840c76534f * Added StackFrame classification as syscall frame and added correct
identification for x86.
* For non-top stack frames adjust the instruction pointer so that it points to
  the calling function instead of the return address.
* SourceView: Consider a syscall frame a non-top frame (the arrow is drawn
  differently).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-24 16:37:11 +00:00
Ingo Weinhold
0bcacd22ab * Added classes to represent source code (SourceCode, Statement).
* Added x86 disassembler (via libudis86).
* Added Architecture::DisassembleCode() to disassemble a function to SourceCode.
* Added virtual DebugInfo::LoadSourceCode() to retrieve the source code for a
  given function. The implementation in DebuggerDebugInfo disassembles the
  function.
* Added source code info to StackFrame. Also added a listener mechanism to get
  notified on source code changes.
* Added job to load the source code for a stack frame.
* Added (very basic) source code view and wired everything so that when a stack
  frame is selected the source code (respectively disassembly) for the
  underlying function is retrieved and shown.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31158 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-21 13:17:21 +00:00
Ingo Weinhold
0b60fa86e9 * Added DebuggerInterface::GetSymbolInfos() to get the symbols for an image.
* Added the beginnings of the debug info abstraction. Currently we can only load
  the symbols via the debugger.
* Added a job to retrieve debug info for an image. Extended the GetStackTraceJob
  to support waiting for image debug info to be loaded.
* Extended ImageInfo by text/data address and size.
* Removed StackFrameX86 and made StackFrame a simple non-polymorphic class
  featuring all the needed data. The really architecture-dependent is in the
  referenced CpuState already. Added Image* and FunctionDebugInfo* attributes,
  referring to the image respectively debug info for the function hit by the
  instruction pointer.
* Switched StrackTrace's StackFrame management from DoublyLinkedList to
  BObjectList. This makes it more comfortable to use.
* Changed the code for creating stack traces:
  - The creation of the StackTrace object and the main loop to collect the
    frames are now located in the no longer virtual
    Architecture::CreateStackTrace().
  - The decision how to create a StackFrame is based on the instruction pointer.
    If it hit a function for which debug info is available, the respective
    DebugInfo::CreateStackFrame() is used, otherwise we fall back to the new
    virtual Architecture::CreateStackFrame().
* Adjusted the stack trace view to also show function names (mangled ATM).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31142 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-20 17:20:49 +00:00
Ingo Weinhold
15f040e596 Some work towards getting stack traces:
* Added a virtual Architecture::CreateStackTrace() and added a basic
  implementation in ArchitectureX86. Fleshed out StackTrace/StackFrame a bit
  and added StackFrameX86. This needs to be organized differently, though, so
  that we can get the maximum available information for each stack frame,
  depending on what info is available for the respective function.
* Added job to get the stack trace for a thread.
* Added stack trace related handling in TeamDebugger. Reorganized the thread
  state/CPU state/stack trace change handling a bit -- we're using a
  Team::Listener now, and do things asynchronously.
* Added a StackTraceView to display the stack trace of the current thread. No
  function name available yet, otherwise working fine.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31126 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-19 22:13:32 +00:00
Ingo Weinhold
c42fe1eb57 More work on the architecture abstraction, particularly regarding information
about what registers the architecture has and how to get them from the CpuState.
Implemented the respective x86 part.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31109 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-19 00:05:45 +00:00
Ingo Weinhold
a81bb42a93 Beginnings of the architecture abstraction.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31104 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-18 19:57:46 +00:00