Sharing the findings on lldb-dev.

Greg helped me figure out the issue, I need to check if symbol address is 
lldb.LLDB_INVALID_ADDRESS.
Things work fine now after the added checking.

The remaining issue is to figure out whether symbol.addr.file_addr or 
symbol.addr.load_addr should be used to get symbol address.
My test shows symbol.addr.file_addr should be used, at least for types defined 
in exetuables, contrary to what’s documented.


From: Greg Clayton<mailto:gclay...@apple.com>
Sent: Monday, September 19, 2016 03:24 PM
To: Lei Kong<mailto:leik...@msn.com>
Subject: Re: [lldb-dev] OverflowError: in method 
'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'


You do want to be using the load address, it probably works because your file 
address matches your load address because you are probably working on your main 
executable, but this won't work for shared libraries.

A few things:
- you probably want to make sure a symbol matches your regex first before 
asking it for the vtable address.
- not all symbols have addresses and asking for the file address or load 
address might return you lldb.LLDB_INVALID_ADDRESS. You should check for that 
before using the address in any way
- you should use the load address of your symbol:

def vtable_addr (symbol, target):
  load_addr = symbol.addr.GetLoadAddress(target)
  if load_addr != lldb.LLDB_INVALID_ADDRESS:
    return load_addr + 0x10
  else:
    return lldb.LLDB_INVALID_ADDRESS

The problem you were running into with overflow was probably because you were 
taking lldb.LLDB_INVALID_ADDRESS and adding 0x10, which would cause the integer 
to grow in size 
(http://stackoverflow.com/questions/2654149/count-bits-of-a-integer-in-python) 
and then not be able to be passed to the function that takes an lldb::addr_t. 
So diligently checking for lldb.LLDB_INVALID_ADDRESS will probably fix your 
problems. Also only try to compute the vtable stuff if the regex matches...

Greg

From: Greg Clayton<mailto:gclay...@apple.com>
Sent: Monday, September 19, 2016 01:10 PM
To: Lei Kong<mailto:leik...@msn.com>
Cc: Jim Ingham<mailto:jing...@apple.com>; 
lldb-dev@lists.llvm.org<mailto:lldb-dev@lists.llvm.org>
Subject: Re: [lldb-dev] OverflowError: in method 
'SBProcess_ReadPointerFromMemory', argument 2 of type 'lldb::addr_t'


> On Sep 19, 2016, at 1:09 PM, Greg Clayton <gclay...@apple.com> wrote:
>
>
>> On Sep 19, 2016, at 10:33 AM, Lei Kong <leik...@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@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@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: jing...@apple.com
>>>> Date: Fri, 16 Sep 2016 17:12:24 -0700
>>>> CC: lldb-dev@lists.llvm.org
>>>> To: leik...@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@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@lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>>>
>>> _______________________________________________
>>> lldb-dev mailing list
>>> lldb-dev@lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to