forked from Imagelibrary/binutils-gdb
* NEWS: Mention new /m modifier for disassemble command.
* cli/cli-cmds.c (print_disassembly): New function. (disassemble_current_function): New function (disassemble_command): Recognize /m modifier, print mixed source+assembly. (init_cli_cmds): Update disassemble help text. * gdb.texinfo (disassemble): Document /m modifier.
This commit is contained in:
@@ -1,3 +1,12 @@
|
|||||||
|
2008-05-05 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
|
* NEWS: Mention new /m modifier for disassemble command.
|
||||||
|
* cli/cli-cmds.c (print_disassembly): New function.
|
||||||
|
(disassemble_current_function): New function
|
||||||
|
(disassemble_command): Recognize /m modifier, print mixed
|
||||||
|
source+assembly.
|
||||||
|
(init_cli_cmds): Update disassemble help text.
|
||||||
|
|
||||||
2008-05-05 Maxim Grigoriev <maxim2405@gmail.com>
|
2008-05-05 Maxim Grigoriev <maxim2405@gmail.com>
|
||||||
|
|
||||||
* xtensa-tdep.c: Update for unwinder changes.
|
* xtensa-tdep.c: Update for unwinder changes.
|
||||||
|
|||||||
3
gdb/NEWS
3
gdb/NEWS
@@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
*** Changes since GDB 6.8
|
*** Changes since GDB 6.8
|
||||||
|
|
||||||
|
* The "disassemble" command now supports an optional /m modifier to print mixed
|
||||||
|
source+assembly.
|
||||||
|
|
||||||
* GDB now supports multiple function calling conventions according to the
|
* GDB now supports multiple function calling conventions according to the
|
||||||
DWARF-2 DW_AT_calling_convention function attribute.
|
DWARF-2 DW_AT_calling_convention function attribute.
|
||||||
|
|
||||||
|
|||||||
@@ -892,12 +892,75 @@ list_command (char *arg, int from_tty)
|
|||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump a specified section of assembly code. With no command line
|
/* Subroutine of disassemble_command to simplify it.
|
||||||
arguments, this command will dump the assembly code for the
|
Perform the disassembly.
|
||||||
function surrounding the pc value in the selected frame. With one
|
NAME is the name of the function if known, or NULL.
|
||||||
argument, it will dump the assembly code surrounding that pc value.
|
[LOW,HIGH) are the range of addresses to disassemble.
|
||||||
Two arguments are interpeted as bounds within which to dump
|
MIXED is non-zero to print source with the assembler. */
|
||||||
assembly. */
|
|
||||||
|
static void
|
||||||
|
print_disassembly (const char *name, CORE_ADDR low, CORE_ADDR high, int mixed)
|
||||||
|
{
|
||||||
|
#if defined(TUI)
|
||||||
|
if (!tui_is_window_visible (DISASSEM_WIN))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
printf_filtered ("Dump of assembler code ");
|
||||||
|
if (name != NULL)
|
||||||
|
printf_filtered ("for function %s:\n", name);
|
||||||
|
else
|
||||||
|
printf_filtered ("from %s to %s:\n", paddress (low), paddress (high));
|
||||||
|
|
||||||
|
/* Dump the specified range. */
|
||||||
|
gdb_disassembly (uiout, 0, 0, mixed, -1, low, high);
|
||||||
|
|
||||||
|
printf_filtered ("End of assembler dump.\n");
|
||||||
|
gdb_flush (gdb_stdout);
|
||||||
|
}
|
||||||
|
#if defined(TUI)
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tui_show_assembly (low);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Subroutine of disassemble_command to simplify it.
|
||||||
|
Print a disassembly of the current function.
|
||||||
|
MIXED is non-zero to print source with the assembler. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
disassemble_current_function (int mixed)
|
||||||
|
{
|
||||||
|
CORE_ADDR low, high, pc;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
pc = get_frame_pc (get_selected_frame (_("No frame selected.")));
|
||||||
|
if (find_pc_partial_function (pc, &name, &low, &high) == 0)
|
||||||
|
error (_("No function contains program counter for selected frame."));
|
||||||
|
#if defined(TUI)
|
||||||
|
/* NOTE: cagney/2003-02-13 The `tui_active' was previously
|
||||||
|
`tui_version'. */
|
||||||
|
if (tui_active)
|
||||||
|
/* FIXME: cagney/2004-02-07: This should be an observer. */
|
||||||
|
low = tui_get_low_disassembly_address (low, pc);
|
||||||
|
#endif
|
||||||
|
low += gdbarch_deprecated_function_start_offset (current_gdbarch);
|
||||||
|
|
||||||
|
print_disassembly (name, low, high, mixed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dump a specified section of assembly code.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
disassemble [/m]
|
||||||
|
- dump the assembly code for the function of the current pc
|
||||||
|
disassemble [/m] addr
|
||||||
|
- dump the assembly code for the function at ADDR
|
||||||
|
disassemble [/m] low high
|
||||||
|
- dump the assembly code in the range [LOW,HIGH)
|
||||||
|
|
||||||
|
A /m modifier will include source code with the assembly. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
disassemble_command (char *arg, int from_tty)
|
disassemble_command (char *arg, int from_tty)
|
||||||
@@ -906,26 +969,44 @@ disassemble_command (char *arg, int from_tty)
|
|||||||
char *name;
|
char *name;
|
||||||
CORE_ADDR pc, pc_masked;
|
CORE_ADDR pc, pc_masked;
|
||||||
char *space_index;
|
char *space_index;
|
||||||
#if 0
|
int mixed_source_and_assembly;
|
||||||
asection *section;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
name = NULL;
|
name = NULL;
|
||||||
if (!arg)
|
mixed_source_and_assembly = 0;
|
||||||
|
|
||||||
|
if (arg && *arg == '/')
|
||||||
{
|
{
|
||||||
pc = get_frame_pc (get_selected_frame (_("No frame selected.")));
|
++arg;
|
||||||
if (find_pc_partial_function (pc, &name, &low, &high) == 0)
|
|
||||||
error (_("No function contains program counter for selected frame."));
|
if (*arg == '\0')
|
||||||
#if defined(TUI)
|
error (_("Missing modifier."));
|
||||||
/* NOTE: cagney/2003-02-13 The `tui_active' was previously
|
|
||||||
`tui_version'. */
|
while (*arg && ! isspace (*arg))
|
||||||
if (tui_active)
|
{
|
||||||
/* FIXME: cagney/2004-02-07: This should be an observer. */
|
switch (*arg++)
|
||||||
low = tui_get_low_disassembly_address (low, pc);
|
{
|
||||||
#endif
|
case 'm':
|
||||||
low += gdbarch_deprecated_function_start_offset (current_gdbarch);
|
mixed_source_and_assembly = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error (_("Invalid disassembly modifier."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (isspace (*arg))
|
||||||
|
++arg;
|
||||||
}
|
}
|
||||||
else if (!(space_index = (char *) strchr (arg, ' ')))
|
|
||||||
|
if (! arg || ! *arg)
|
||||||
|
{
|
||||||
|
disassemble_current_function (mixed_source_and_assembly);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: 'twould be nice to allow spaces in the expression for the first
|
||||||
|
arg. Allow comma separater too? */
|
||||||
|
|
||||||
|
if (!(space_index = (char *) strchr (arg, ' ')))
|
||||||
{
|
{
|
||||||
/* One argument. */
|
/* One argument. */
|
||||||
pc = parse_and_eval_address (arg);
|
pc = parse_and_eval_address (arg);
|
||||||
@@ -948,36 +1029,7 @@ disassemble_command (char *arg, int from_tty)
|
|||||||
high = parse_and_eval_address (space_index + 1);
|
high = parse_and_eval_address (space_index + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TUI)
|
print_disassembly (name, low, high, mixed_source_and_assembly);
|
||||||
if (!tui_is_window_visible (DISASSEM_WIN))
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
printf_filtered ("Dump of assembler code ");
|
|
||||||
if (name != NULL)
|
|
||||||
{
|
|
||||||
printf_filtered ("for function %s:\n", name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_filtered ("from ");
|
|
||||||
deprecated_print_address_numeric (low, 1, gdb_stdout);
|
|
||||||
printf_filtered (" to ");
|
|
||||||
deprecated_print_address_numeric (high, 1, gdb_stdout);
|
|
||||||
printf_filtered (":\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dump the specified range. */
|
|
||||||
gdb_disassembly (uiout, 0, 0, 0, -1, low, high);
|
|
||||||
|
|
||||||
printf_filtered ("End of assembler dump.\n");
|
|
||||||
gdb_flush (gdb_stdout);
|
|
||||||
}
|
|
||||||
#if defined(TUI)
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tui_show_assembly (low);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1387,6 +1439,7 @@ With two args if one is empty it stands for ten lines away from the other arg.")
|
|||||||
c = add_com ("disassemble", class_vars, disassemble_command, _("\
|
c = add_com ("disassemble", class_vars, disassemble_command, _("\
|
||||||
Disassemble a specified section of memory.\n\
|
Disassemble a specified section of memory.\n\
|
||||||
Default is the function surrounding the pc of the selected frame.\n\
|
Default is the function surrounding the pc of the selected frame.\n\
|
||||||
|
With a /m modifier, source lines are included (if available).\n\
|
||||||
With a single argument, the function surrounding that address is dumped.\n\
|
With a single argument, the function surrounding that address is dumped.\n\
|
||||||
Two arguments are taken as a range of memory to dump."));
|
Two arguments are taken as a range of memory to dump."));
|
||||||
set_cmd_completer (c, location_completer);
|
set_cmd_completer (c, location_completer);
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
2008-05-05 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (disassemble): Document /m modifier.
|
||||||
|
|
||||||
2008-05-05 Vladimir Prus <vladimir@codesourcery.com>
|
2008-05-05 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
* gdb.texinfo (Maintenance Commands): Clarify that "maint time"
|
* gdb.texinfo (Maintenance Commands): Clarify that "maint time"
|
||||||
|
|||||||
@@ -5446,8 +5446,11 @@ Variables}).
|
|||||||
@cindex machine instructions
|
@cindex machine instructions
|
||||||
@cindex listing machine instructions
|
@cindex listing machine instructions
|
||||||
@item disassemble
|
@item disassemble
|
||||||
|
@itemx disassemble /m
|
||||||
This specialized command dumps a range of memory as machine
|
This specialized command dumps a range of memory as machine
|
||||||
instructions. The default memory range is the function surrounding the
|
instructions. It can also print mixed source+disassembly by specifying
|
||||||
|
the @code{/m} modifier.
|
||||||
|
The default memory range is the function surrounding the
|
||||||
program counter of the selected frame. A single argument to this
|
program counter of the selected frame. A single argument to this
|
||||||
command is a program counter value; @value{GDBN} dumps the function
|
command is a program counter value; @value{GDBN} dumps the function
|
||||||
surrounding this value. Two arguments specify a range of addresses
|
surrounding this value. Two arguments specify a range of addresses
|
||||||
@@ -5471,6 +5474,31 @@ Dump of assembler code from 0x32c4 to 0x32e4:
|
|||||||
End of assembler dump.
|
End of assembler dump.
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
|
Here is an example showing mixed source+assembly for Intel x86:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
(@value{GDBP}) disas /m main
|
||||||
|
Dump of assembler code for function main:
|
||||||
|
5 @{
|
||||||
|
0x08048330 <main+0>: push %ebp
|
||||||
|
0x08048331 <main+1>: mov %esp,%ebp
|
||||||
|
0x08048333 <main+3>: sub $0x8,%esp
|
||||||
|
0x08048336 <main+6>: and $0xfffffff0,%esp
|
||||||
|
0x08048339 <main+9>: sub $0x10,%esp
|
||||||
|
|
||||||
|
6 printf ("Hello.\n");
|
||||||
|
0x0804833c <main+12>: movl $0x8048440,(%esp)
|
||||||
|
0x08048343 <main+19>: call 0x8048284 <puts@@plt>
|
||||||
|
|
||||||
|
7 return 0;
|
||||||
|
8 @}
|
||||||
|
0x08048348 <main+24>: mov $0x0,%eax
|
||||||
|
0x0804834d <main+29>: leave
|
||||||
|
0x0804834e <main+30>: ret
|
||||||
|
|
||||||
|
End of assembler dump.
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
Some architectures have more than one commonly-used set of instruction
|
Some architectures have more than one commonly-used set of instruction
|
||||||
mnemonics or other syntax.
|
mnemonics or other syntax.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user