[lldb-dev] OverflowError: in method 'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'

Greg Clayton via lldb-dev lldb-dev at lists.llvm.org
Mon Sep 19 13:10:53 PDT 2016


> On Sep 19, 2016, at 1:09 PM, Greg Clayton <gclayton at apple.com> wrote:
> 
> 
>> On Sep 19, 2016, at 10:33 AM, Lei Kong <leikong at msn.com> wrote:
>> 
>> You are right, it seems the argument is out of range, both vtableAddr and vtableAddr-8 are “8.5” byte long. Maybe there is something wrong with the way I get vtableAddress? I will clean up my full script and send it to you if the following does not provide enough information, thanks much.
>> 
>> def vtable_addr (vtableSymbol):
>>    return vtableSymbol.addr.section.file_addr + vtableSymbol.addr.offset + 0x10
> 
> You actually want to get the load address when reading from memory. This should be:
> 
> def vtable_addr (vtableSymbol, target):
>    return vtableSymbol.addr.GetLoadAddress(target) + 0x10

If you actually wanted the file address of vtableSymbol's address, then you would do this:

def vtable_addr (vtableSymbol, target):
   return vtableSymbol.addr.GetFileAddress() + 0x10

No need to do the section + offset math yourself.

> 
>> 
>> 
>> vtableAddr, type=<type 'long'>, value=0x1000000000000000f
>> vtableAddr-8, type=<type 'long'>, value=0x10000000000000007
>> Traceback (most recent call last):
>>  File "<input>", line 1, in <module>
>>  File "/home/leikong/repo/WindowsFabric/build.prod/test/fabdbg.py", line 199, in findall
>>    findtypes(pattern,ignorePureVirtualType)
>>  File "/home/leikong/repo/WindowsFabric/build.prod/test/fabdbg.py", line 156, in findtypes
>>    if ignorePureVirtualType and has_pure_virtual(vtableAddr, pureVirtualFuncs) :
>>  File "/home/leikong/repo/WindowsFabric/build.prod/test/fabdbg.py", line 100, in has_pure_virtual
>>    vtableEndAddr = lldb.process.ReadPointerFromMemory(vtableAddr-8, error)
>>  File "/home/leikong/bin/lldb/lib/python2.7/site-packages/lldb/__init__.py", line 9418, in ReadPointerFromMemory
>>    return _lldb.SBProcess_ReadPointerFromMemory(self, addr, error)
>> OverflowError: in method 'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'
>> 
>> From: Greg Clayton
>> Sent: Monday, September 19, 2016 09:12 AM
>> To: Lei Kong
>> Cc: Jim Ingham; lldb-dev at lists.llvm.org
>> Subject: Re: [lldb-dev] OverflowError: in method 'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'
>> 
>> Try printing the type of the value you are passing in the line:
>> 
>>    vtableEndAddr = lldb.process.ReadPointerFromMemory(vtableAddr-8, error)
>> 
>> print type(vtableAddr)
>> print type(vtableAddr-8)
>> 
>> It seems like it thinks vtableAddr doesn't fit into a lldb::addr_t which is a uint64_t
>> 
>> 
>> 
>>> On Sep 16, 2016, at 7:39 PM, Lei Kong via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>>> 
>>> I tried printing error.descryption, but it didn't work, because when the error happens, it seems ReadPointerFromMemory never returned to my code.
>>> 
>>> 
>>> read from address 0000000001223f68
>>> Traceback (most recent call last):
>>>  File "<input>", line 1, in <module>
>>>  File "/home/leikong/repo/WindowsFabric/build.prod/test/fabdbg.py", line 289, in findall
>>>    findtypes(pattern,ignorePureVirtualType)
>>>  File "/home/leikong/repo/WindowsFabric/build.prod/test/fabdbg.py", line 246, in findtypes
>>>    if ignorePureVirtualType and has_pure_virtual(vtableAddr, pureVirtualFuncs) :
>>>  File "/home/leikong/repo/WindowsFabric/build.prod/test/fabdbg.py", line 190, in has_pure_virtual
>>>    vtableEndAddr = lldb.process.ReadPointerFromMemory(vtableAddr-8, error)
>>>  File "/home/leikong/bin/lldb/lib/python2.7/site-packages/lldb/__init__.py", line 9418, in ReadPointerFromMemory
>>>    return _lldb.SBProcess_ReadPointerFromMemory(self, addr, error)
>>> OverflowError: in method 'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'
>>> 
>>> 
>>>> Subject: Re: [lldb-dev] OverflowError: in method 'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'
>>>> From: jingham at apple.com
>>>> Date: Fri, 16 Sep 2016 17:12:24 -0700
>>>> CC: lldb-dev at lists.llvm.org
>>>> To: leikong at msn.com
>>>> 
>>>> You passed an error into ReadPointerFromMemory. In the cases where you aren't getting what you expect, what does that error say?
>>>> 
>>>> Jim
>>>> 
>>>>> On Sep 16, 2016, at 5:06 PM, Lei Kong via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>>>>> 
>>>>> I ran into the error in the subject when running a python script with "script myfile.myscript()".
>>>>> 
>>>>> The value addr_t parameter used is 0x0000000001223f68, the following works fine:
>>>>> 
>>>>> (lldb) scr
>>>>> Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>>>>>>> e = lldb.SBError()
>>>>>>>> ptr = lldb.process.ReadPointerFromMemory(0x0000000001223f68, e)
>>>>>>>> print ptr
>>>>> 0
>>>>>>>> 
>>>>> 
>>>>> Any suggestion how to further investigate? Thanks.
>>>>> 
>>>>> myfile.myscript() calls the following function in a loop (iterate through all vtable symbols), which contains the call ReadPointerFromMemory.
>>>>> 
>>>>> def dump_vtbl(vtableAddr) :
>>>>> error = lldb.SBError()
>>>>> vtableEndAddr = lldb.process.ReadPointerFromMemory(vtableAddr+8, error)
>>>>> if not error.success :
>>>>> return False
>>>>> print "vtable: [%0.16x, %0.16x)" % (vtableAddr, vtableEndAddr)
>>>>> for addr in range(vtableAddr, vtableEndAddr, 8) :
>>>>> print "read from address %.016x" % addr
>>>>> try:
>>>>> funcAddr = lldb.process.ReadPointerFromMemory(addr, error)
>>>>> except:
>>>>> sys.exc_clear()
>>>>> continue
>>>>> if not error.success :
>>>>> continue
>>>>> 
>>>>> _______________________________________________
>>>>> lldb-dev mailing list
>>>>> lldb-dev at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>>> 
>>> _______________________________________________
>>> lldb-dev mailing list
>>> lldb-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
> 



More information about the lldb-dev mailing list