Commit Graph
49 Commits
Author SHA1 Message Date
Rene Gollent e2d845a47f Debugger: Implement remainder of #12729.
UserInterfaceListener:
- Add request hook for writing a core file. Implement in TeamDebugger.

Jobs/WriteCoreFileJob:
- Add new job to actually dispatch the core file request via the debugger
  interface.

Team{::Listener}
- Add listener event + hook for notifications when a core file gets written.
  Implement in CLI.

CliContext:
- Add event flag for core file changed.

CommandLineUserInterface:
- Add 'write-core' command. This optionally takes a path to write the core to,
  otherwise one is automatically generated by, similarly to debug reports. As
  such, one can now generate cores for things like app_server and registrar
  crashes if desired, in addition to reports.
2016-04-26 22:36:26 -04:00
Rene Gollent 61f0bf59fb Debugger: Fix handling of team_id clashes.
TeamDebugger:
- Add accessor to query whether the debugger's interface is a post mortem core
  rather than a live team.

TargetHostInterface:
- When asked to locate a team debugger by team_id, as is done for attach
  requests to determine if we already have an existing instance attached, skip
  over post mortems. This takes care of the potential problem of detecting a
  core instance with the same team_id as a live team, and consequently refusing
  the attach request.
- When a team debugger quits, use its actual pointer to look it up rather than its
  team ID, as we could otherwise potentially remove the wrong one in the case of a
  clash.
2016-04-25 21:49:46 -04:00
Ingo Weinhold 1a899ed474 Debugger: Beginning of core file support
* DebuggerInterface: Add method IsPostMortem() to be able to
  descriminate between live and post mortem debugging.
* Add DebuggerInterface implementation CoreFileDebuggerInterface which
  provides information from a core file.
* TeamDebugger: Don't start the debug event thread when debugging post
  mortem.
* Debugger: New command line variant "Debugger --core <file path>",
  which starts a team debugger using the core file.

There are a few issues:
* I didn't see an easy way to integrate with the new
  TargetHostInterface framework and I didn't want to get into Rene's
  way changing stuff. As a side effect core file debug windows are not
  counted and Debugger will quit when only those are left, respectively
  will additionally open a teams window on start-up.
* There aren't any symbols yet. We can't use the debug kit
  functionality, since it isn't bitness/endianess agnostic. So either
  it needs to be adjusted or ported over to Debugger.
2016-04-24 18:48:37 +02:00
Rene Gollent 6bef41c6a9 Debugger: Minor refactor.
TeamDebugger:
- Rather than instantiating the DebuggerInterface directly, we now
  expect it to be given to us externally. This allows TeamDebugger
  to be agnostic of where the team actually resides.

Debugger:
- Create and initialize DebuggerInterface before passing it on to
  TeamDebugger.

No functional change.
2016-04-02 15:05:19 -04:00
Rene Gollent 9d9c74ecdb Debugger: Cleanups and improvements for status notification.
Worker/Job:
- Add job listener hooks for when work actually begins for a job,
  and when a job is suspended to wait for user input.
- Add hook for setting a job description string, and implement in several
  subclasses.

LoadImageDebugInfoJob:
- Get rid of ImageDebugInfoJobListener since its functionality can be
  handled via the more general job wait for user input hook. Refactor
  accordingly.

TeamDebugger:
- Adjust to use new job hooks. When a worker job is initiated, we now
  check if the job has a description, and if so pass it on to the UI
  to display a notification.

DwarfLoadingStateHandler:
- Notify the UI when a package download is in progress.

With these changes, the status bar now notifies the user if any of the
following actions are in flight:

1) Loading/parsing debug information
2) Stack trace retrieval
3) Source code retrieval
4) Downloading a debug info package
2015-08-15 16:47:26 -04:00
Rene Gollent 36a43c9d51 Debugger: Implement notifications for debug info loading.
TeamDebugger:
- When notified that an image debug info job has started loading,
  notify the user interface accordingly. Also reset status to a ready
  state whenever all in-flight jobs are complete. This allows the
  user to know when then debug subsystem is still in the process
  of parsing debug information, as this can be time consuming for
  larger programs/libraries.
2015-08-14 20:53:06 -04:00
Rene Gollent 5e95945071 Debugger: Cleanup.
ThreadHandler:
- Simplify SetBreakpointAndRun() to always use the debugger interface to
  continue execution, since the latter is now intelligent enough to determine
  how to handle that in all cases. Adjust callers accordingly.
2015-07-31 17:28:02 -04:00
Rene Gollent 9123fde7b9 Debugger: Implement #9783.
TeamDebugger:
- When we're notified that the target team has called exec(), take all
  necessary steps to prepare. These include saving settings for the old
  team, clearing out breakpoints, resetting signal dispositions, and
  removing the old team's image list. Also set a flag indicating an exec
  is pending for later processing.
- On image load notification, if the pending flag is set, check if the
  new image is the app image, and if so update the team's name to
  the new image, load that respective team's settings, and set a
  temporary breakpoint in its main() so the user has a chance to
  perform any additional desired actions before starting execution
  in the new executable.
2015-07-26 14:37:28 -04:00
Rene Gollent 7d25ab995d Debugger: Add hook for variable value writing.
WriteValueNodeJob:
- Implement async job that creates a ValueWriter to update a variable
  value on request.

UserInterfaceListener:
- Add hook for requesting that a node be updated with a new value.
  Implement in TeamDebugger by scheduling a WriteValueNodeJob.
2015-07-24 17:08:53 -04:00
Rene Gollent a3b04ab398 Debugger: Fix oversight in TeamDebugger.
- In the case where the target team terminates, the subsequent prompt
  to ask the user what action they wish to take in response needs to
  take into account the possibility that the UserInterface in question
  hasn't yet implemented such prompting. Treat such a case as equivalent
  to asking the debugger to quit.

Addresses part of #10292.
2015-07-18 16:42:38 -04:00
Rene Gollent 24fe478ef8 Debugger: Start watching signal events.
TeamDebugger:
- Add signal events to debug event mask. Upon receipt of such an event,
  stop the target thread. WIP.
2015-07-02 22:38:07 -04:00
Rene Gollent 86a5bc31a5 Debugger: Add persistent settings classes for signal dispositions.
- Add class TeamSignalSettings for storing signal disposition settings,
  and add instance to TeamSettings.
- Adjust TeamDebugger to load signal settings.
2015-07-02 22:38:07 -04:00
Rene Gollent 14a55dce06 Debugger: Add signal settings and listener hooks.
Team:
- Add settings and accessors for signal dispositions.
- Add event definitions and listener hooks for signal disposition
  changes.
2015-07-02 22:38:07 -04:00
Rene Gollent 68e78ff841 Debugger: Add memory write support.
- Implements various support classes and functions that will be
  needed in order to marshal requests to write to memory in the
  target team.
2015-05-23 16:54:16 -04:00
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 942226c711 Debugger: Add UI for configuring breakpoint conditions.
General:
- Add message codes for requesting breakpoint configuration.

UserInterfaceListener/TeamDebugger:
- Add/implement hooks for requesting breakpoint condition changes.

BreakpointsView:
- Add button to request editing the currently selected breakpoint's
  condition.

TeamWindow:
- Handle request to show breakpoint edit window.

BreakpointEditWindow:
- Implement simple radio-based UI for modifying the current breakpoint's
  condition.

Still missing: Actually handling/evaluating the breakpoint conditions in
the ThreadHandler when the breakpoint is hit.
2014-10-30 16:54:31 -04:00
Rene Gollent 65a10b5000 Debugger: Add condition expression member to UserBreakpoint.
- UserBreakpoint and its corresponding settings classes now
  store/recall an optional condition expression.
2014-10-30 16:54:30 -04:00
Rene Gollent c3f81329bb Debugger: Implement expression variable value resolution.
General:
- Resolving variable values requires both a stack frame and a CPU state.
  Adjust all interfaces and callers accordingly.

ExpressionEvaluationJob:
- Pass additional parameters needed for variable value resolution.
- If variable resolution is desired, ExpressionEvaluationJob now
  creates a temporary ValueNodeManager for that purpose.
- If the expression parser returns a value node pointer that needs
  to be resolved, schedule a corresponding job and wait.

CLanguageExpressionEvaluator:
- Clean up some leftovers that were preventing variable names from being
  handled properly in some cases.
- Implement handling of identifier names. These are now looked up against
  the value node graph of the active node manager, and if found, corresponding
  values are retrieved. If the value has not yet been resolved, an exception
  is thrown to ask that to be done.

This gets value resolution working for basic local variables and function
parameters, and consequently, #9712. Structure/class members and/or pointer
indirection aren't yet handled.
2014-10-29 17:41:54 -04:00
Rene Gollent 2d5794a1a3 Debugger: Add asynchronous expression evaluation interface.
- Add UserInterfaceListener hook to request expression evaluation.
- Add corresponding events/handlers in Team and TeamDebugger.

These allow callers to request evaluation of expressions by the
debugger core's worker threads with asynchronous notifications of
results. While not strictly necessary right now, this paves the way
for further changes to come, as handling of variables will
potentially require resolving their values if they haven't been
already, and this shouldn't be done from user interface threads.
2014-10-28 23:30:01 -04:00
Rene Gollent 432da9e337 Debugger: Implement remaining part of #11033.
TeamDebugInfo:
- Add function to invalidate a source entry's file mapping.
UserInterfaceListener:
- Add listener hook to be able to invoke the aforementioned invalidate.
  Add corresponding implementation in TeamDebugger.
FileManager:
- When asked to locate a source entry, invalidate any existing mapping
  first.
TeamWindow:
- Always allow choosing an alternate source file.
- If we already have an existing source mapping, invalidate it first
  before attempting to establish a new one.
2014-08-29 11:04:48 -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 6053c78a92 Debugger: Fix #10764.
- Destroy the background worker before going after all the managers. Otherwise,
there might potentially still be jobs in flight that might touch them, leading
to crashes.
2014-05-17 21:26:40 -04:00
Rene Gollent b9b126139a Debugger: add settings manager for source location mappings.
- If it was necessary to help the debugger locate a particular source
  file due to it not being found on disk at the location specified in
  the debug information, the associated user-supplied path mappings
  are now saved and restored in the team settings. The file manager still
  needs a bit of extra work to apply these as files are added though.
2013-09-16 15:29:18 +02:00
Rene Gollent 5d4ef3e417 TeamDebugger: When stopping after an image load...
...set a stop reason to indicate the responsible image.
2013-07-07 12:56:30 -04:00
Rene Gollent cae8421db8 Implement debugger infrastructure for stop on...
...image load with name matching.

- Move the stop on image load setting to Team, along with a new setting
governing the use of the (also newly added) name list.

- Add accessors for maintaining the name list, and events/notifications
for listeners with regards to changes to all stop on image load
settings.

- Adjust user interface listener hooks for additional functionality.
2013-07-07 00:39:04 -04:00
Rene Gollent 5b402aa2a3 Implement #9855.
The Team menu now has a menu item allowing one to tell the debugger to
stop whenever a new executable image is loaded by the debugged team.
This setting is not currently persisted, though that can be changed if
desired.
2013-07-04 10:41:38 -04:00
Rene Gollent df75e436dd Don't try to read data for output capture if the syscall didn't succeed. 2013-07-04 07:44:45 -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 77ea49f4f2 Adjust debug API to address some x86-64 concerns.
- The argument buffer contained in the debug_{pre,post}_syscall message structures wasn't large enough to accomodate all
arguments for some syscalls on x86-64, which could potentially have led to kernel memory corruption when using syscall
tracing via the debug API. As such, enlarge it to accomodate 64-bit platforms as well.

- Adjust TeamDebugger/SyscallInfo to discriminate the target architecture and read the arguments when trapping console
output. Gets the latter working on x86-64.
2013-06-28 18:59:38 -04:00
Rene Gollent fe448830c9 TeamDebugger: Implement post syscall event handling.
We now watch for file write syscalls in the target team. If they
constitute a write to either stdout or stderr, we attempt to capture the
output, and notify interested listeners accordingly.
2013-06-28 18:49:32 -04:00
Rene Gollent 23f48a24d0 Add event class for the post-syscall debug message. 2013-06-28 18:49:26 -04:00
Rene Gollent b906e10a5d Fix crash in InspectorWindow.
- In the case where retrieval of a memory block failed, InspectorWindow
didn't handle the notification. Consequently, it never removed itself as
a listener from the failed block, nor did it release its reference for
it. Consequently, if one attempted to retrieve data from the same block
again, walking the listener list would crash due to the already-deleted
entry in the list.

- The success case had the same problem with regards to not removing its
listener, but was masked by virtue of the inspector currently being the
only user of the memory block manager, so in the latter case the blocks
would be properly released/destroyed and the aforementioned walk would
never occur.

- Adjust locking a bit to ensure that manipulating the listener list
always happens with the team lock held.

- Style fixes.
2013-06-25 17:42:06 -04:00
Rene Gollent 442f71a7d9 Extend FunctionSourceCodeRequested().
Now takes an optional boolean parameter to indicate that disassembly is
explicitly being requested. Adjust TeamDebugger and LoadSourceCodeJob's
implementations accordingly.
2013-06-22 15:48:17 -04:00
Rene Gollent 468c8dfab7 Extend UserInterfaceListener to allow marking...
...breakpoints as hidden. Adjust TeamDebugger accordingly.
2013-06-15 14:51:18 -04:00
Rene Gollent 6443c430b2 TeamDebugger: minor cleanups.
- On team exit, close the debug interface.
- When receiving a restart request via the listener, save settings
before dispatching it.
2013-05-30 21:15:33 -04:00
Rene Gollent 7cbc5a5964 Add UserInterfaceListener hook to request a team restart. 2013-05-29 21:59:51 -04:00
Rene Gollent c90773b3ba Implement support for restarting teams.
- TeamDebugger's listener interface now exports a
TeamDebuggerRestartRequested hook. The latter is used to request
starting a new debugger instance with the same arguments/settings as the
team it represented. Implemented for the graphical debugger.

- When a team terminates, the resulting dialog now allows the user to
choose to quit, restart, or simply do nothing. The latter option still
needs some work though, as e.g. setting additional breakpoints currently
fails since the corresponding debugger interface is no longer around.

Implements the main part of #9774.
2013-05-29 19:25:49 -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 3e9e1e11b2 Resolve TODO: get team information via DebuggerInterface. 2013-04-25 18:54:59 -04:00
Rene Gollent dd817ff93c Handle team deletion debug event.
When the target team exits, notify the user and shut down the debugger.
2013-04-23 23:05:36 -04:00
Rene Gollent adf25fc437 Dump area information in reports.
Implements part of #9510.
2013-04-05 09:12:51 -04:00
Rene Gollent be56273bbb Refactor DebugReportGenerator to use jobs.
- Instead of asking nodes to resolve themselves directly,
  DebugReportGenerator now uses the interface listener to ask the
  debugger's workers to resolve them on its behalf.
2012-12-11 22:56:47 -05:00
Rene Gollent e206ff5692 Fix crash in TeamDebugger.
- TeamDebugger's destructor was assuming the report generator object
  had always been created, which might not be the case. Fixes second
  part of #9273.
2012-12-07 17:36:30 -05:00
Rene Gollent 969609f0ef Fix double free. 2012-12-05 20:09:59 -05:00
Rene Gollent 4e9b38d34e Fix #9221.
- When an image creation notification is received, the thread
  that provoked it needs to be suspended until the debugger has
  finished loading the image's debug information. Otherwise, if that
  image had a breakpoint in it, it was possible that the thread would
  execute past the code where the breakpoint should be before the
  debugger had a chance to actually install it.

- Only update breakpoints when debug info loading has actually finished.
2012-11-29 08:12:49 -05:00
Rene Gollent 248c2ff45c Rework control flow for debug report generator.
- DebugReportGenerator is now its own BLooper that generates reports asynchronously
  instead of in TeamDebugger's message loop.
- If a stack trace isn't yet available, DebugReportGenerator now waits for it to
  be generated.
- Extended Team to add a listener event for report generation completing. DebugReportGenerator
  now generates such an event when it has finished writing a report.
2012-11-24 00:44:00 -05:00
Rene Gollent 2efebaa1d1 Tie DebugReportGenerator into TeamDebugger.
- Add UI listener hook. Still needs to be exposed via the actual
  UI though.
2012-11-18 13:10:31 -05:00
Rene Gollent 4549786bad Code reorganization. 2012-11-07 23:19:23 +01:00