* 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:
Doug Evans
2008-05-05 21:14:37 +00:00
parent 5142f611ca
commit d14508fea9
5 changed files with 150 additions and 53 deletions

View File

@@ -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.

View File

@@ -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.

View File

@@ -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);

View File

@@ -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"

View File

@@ -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.