Hi,

this may not be so important if we choose the approach Greg suggests
(which sounds like a good idea), but in any case, I wanted to say that
I don't think that we should be depending on the debug symbols in libc
for a basic functionality like this. I think it's not safe to assume
that debug symbols will be available on every machine. And in any
case, mmap is a public symbol in libc, so it should be possible to
find it without debug symbols:
$ objdump -T /lib/libc-2.20.so  | grep mmap
00000000000e3670  w   DF .text    0000000000000024  GLIBC_2.2.5 mmap64
00000000000e3670  w   DF .text    0000000000000024  GLIBC_2.2.5 mmap

What does objdump produce on your machine? If mmap is there, and lldb
is not finding it then I think we should find out why...

cheers,
pl


On 30 April 2015 at 23:53, Greg Clayton <gclay...@apple.com> wrote:
>
>> On Apr 30, 2015, at 3:36 PM, Robert Flack <fla...@gmail.com> wrote:
>>
>> Hi,
>>
>> I've been looking into why expression evaluation is failing when targeting a 
>> remote Linux machine from Mac lldb host and it seems there are only 2 
>> distinct problems remaining - both around memory allocation:
>>
>> 1. Can't find symbol for mmap.
>> 2. Once found, lldb is calling mmap with incorrect constant values for 
>> MAP_ANON.
>>
>> For problem 1, the library being linked against (e.g. 
>> /lib/x86_64-linux-gnu/libc-2.19.so) is copied into a local module cache, but 
>> we don't copy the unstripped library in 
>> /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so (I'm assuming we can't call 
>> mmap from the symtab file given SymbolFileSymtab::FindFunctions returns 0). 
>> To avoid having to duplicate the symbol discovery (in 
>> Symbols::LocateExecutableSymbolFile) we should probably ask lldb-platform on 
>> the target to find the symbol files for the current target (I'm thinking 
>> Platform::ResolveSymbolFile looks like the right place).
>>
>> For problem 2, we're building the argument list to mmap and the constant for 
>> MAP_ANON on macosx is 0x1000 whereas for linux it's 0x20. I'm not sure what 
>> the right way to fix this is, I could imagine asking Platform to allocate 
>> memory, but this would likely be an involved change, or perhaps being able 
>> to ask platform for various OS specific const values which would be 
>> hard-coded into it when built for the target.
>>
> So we need to implement the allocate and deallocate memory packets in 
> lldb-server. It seems we have it implemented in the client, but not in the 
> server:
>
> addr_t
> GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t 
> permissions)
> {
>     if (m_supports_alloc_dealloc_memory != eLazyBoolNo)
>     {
>         m_supports_alloc_dealloc_memory = eLazyBoolYes;
>         char packet[64];
>         const int packet_len = ::snprintf (packet, sizeof(packet), "_M%" 
> PRIx64 ",%s%s%s",
>                                            (uint64_t)size,
>                                            permissions & 
> lldb::ePermissionsReadable ? "r" : "",
>                                            permissions & 
> lldb::ePermissionsWritable ? "w" : "",
>                                            permissions & 
> lldb::ePermissionsExecutable ? "x" : "");
>         assert (packet_len < (int)sizeof(packet));
>         StringExtractorGDBRemote response;
>         if (SendPacketAndWaitForResponse (packet, packet_len, response, 
> false) == PacketResult::Success)
>         {
>             if (response.IsUnsupportedResponse())
>                 m_supports_alloc_dealloc_memory = eLazyBoolNo;
>             else if (!response.IsErrorResponse())
>                 return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
>         }
>         else
>         {
>             m_supports_alloc_dealloc_memory = eLazyBoolNo;
>         }
>     }
>     return LLDB_INVALID_ADDRESS;
> }
>
> bool
> GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr)
> {
>     if (m_supports_alloc_dealloc_memory != eLazyBoolNo)
>     {
>         m_supports_alloc_dealloc_memory = eLazyBoolYes;
>         char packet[64];
>         const int packet_len = ::snprintf(packet, sizeof(packet), "_m%" 
> PRIx64, (uint64_t)addr);
>         assert (packet_len < (int)sizeof(packet));
>         StringExtractorGDBRemote response;
>         if (SendPacketAndWaitForResponse (packet, packet_len, response, 
> false) == PacketResult::Success)
>         {
>             if (response.IsUnsupportedResponse())
>                 m_supports_alloc_dealloc_memory = eLazyBoolNo;
>             else if (response.IsOKResponse())
>                 return true;
>         }
>         else
>         {
>             m_supports_alloc_dealloc_memory = eLazyBoolNo;
>         }
>     }
>     return false;
> }
>
> Then you call mmap yourself on the native machine in lldb-server instead of 
> trying to know what enums will work.
>
> We actually need to ask the PlatformLinux to run an allocate/deallocate 
> memory and hand it a process. So we can add the following to 
> lldb_private::Platform:
>
>     virtual bool
>     SupportsMemoryAllocation();
>
>     virtual lldb::addr_t
>     AllocateMemory (lldb_private::Process *process, size_t size, uint32_t 
> permissions, Error &error);
>
>
>     virtual Error
>     DeallocateMemory (lldb_private::Process *process, lldb::addr_t ptr);
>
> Then the lldb_private::Process can get the current platform and ask it if it 
> supports allocating memory, and if so call the 
> Platform::AllocateMemory()/Platform:: DeallocateMemory().
>
> Then the PlatformLinux can "do the right thing" and use the right defines.
>
>> Anyways, I wanted to send this out to see if anyone had any thoughts on 
>> either of these issues or was already working on them. I have verified (by 
>> hacking in the correct const values for linux and placing debug libs in a 
>> path where they will be found) that this fixes expression evaluation (and 14 
>> tests start passing) for mac->linux debugging.
>>
>> Thanks in advance for any suggestions,
>> Rob
>
> So my suggestion is to implement the memory allocation/deallocation in 
> lldb-server since it runs natively and will avoid the problems we run into by 
> trying to evaluate functions by calling them remotely using #define values 
> from the current system...
>
>
>>
>> P.S. the 14 tests passing mac->linux by fixing this (for other people 
>> looking at cross platform tests):
>> Test11588.py
>> TestAnonymous.py
>> TestBreakpointConditions.py
>> TestCPPStaticMethods.py
>> TestCStrings.py
>> TestCallStdStringFunction.py
>> TestDataFormatterCpp.py
>> TestDataFormatterStdList.py
>> TestExprDoesntBlock.py
>> TestExprHelpExamples.py
>> TestFunctionTypes.py
>> TestPrintfAfterUp.py
>> TestSBValuePersist.py
>> TestSetValues.py
>>
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>
>
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to