Skip to content

Commit

Permalink
Throw NOT_AVAILABLE_ERROR in read_stack and read_code
Browse files Browse the repository at this point in the history
Nowadays, read_memory may throw NOT_AVAILABLE_ERROR (it is done by
patch http://sourceware.org/ml/gdb-patches/2013-08/msg00625.html)
however, read_stack and read_code still throws MEMORY_ERROR only.  This
causes PR 19947, that is prologue unwinder is unable unwind because
code memory isn't available, but MEMORY_ERROR is thrown, while unwinder
catches NOT_AVAILABLE_ERROR.

 #0  memory_error (err=err@entry=TARGET_XFER_E_IO, memaddr=memaddr@entry=140737349781158) at /home/yao/SourceCode/gnu/gdb/git/gdb/corefile.c:217
 riscvarchive#1  0x000000000065f5ba in read_code (memaddr=memaddr@entry=140737349781158, myaddr=myaddr@entry=0x7fffffffd7b0 "\340\023<\001", len=len@entry=1)
     at /home/yao/SourceCode/gnu/gdb/git/gdb/corefile.c:288
 riscvarchive#2  0x000000000065f7b5 in read_code_unsigned_integer (memaddr=memaddr@entry=140737349781158, len=len@entry=1, byte_order=byte_order@entry=BFD_ENDIAN_LITTLE)
     at /home/yao/SourceCode/gnu/gdb/git/gdb/corefile.c:363
 riscvarchive#3  0x00000000004717e0 in amd64_analyze_prologue (gdbarch=gdbarch@entry=0x13c13e0, pc=140737349781158, current_pc=140737349781165, cache=cache@entry=0xda0cb0)
     at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2267
 riscvarchive#4  0x0000000000471f6d in amd64_frame_cache_1 (cache=0xda0cb0, this_frame=0xda0bf0) at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2437
 riscvarchive#5  amd64_frame_cache (this_frame=0xda0bf0, this_cache=<optimised out>) at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2508
 riscvarchive#6  0x000000000047214d in amd64_frame_this_id (this_frame=<optimised out>, this_cache=<optimised out>, this_id=0xda0c50)
     at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2541
 riscvarchive#7  0x00000000006b94c4 in compute_frame_id (fi=0xda0bf0) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:481
 riscvarchive#8  get_prev_frame_if_no_cycle (this_frame=this_frame@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1809
 riscvarchive#9  0x00000000006bb6c9 in get_prev_frame_always_1 (this_frame=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1983
 riscvarchive#10 get_prev_frame_always (this_frame=this_frame@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1999
 riscvarchive#11 0x00000000006bbe11 in get_prev_frame (this_frame=this_frame@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:2241
 riscvarchive#12 0x00000000006bc13c in unwind_to_current_frame (ui_out=<optimised out>, args=args@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1485

The fix is to let read_stack and read_code throw NOT_AVAILABLE_ERROR too,
in order to align with read_memory.

gdb:

2016-05-04  Yao Qi  <[email protected]>

	PR gdb/19947
	* corefile.c (read_memory): Rename it to ...
	(read_memory_object): ... it.  Add parameter object.
	(read_memory): Call read_memory_object.
	(read_stack): Likewise.
	(read_code): Likewise.
  • Loading branch information
Yao Qi committed May 4, 2016
1 parent 02e370d commit edf689f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 14 deletions.
9 changes: 9 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
2016-05-04 Yao Qi <[email protected]>

PR gdb/19947
* corefile.c (read_memory): Rename it to ...
(read_memory_object): ... it. Add parameter object.
(read_memory): Call read_memory_object.
(read_stack): Likewise.
(read_code): Likewise.

2016-05-03 Yunlian Jiang <[email protected]>
Doug Evans <[email protected]>

Expand Down
29 changes: 15 additions & 14 deletions gdb/corefile.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,11 @@ memory_error (enum target_xfer_status err, CORE_ADDR memaddr)
throw_error (exception, ("%s"), str);
}

/* Same as target_read_memory, but report an error if can't read. */
/* Helper function. */

void
read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
static void
read_memory_object (enum target_object object, CORE_ADDR memaddr,
gdb_byte *myaddr, ssize_t len)
{
ULONGEST xfered = 0;

Expand All @@ -250,7 +251,7 @@ read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
ULONGEST xfered_len;

status = target_xfer_partial (current_target.beneath,
TARGET_OBJECT_MEMORY, NULL,
object, NULL,
myaddr + xfered, NULL,
memaddr + xfered, len - xfered,
&xfered_len);
Expand All @@ -264,28 +265,28 @@ read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
}
}

/* Same as target_read_memory, but report an error if can't read. */

void
read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
{
read_memory_object (TARGET_OBJECT_MEMORY, memaddr, myaddr, len);
}

/* Same as target_read_stack, but report an error if can't read. */

void
read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
{
int status;

status = target_read_stack (memaddr, myaddr, len);
if (status != 0)
memory_error (TARGET_XFER_E_IO, memaddr);
read_memory_object (TARGET_OBJECT_STACK_MEMORY, memaddr, myaddr, len);
}

/* Same as target_read_code, but report an error if can't read. */

void
read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
{
int status;

status = target_read_code (memaddr, myaddr, len);
if (status != 0)
memory_error (TARGET_XFER_E_IO, memaddr);
read_memory_object (TARGET_OBJECT_CODE_MEMORY, memaddr, myaddr, len);
}

/* Read memory at MEMADDR of length LEN and put the contents in
Expand Down

0 comments on commit edf689f

Please sign in to comment.