[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