Re: Casting an object to another type while debugging?

Thomas Nyberg <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
Thank you so much! Should have been obvious when reading (PyObject *)...

Here it is in action:

```
(gdb) print ((PyUnicodeObject *) name)
$15 = (PyUnicodeObject *) 0x7ffff7ee3298
(gdb) print *((PyUnicodeObject *) name)
$16 = {_base = {_base = {ob_base = {ob_refcnt = 2,
        ob_type = 0x8a1a00 <PyUnicode_Type>}, length = 4,
      hash = -1762387814536268224, state = {interned = 1, kind = 1,
        compact = 1, ascii = 1, ready = 1}, wstr = 0x0},
    utf8_length = 92360930452852,
    utf8 = 0x73 <error: Cannot access memory at address 0x73>,
    wstr_length = 9050624}, data = {any = 0x2,
    latin1 = 0x2 <error: Cannot access memory at address 0x2>, ucs2 = 0x2,
    ucs4 = 0x2}}
```

On 04/14/2016 11:09 PM, Yichao Yu wrote:
> On Thu, Apr 14, 2016 at 11:02 PM, Thomas Nyberg <[email protected]> wrote:
>> Hello,
>>
>> Please yell and scream if I'm posting this to the wrong list (and then
>> point me in the right direction :) ).
>>
>> To make my situation specific, I'm stepping through the cpython
>> implementation of the python interpreter using gdb. The implementation
>> tends to pass around all objects as type (PyObject *). I know that a
>> certain object can be cast to (PyUnicode_Type *) and so I've tried to do
>> this to print out the structure, but without success. Here are some
>> examples:
>>
>> ```
>> (gdb) print name
>> $10 = (PyObject *) 0x7ffff7ee3298
>> (gdb) print *name
>> $11 = {ob_refcnt = 2, ob_type = 0x8a1a00 <PyUnicode_Type>}
>> (gdb) print name
>> $12 = (PyObject *) 0x7ffff7ee3298
>> (gdb) print *name
>> $13 = {ob_refcnt = 2, ob_type = 0x8a1a00 <PyUnicode_Type>}
>> (gdb) print (void *) name
>> $14 = (void *) 0x7ffff7ee3298
>> (gdb) print * (void *) name
>> Attempt to dereference a generic pointer.
>> (gdb) print * (PyUnicode_Type *) name
>> A syntax error in expression, near `) name'.
>> (gdb) print * (PyUnicode_Typ *) name
>> No symbol "PyUnicode_Typ" in current context.
>> (gdb) print (PyUnicode_Type *) name
>> A syntax error in expression, near `) name'.
>> (gdb) print ((PyUnicode_Type *) name)
>> A syntax error in expression, near `) name)'.
>> (gdb) print ((PyUnicode_Type *) name);
>> A syntax error in expression, near `) name);'.
> 
> PyUnicode_Type is not the name of the C type it's a variable/address
> that's holding the python type/vtable. I believe PyUnicodObject is the
> C type name.
> 
> 
>> ```
>>
>> So from this it seems to me like it's recognizing the PyUnicode_Type
>> fine, but I just get this weird syntax error. My google-foo hasn't
>> worked out that well so far in resolving this. What am I doing wrong? Am
>> I misunderstanding how casting works?
>>
>> Thanks for any help!
>>
>> Cheers,
>> Thomas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.