> On Jun 7, 2016, at 9:56 AM, Jiten Thakkar via lldb-dev > <lldb-dev@lists.llvm.org> wrote: > > Hi All, > I am working on a project as part of my graduate study which uses LLVM. > I am new to LLVM and lldb to be particular. > My goal is to get names of the parameters to functions. If the parameter is a > variable in a structure, it is represented as an offset in the structure.
This is possible. First you will want to get a lldb::SBFunction that represents the function whose parameters you want. If you use the current frame, you can get this info quickly in python: % lldb a.out (lldb) b main (lldb) r ... run and hit breakpoint (lldb) script >>> func = lldb.frame.GetFunction() >>> print func SBFunction: id = 0x0000002e, name = main, type = main Now we can ask the function for its top lexical block and ask that block to fetch a list of SBValue objects that represent the parameters only (no locals, or statics): >>> get_parameters = True >>> get_locals = False >>> get_statics = False >>> parameters = func.GetBlock().GetVariables(lldb.frame, get_parameters, >>> get_locals, get_statics, lldb.eDynamicDontRunTarget) >>> print parameters (int) argc = 1 (const char **) argv = 0x00007fff5fbff8f8 (const char **) envp = 0x00007fff5fbff908 (const char **) aapl = 0x00007fff5fbffa30 "parameters" is a SBValueList so you can iterate through it by index: >>> num_params = params.GetSize() >>> print num_params 4 >>> for i in range(num_params): ... param = params.GetValueAtIndex(i) ... print param ... (int) argc = 1 (const char **) argv = 0x00007fff5fbff8f8 (const char **) envp = 0x00007fff5fbff908 (const char **) aapl = 0x00007fff5fbffa30 Now you want to explore the types of each parameter: >>> for i in range(num_params): ... param = params.GetValueAtIndex(i) ... param_type = param.GetType() ... print param_type ... You now "param_type" that has a SBType object that represents the type of each parameter. You can ask it: >>> print param_type.GetTypeClass() This will return an enum that is one of: eTypeClassInvalid eTypeClassArray eTypeClassBlockPointer eTypeClassBuiltin eTypeClassClass eTypeClassComplexFloat eTypeClassComplexInteger eTypeClassEnumeration eTypeClassFunction eTypeClassMemberPointer eTypeClassObjCObject eTypeClassObjCInterface eTypeClassObjCObjectPointer eTypeClassPointer eTypeClassReference eTypeClassStruct eTypeClassTypedef eTypeClassUnion eTypeClassVector If this value is eTypeClassClass, eTypeClassStruct or eTypeClassUnion, you can access the fields: type_class = param_type.GetTypeClass() if type_class == lldb.eTypeClassClass or type_class == lldb.eTypeClassStruct or type_class == lldb.eTypeClassUnion: num_fields = param_type.GetNumberOfFields() for field_idx in range(num_fields): member = param_type.GetFieldAtIndex(field_idx) This class is a SBTypeMember which can tell you the info you want: class SBTypeMember { public: SBTypeMember (); SBTypeMember (const lldb::SBTypeMember& rhs); ~SBTypeMember(); lldb::SBTypeMember& operator = (const lldb::SBTypeMember& rhs); bool IsValid() const; const char * GetName (); lldb::SBType GetType (); uint64_t GetOffsetInBytes(); uint64_t GetOffsetInBits(); bool IsBitfield(); uint32_t GetBitfieldSizeInBits(); bool GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level); } > I want to get the names of all those parameters. I assume that debug info > should provide this but so far I am unable to find any documentation > regarding which would describe how to do it. > Is there a way to do this using debug info? Is this even possible? > Please let me know if any of this is confusing and I will try to describe it > in detail. This should get you started. There is also an example that checks for padding within types: svn cat http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/types.py This checks for padding within a type to show you gaps in your classes and structs. All of the example above are in python, but this same API is available in C++ if you need it. We have docs covering our APIs here: Python: http://lldb.llvm.org/python_reference/index.html C++: http://lldb.llvm.org/cpp_reference/html/index.html You will be interested in SBFunction, SBType and SBTypeMember. Let me know if you have any questions, Greg Clayton _______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev