The major contribution here is completely re-worked breakpoint hit/recoil
handling. This work fixes#4907 and lays the ground work for future native
debugger improvements (multi-threading, etc).
* Give a human friendly type to enums
* Change many wait functions to return RDebugReasonType
* Better return checking (from r_debug_reg_sync, r_bp_restore)
* Optimized register synchronization
* Lots of comments and whitespace changes
* Improved inferior death detection
Handle EXIT_PID events differently than DEAD process events
* Move breakpoint/recoil handling to wait/cont/step
Rather than handing breakpoint related things inside cmd_debug.c, do that
inside the r_debug API functions. This seems like the most logical place for it
to live since it should apply to just about any platform/architecture. This
also centralizes calling into "cmd.bp" handling via the CoreBind callback.
* Track how the caller wishes to continue
It turns out that handling break point recoils is very complicated. The ptrace
API on Linux returns SIGTRAP for just about every type of operation (not just
breakpoints getting hit). Add the "recoil_mode" flag to indicate whether we are
single-stepping or continuing and whether or not we are inside the recoil.
* Proper handling for swstep=true
Since r_debug_step_soft calls r_debug_continue, it's already hitting the recoil
case there. Move the recoil handling from r_debug_step to r_debug_step_hard
only.
For the swstep=true case, special handling is required inside r_debug_recoil.
By resetting all of the breakpoints except the one we just hit, we ensure we
can step the original instruction and hit the new swstep breakpoint. Add a new
bp function called r_bp_restore_except to do this.
To make matters worse, we cannot use a BreakpointItem pointer because that
leads to a use-after-free condition. Instead, we the breakpoint address
instead.
Now breakpoints should work regardless of the swtep setting.
* Always call the recoil before continuing
Some callers of r_debug_continue might not have ever inserted any breakpoints
before. If we don't restore breakpoints before each call to the underlying
continue we won't hit them.
* Hide software step breakpoint events from the user
When a breakpoint even happens due to a software-step, hide it from the user.
They aren't really breakpoints as far as they are concerned.
* Improve process exit handling on Linux
There are three types of process exiting events on Linux:
1. PTRACE_EVENT_EXIT occurs just before a process exits. It's not possible to
prevent it from exiting, but it can be used to inspect the pre-exit state.
2. The process can exit for a variety of reasons and we can notice when we call
waitpid(2).
3. The process could die randomly on us :-/
On Windows, h->wait will return R_DEBUG_REASON_EXIT_PID, but it's more likely
on Linux to find out the process is already dead.
* Check more bits within waitpid status
We can often make a decision about what happened strictly by looking at the
status returned from waitpid. In other cases, we need to call
r_debug_handle_signals.
If we reach the end of this function without knowing what happened, consider it
an error.
When resuming after (during) recoil from a breakpoint, the swstep
implementation would fail to advance. In short, the debugger would immediately
interrupt again because r_bp_restore was re-setting the original breakpoint
just before continue. The following changes fix this issue:
1. Modify r_bp_get_in to stop including the byte after a breakpoint. This was
causing r_bp_recoil to fail because it thought there was already a breakpoint
on the next instruction.
2. Pass the real breakpoint address (pc - dbg->bpsize) to r_bp_recoil so
that r_bp_get_in can work properly. Stop adding the b->size there to keep it
going too.
3. Add a state flag to core->dbg to track that we are in the midst of a recoil.
4. When continuing from recoil (in r_debug_continue_kill), restore all
breakpoints except the one we just hit (with the new r_bp_restore_except) to
avoid hitting it again. Once we move past this instruction, that breakpoint
will be set again.
- Added breakpoint and code analysis plugins for bf
- *mem++ != mem[0]++
- Full register get/set support
- Support for step and continue-until-syscall
- Work in progress breakpoint support
* Added bfvm_reset() hooked to plugin->kill
* Enhacements in r_core and r_debug for better debugger support
- Added plugin->step_over delegate
- Update all .pc files
* Fix 'pf d*' segfault
- Show flag references in all 'pf' values
* Many bugfixes in vapis
- Use nested namespaces instead of static classes
- Static classes was deprecated in Vala some years ago
- All bindings are working again
- C++ support has been added
- Guile is now compiled by default
* Added ./configure-langs to select which langs to use
- Use --enable=python,perl or --disable=guile
- use specific ptrace() calls in linux/freebsd to change regs
- hwbp are not yet working, just basic DRX get/set
- generic interface to handle hw bps in x86-32/64
- needs to import DR# handling code from r1
- Added endianness in r_bp
- Add breakpoints for mips and ppc
- Needs to be used from r_core (dbt?)
- Added dummy bp_watch api (WIP: needs access to r_reg)
* Merge r_range inside r_util
* Added BIT_{SET|CHK} helpers in r_types_base
- Define ST32_MAX
--HG--
rename : libr/range/range.c => libr/util/range.c
- 'unowned string' is the correct vala type
- Depends on valaswig tip
- type checking is now more strict
* Build libr.so again for swig bindings
* Added test-r_bin.py
- Fixes ruby warnings
- Follow java syntax conventions
- Helped to identify and fix bugs in many vapis
- Sync swig examples
- Add test-r_core.rb (ruby test for RCore)
* Some work in r_cons, some refactoring and cleanup
- scr.html is now working again
- w32 cons support should work now
- Rename r_cons_get_columns -> r_cons_get_size()
- But it needs more work
* Typedef all r_range, r_parse and r_anal structs
- Add missing r_lib.pc in configure.acr
* 'make' clean now removes the libr* in swig/${LANG}/
- Many API rethink for the r_bp/r_reg/r_debug bizarre triangle love
- Support for recoil for software breakpoints
- Some debugging printfs.. next step, hardware and mmu breakpoints
* r_bp_restore is now used correctly from r_debug
- sw bps are written when returning to proces and erased when back to dbg
* Fix build of bp plugins on w32/osx
* Add support to 'repeat' commands from r_core
- 3ds ; same as 'ds&&ds&&ds' ; perform 3 steps
* Fix a memory leak in rBreakpointItem constructor
* Fix some possible segfaults in r_debug
* Fix double definition cause segfault in r_reg for r_reg_types array
* Fix rLibrary/r_lib typedef class name (fixes valaswig compilation)
- hg clone http://hg.youterm.com/valaswig
* typedef all structs as r_asm_item_t -> rAsmItem
- Sync typedefs with classnames for vala and valaswig interfaces
- Needs more work and testing
- C code keeps fully compatible
* New script to build valaswig bindings (swig/libr-swig.sh)
- Needs integration with 'make test'
- This will help to create a decent unit testing framework
to find bugs in bindings and enhace the design of APIs
from a centralized way keeping compatibility for all the
languages supported by swig (c#, python, java, ruby, perl, ..)
* Fix vala test programs build
* Make radare2 debugger interact with r_reg
- Register profile is now provided by the r_debug plugin
- |reg and dr works fine now
- Fix reg_sync and reg_read for dbg_ptrace
* Clean some warnings
* Fix build
- radare2 debugger is now broken
- r_reg has grown a bit more
- Better separation of debugger elements
* r_bp now has r_bp_add_hw and r_bp_add_sw() calls
- Added minimal support for breakpoint handlers
- Import th0rpe's watchpoint expression parser engine
* iob moved from r_debug to r_bp
* Arch types has been moved into r_asm
- Soft compile time dependency
* Update pkg-config .pc files
- Make r_bp_enable return bp_item
- dbh: breakpoint handler plugins can now be listed and selected
- Added 'dbe' and 'dbd' commands to enable and disable breakpoints
- Plugins needs to be synced
* Added x86nasm assembler backend to handle x86-64
- Not yet working. Pretty buggy :)
* Fix support of building static plugins for r_bp
- Statically link r_bp_x86 by default
* Implement ugly r_sys_cmd_str() command in r_util
- Integrated with r_debug module
- Hardware breakpoints will be handled by the debug backend
- Breakpoints support software/hardware, lil/big endian, trace, enable/disable
- Plugin infrastructure adding software breakpoint templates
- Added x86 and arm software breakpoint plugins
* Some work on the 'db' command to manage debugger breakpoint
* Added empty dH to transplant process between debugger backends
- Managing breakpoints for the core
- Initial work on the support for breakpoints
for the r_debug plugins
* Adding some dummy work for context support in r_anal
* Make asm_set_bits check per-plugin supported bit sizes
- Now asm plugins have 'arch' and 'bits' attributes
- Used to setup default callbacks for undefined 'assemble' callback
- Also used to avoid setting asm.bits eval variable to invalid values
- We need a way to display all this data
* Added DEFAULT_ARCH in config.h to setup default arch to asm and anal
* Added r_config_set_i_cb()
- Make r_config_set restore value when callback is called and fails
- asm.bits now has a config callback
* Added _LAST in some r_anal enums