Commit graph

205 commits

Author SHA1 Message Date
Joshua J. Drake
99678d2fe0 Fix return consistency and clarify variable naming (#5199) 2016-06-23 10:40:14 +02:00
Joshua J. Drake
722c62827b Major rework to the native debugger (esp on Linux) (#5185)
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.
2016-06-22 10:34:45 +02:00
pancake
136d1d722d Fix #5184 - Remove useless warning message in r_debug_set_arch 2016-06-20 23:42:56 +02:00
Joshua J. Drake
16c27891a0 Switch to r_sys_perror for errors and fix two typos 2016-06-20 15:24:19 +02:00
Álvaro Felipe Melchor
564803d5c2 express db breakpoints as dbm due to ASLR 2016-06-19 14:04:23 +02:00
Joshua J. Drake
0431a0efdf Properly handle forks on Linux 2.5.46+ (#5153)
Linux 2.5.46 made changes to the ptrace(2) API to inform a tracer when various
events occur. These are known as PTRACE_EVENTs. Start handling PTRACE_EVENTs
by:

 * Handling PTRACE_EVENT_FORK and PTRACE_EVENT_EXIT
 * For _FORK, stores the newly created pid in dbg->forked_pid
 * Add the "dpc" command to select the most recently forked child process.
 * Add the "dpc*" command to show the recently forked process' pid.

Additional minor changes to white space are included.

NOTE: This partially addresses #3549. It does handleLinux before 2.5.46.
2016-06-17 04:20:18 +02:00
Joshua J. Drake
e97e011426 Have r_debug_select change IO pids too (#5145) 2016-06-16 22:56:21 +02:00
Joshua J. Drake
285cd3b32f Minor tweaks to breakpoint handling
* Fix "dbm" help string
* Save <module>+<offset> as the name when using dbm
* Fix allocation patterns for "module"
* Remove commented out code
* White space fixes
2016-06-16 12:36:17 +02:00
pancake
95b2e511f5 Fix some warnings 2016-06-01 12:23:10 +02:00
Jeffrey Crowell
1c69a920b6 rm free of iterator, fix leak 2016-05-17 23:44:14 -04:00
Álvaro Felipe Melchor
6b827c1563 Fix #4796 - Add dbm aka module relative breakpoints 2016-05-16 01:00:11 +02:00
pancake
80ea7427bb Indentation fixes around the previous commit and beyond 2016-05-15 10:40:57 +02:00
Joshua J. Drake
29c2670039 Fix #4560: Handle recoils well with swstep=true
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.
2016-05-15 10:19:24 +02:00
Jeffrey Crowell
e0951cf874 fix Infinite looping of r_debug_reg_sync function
closes #4655

issue kill -0 to the debuggee to see if the pid is alive
2016-04-22 21:00:10 -04:00
pancake
b54614d292 Use anal reg profiles from debug.esil 2016-04-08 00:54:15 +02:00
NaveenBoggarapu
7d61361361 fix some memory leaks 2016-04-01 19:25:32 +02:00
Mizari
d6daa9d591 Fixed function calls for r_reg_set_bytes(reg,-1...) 2016-03-24 12:47:00 +01:00
Matthieu Tardy
bb84bbc276 Fix memory leaks in rabin2 and libr 2016-03-06 23:17:44 +01:00
pancake
3e53c64553 Fix #4165 - Reduce warning messages in debugger mode 2016-02-25 01:55:16 +01:00
pancake
74b23f10b9 Merge branch 'xnu' of https://github.com/alvarofe/radare2 2016-02-06 22:37:52 +01:00
Álvaro Felipe Melchor
efa2a8ecdf xnu: step, breakpoint working with mach exception 2016-02-06 19:53:29 +01:00
Jeffrey Crowell
f713c67794 restyle the function decl in r_debug 2016-01-29 18:52:53 -05:00
Álvaro Felipe Melchor
c372743315 xnu: get rid of ptrace even for attach and detach
some rework in order to handle mach message as mach_exc_server and alike does
api change in plugin debug, now the function detach receive a pointer to RDebug
trying to deallocate port when are not needed any more
2016-01-23 22:50:28 +01:00
pancake
0af7cf1209 Fix dcs - continue until syscall 2016-01-13 22:25:08 +01:00
pancake
8eabe785fe Boolify RDebug API 2015-12-04 02:57:56 +01:00
pancake
40e08dbd89 Get rid of _Bool 2015-12-01 12:39:12 +01:00
pancake
4f1663d6bf Some rework for regs+step+cont in iosdbg 2015-11-17 01:00:29 +01:00
pancake
5c99eb0c3f Uppercase register aliases 2015-10-31 01:59:01 +01:00
pancake
3de77ad6e6 Initial support of dbg.libs/unlibs for Linux/OSX 2015-10-22 04:48:56 +02:00
pancake
a05ac7eaa4 RDebugPlugin.arch.typeof(char*) 2015-10-22 03:11:03 +02:00
skuater
99e2333395 dbg.libs/dbg.unlibs implementation. 2015-10-16 11:23:32 +02:00
pancake
7a04833eac Little refactoring for w32dll handling from rdebug 2015-10-12 18:49:16 +02:00
pancake
ec5bab3692 Fix another bug in strbuf 2015-09-28 03:20:53 +02:00
pancake
196d7db68d Honor asm.bits=64 in ios.dbg, very wip much test 2015-09-22 01:49:14 +02:00
pancake
49975ccf95 Fix #3286 - Use stdbool.h 2015-09-14 02:08:31 +02:00
Álvaro Felipe Melchor
1d4ebdeb25 some refactoring & added threads field in RDebug 2015-09-01 18:45:08 +02:00
pancake
bfdfe0ec38 Fix asm.bits issue in 8051 test 2015-08-31 13:54:24 +02:00
dequis
003a18aa30 A few simple memory leak fixes 2015-08-30 23:20:51 +02:00
Álvaro Felipe Melchor
d8b1ee5b9b More cleanup in debug 2015-08-26 00:47:15 +02:00
pancake
62e631a514 Add segfault and abort debug stop reasons 2015-08-17 00:55:07 +02:00
pancake
d22ac1228e Initial implementation of RDebugReason. See di command 2015-08-17 00:16:25 +02:00
yetmorecode
3c6c74555d Fixed hangup in w32 native debugging on dc after ctrl+c 2015-08-13 17:02:08 +02:00
yetmorecode
4f4bbdaf9e Fixed issue with r_debug_wait return type 2015-08-13 00:08:50 +02:00
yetmorecode
6d678aa3f8 Fixed issue when w32 debugging was hanging up on breakpoints from non main threads. 2015-08-13 00:08:50 +02:00
yetmorecode
667cdecd37 Enhanced shell output for win32 native debugging
Fixed multiple whitespace issues
Removed unnecessary include for string.h
2015-08-11 09:17:23 +02:00
shuall
0807686d86 #3052 all printf member functions changed to cb_printf 2015-08-09 03:25:05 +02:00
pancake
d2233a896b Add de Debugger Esil API for advanced software watchpoints
- Implemented in r_debug_esil_* APIs
- Support for step-into and continue
- Expressions can be regs, numbers, math operations, ranges, comparisons..
- Honor dbg.prestep for stepping before or after analysing
- read-write-exec watchpoints using native debug backend and esil emulation
- OSX/iOS debugger error message is now nicer
- anal/rpnesil renamed to esil
- Add esi,edi in osx regprofile
- Add r_cons_is_breaked() for consistency
2015-07-21 06:11:42 +02:00
jvoisin
aa695bc808 Fix misc compilation warnings on Windows 2015-07-14 13:55:58 +02:00
pancake
4afc585acd Add fuzzy backtrace algorithm and show function and flag info in dbt 2015-06-29 22:23:04 +02:00
Riccardo Schirone
1be0105343 core/cmd_debug: use a tree instead of a graph to do trace call/ret 2015-06-11 22:53:48 +02:00