----- Original Message -----
I find print_frame_args in gdb/stack.c seems to be the function to print out
the argument's name. Its working mechanism is exacting out all symbols
in the specified function with ALL_BLOCK_SYMBOLS. Then discard those symbol
not as argument by SYMBOL_IS_ARGUMENT. At last it would get the argument
name by SYMBOL_PRINT_NAME.
I think the problem you'll have there is the frame_info structure that
gets passed in to print_frame_args(). But maybe you can pull out a
subset of that function to just access the argument names from the
text symbol?
So how could I reach this print_frame_args by crash, need modify gdb side
to create such helper function?
I am not familiar with the gdb modification...
Is there any example to show me how to do this change?
It is better that the example itself contains how to connect the
change with crash. :)
For examples, check out any of the current users of gdb_interface().
They all set up a gnu_request structure with a command and any other
information required, and pass it into the gdb module.
To test your code, you can borrow the GNU_DEBUG_COMMAND command.
For example, you could create a function like this, which passes
the text symbol's name into the gdb module:
your_function(char *text_symbol)
{
struct gnu_request request, *req = &request;
req->command = GNU_DEBUG_COMMAND;
req->flags |= GNU_RETURN_ON_ERROR;
req->name = text_symbol;
/*
* fill in any other fields in the gnu_request struct
*/
gdb_interface(req);
if (req->flags & GNU_COMMAND_FAILED) {
goto error_out;
}
...
}
The gnu_request structure has several other general-purpose members
that you can use if more than the symbol name string is required.
Then, the gdb_interface() call above will end up here in
gdb-7.3.1/gdb/symtab.c:
void
gdb_command_funnel(struct gnu_request *req)
{
struct symbol *sym;
if (req->command != GNU_VERSION) {
replace_ui_file_FILE(gdb_stdout, req->fp);
replace_ui_file_FILE(gdb_stderr, req->fp);
do_cleanups((struct cleanup *)0);
}
switch (req->command)
{
...[ cut ] ...
case GNU_DEBUG_COMMAND:
gdb_debug_command(req);
break;
... [ cut ] ...
}
And you can do whatever you want in gdb_debug_command(), which is
also located in gdb-7.3.1/gdb/symtab.c:
static void
gdb_debug_command(struct gnu_request *req)
{
}
If you can get something working, we can add a new gdb
GNU_XXXX command that does what you want.
Dave