* 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>
* xtensa-tdep.c: Update for unwinder changes.

View File

@ -3,6 +3,9 @@
*** 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
DWARF-2 DW_AT_calling_convention function attribute.

View File

@ -892,12 +892,75 @@ list_command (char *arg, int from_tty)
0);
}
/* Dump a specified section of assembly code. With no command line
arguments, this command will dump the assembly code for the
function surrounding the pc value in the selected frame. With one
argument, it will dump the assembly code surrounding that pc value.
Two arguments are interpeted as bounds within which to dump
assembly. */
/* Subroutine of disassemble_command to simplify it.
Perform the disassembly.
NAME is the name of the function if known, or NULL.
[LOW,HIGH) are the range of addresses to disassemble.
MIXED is non-zero to print source with the assembler. */
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
disassemble_command (char *arg, int from_tty)
@ -906,26 +969,44 @@ disassemble_command (char *arg, int from_tty)
char *name;
CORE_ADDR pc, pc_masked;
char *space_index;
#if 0
asection *section;
#endif
int mixed_source_and_assembly;
name = NULL;
if (!arg)
mixed_source_and_assembly = 0;
if (arg && *arg == '/')
{
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);
++arg;
if (*arg == '\0')
error (_("Missing modifier."));
while (*arg && ! isspace (*arg))
{
switch (*arg++)
{
case 'm':
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. */
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);
}
#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 ");
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
print_disassembly (name, low, high, mixed_source_and_assembly);
}
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, _("\
Disassemble a specified section of memory.\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\
Two arguments are taken as a range of memory to dump."));
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>
* gdb.texinfo (Maintenance Commands): Clarify that "maint time"

View File

@ -5446,8 +5446,11 @@ Variables}).
@cindex machine instructions
@cindex listing machine instructions
@item disassemble
@itemx disassemble /m
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
command is a program counter value; @value{GDBN} dumps the function
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 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
mnemonics or other syntax.