Re: Getting rid of "Cannot access memory at address ..."

Shahab Vahedi <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
After talking with Andrew, it seemes a possible solution could be using
try/catch to catch the usual suspect (a.k.a. MEMORY_ERROR):

Please let me know what you think of this change?

 diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
 index 98c691f3387..7faaa45f039 100644
 --- a/gdb/tui/tui-disasm.c
 +++ b/gdb/tui/tui-disasm.c
 @@ -226,7 +226,18 @@ tui_disasm_window::set_contents (struct gdbarch *arch,
    /* Get temporary table that will hold all strings (addr & insn).  */
    std::vector<tui_asm_line> asm_lines (max_lines);
    size_t addr_size = 0;
 -  tui_disassemble (gdbarch, asm_lines, pc, 0, max_lines, &addr_size);
 +  try
 +    {
 +      tui_disassemble (gdbarch, asm_lines, pc, 0, max_lines, &addr_size);
 +    }
 +  catch (const gdb_exception &except)
 +    {
 +      /* In cases where max_lines is asking tui_disassemble() to fetch
 +        too much, like when PC goes past the valid address range, a
 +        MEMORY_ERROR is thrown, but it is alright.  */
 +      if (except.error != MEMORY_ERROR)
 +         throw;
 +    }
  
    /* Align instructions to the same column.  */
    insn_pos = (1 + (addr_size / tab_len)) * tab_len;

My only concern is what if we have MEMORY_ERROR exception for reasons other
than disassembling PC addresses that just went beyond the valid range. Do
such reasons exist in this scenario?

--
Shahab
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.