[lldb-dev] PATCH for REVIEW: Implement Linux Host::FindProcesses()

Malea, Daniel daniel.malea at intel.com
Thu May 16 10:39:17 PDT 2013


If we only support one ModuleSpec on Linux, maybe add:

assert(num_specs == 1 && "Linux plugin supports only a single
architecture");

To keep things explicit if/when we run across multi-arch binaries.
Otherwise, the changes look great; feel free to commit at your leisure!


Cheers,
Dan


On 2013-05-15 8:07 PM, "Greg Clayton" <gclayton at apple.com> wrote:

>This looks good. The only thing I would change is change:
>
>if (num_specs >= 1)
>
>to be:
>
>if (num_specs == 1)
>
>in the GetELFProcessCPUType() function. If linux ever supports files that
>contain more than one architecture, we can't just select the first
>architecture slice, we would need to select the correct arch by
>inspecting the process a bit closer. On MacOSX, we have universal files
>that contain 32 and 64 bit copies of the executable, and we need to
>inspect the process to figure out which slice each process uses. On linux
>currently, all ELF files should contain only 1 spec, and the "if
>(num_specs == 1)" will ensure we select the one and only correct one.
>
>Greg
>
>
>On May 15, 2013, at 3:59 PM, Michael Sartain <mikesart at valvesoftware.com>
>wrote:
>
>> On Wed, May 15, 2013 at 2:03 PM, Greg Clayton <gclayton at apple.com>
>>wrote:
>> The correct fix for this is to fill in the GetModuleSpecifications() in
>>ObjectFileELF:
>> 
>> How does the below look? It's definitely cleaner. I stepped through all
>>the code and performance seems more than acceptable as well.
>> 
>> Fire any feedback my way when you get a chance and I'll test it some
>>more and hopefully get this in tomorrow assuming it's all ok.
>> 
>> Thanks!
>>  -Mike
>> 
>> in linux/Host.cpp:
>> 
>> static bool
>> GetELFProcessCPUType (const char *exe_path, ProcessInstanceInfo
>>&process_info)
>> {
>>     // Clear the architecture.
>>     process_info.GetArchitecture().Clear();
>> 
>>     ModuleSpecList specs;
>>     FileSpec filespec (exe_path, false);
>>     const size_t num_specs = ObjectFile::GetModuleSpecifications
>>(filespec, 0, specs);
>>     if (num_specs >= 1)
>>     {
>>         ModuleSpec module_spec;
>>         if (specs.GetModuleSpecAtIndex (0, module_spec) &&
>>module_spec.GetArchitecture().IsValid())
>>         {
>>             process_info.GetArchitecture () =
>>module_spec.GetArchitecture();
>>             // SetArchitecture() in ArchSpec.cpp sets vendor and os to
>>unknown. Reset them to PC and Linux.
>>             process_info.GetArchitecture ().GetTriple().setVendor
>>(llvm::Triple::PC);
>>             process_info.GetArchitecture ().GetTriple().setOS
>>(llvm::Triple::Linux);
>>             return true;
>>         }
>>     }
>>     return false;
>> }
>> 
>> in ELF/ObjectFileELF.cpp:
>> 
>> bool
>> ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
>>                                   lldb::addr_t data_offset,
>>                                   lldb::addr_t data_length)
>> {
>>     if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT +
>>data_offset))
>>     {
>>         const uint8_t *magic = data_sp->GetBytes() + data_offset;
>>         return ELFHeader::MagicBytesMatch(magic);
>>     }
>>     return false;
>> }
>> 
>> size_t
>> ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec&
>>file,
>>                                         lldb::DataBufferSP& data_sp,
>>                                         lldb::offset_t data_offset,
>>                                         lldb::offset_t file_offset,
>>                                         lldb::offset_t length,
>>                                         lldb_private::ModuleSpecList
>>&specs)
>> {
>>     const size_t initial_count = specs.GetSize();
>>     
>>     if (ObjectFileELF::MagicBytesMatch(data_sp, 0,
>>data_sp->GetByteSize()))
>>     {
>>         DataExtractor data;
>>         data.SetData(data_sp);
>>         elf::ELFHeader header;
>>         if (header.Parse(data, &data_offset))
>>         {
>>             if (data_sp)
>>             {
>>                 ModuleSpec spec;
>>                 spec.GetFileSpec() = file;
>>                 spec.GetArchitecture().SetArchitecture(eArchTypeELF,
>>                                                        header.e_machine,
>>                 
>>LLDB_INVALID_CPUTYPE);
>>                 if (spec.GetArchitecture().IsValid())
>>                 {
>>                     // ObjectFileMachO adds the UUID here also, but
>>that isn't in the elf header
>>                     // so we'd have to read the entire file in and
>>calculate the md5sum.
>>                     // That'd be bad for this routine...
>>                     specs.Append(spec);
>>                 }
>>             }
>>         }
>>     }
>>     return specs.GetSize() - initial_count;
>> }
>
>_______________________________________________
>lldb-dev mailing list
>lldb-dev at cs.uiuc.edu
>http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev





More information about the lldb-dev mailing list