This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: Python API iterate through the arguments of a frame
- From: Cristian Zamfir <cristian dot zamfir at epfl dot ch>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: <gdb at sourceware dot org>
- Date: Tue, 21 Feb 2012 23:52:00 +0100
- Subject: Re: Python API iterate through the arguments of a frame
- Authentication-results: mr.google.com; spf=pass (google.com: domain of zamfir.epfl@gmail.com designates 10.180.109.198 as permitted sender) smtp.mail=zamfir.epfl@gmail.com
- References: <3EDCC9ED-AD12-42B4-854E-3404A8EBCF70@epfl.ch> <87obsst5o4.fsf@fleche.redhat.com>
On Feb 21, 2012, at 7:14 PM, Tom Tromey wrote:
>>>>>> "Cristian" == Cristian Zamfir <cristian.zamfir@epfl.ch> writes:
>
> Cristian> I would like to write a Python script that iterates through the
> Cristian> arguments of a frame. I was hoping I can retrieve these arguments from
> Cristian> a Frame object, but I did not find a way to do this, unless I know the
> Cristian> name of the variables. Similarly, I would like to iterate through all
> Cristian> the locals of the frame.
>
> Cristian> Is this possible with the current Python API? If not, can you please
> Cristian> point me to where I could add additional functions to the Python API?
>
> You can find the locals and arguments via Frame.block.
Great, this worked.
>
> I see that gdb.Block is under-documented in this area. Sorry about
> that, I will write a patch.
Thank you, that would be very useful. Is there a quick way to see the names of all available API functions, just in case there are more undocumented ones, other than looking into the gdb/python/ directory and infer from the Python bindings (e.g., py-block.c)?
Somehow unrelated to this, I just noticed that I can retrieve the type of a symbol while running a program inside gdb, but not when loading a dumped core. In the latter case I get this error:
AttributeError: 'gdb.Symbol' object has no attribute 'type'.
I can however still retrieve the name and the value of the symbol when loading a core. Is it possible to also get the type?
I should mention that I also see these two warnings when loading the core:
warning: core file may not match specified executable file.
warning: Can't read pathname for load map: Input/output error.
Thanks,
Cristi
>
> Here's a quick example:
>
> (top-gdb) start
> [...]
> Temporary breakpoint 3, main (argc=
> During symbol reading, incomplete CFI data; unspecified registers (e.g., rax) at 0x488914.
> 1, argv=0x7fffffffe558) at ../../archer/gdb/gdb.c:26
> (top-gdb) python
>> for sym in gdb.newest_frame().block():
>> print sym
>> end
> argc
> argv
> args
>
>
> In order to find all the locals in scope, and the arguments, you may
> have to iterate upwards over blocks via Block.superblock. The block
> with a non-None 'function' attribute will hold the arguments.
>
> Tom