[lldb-dev] Function names in backtrace from python

Tamas Berghammer tberghammer at google.com
Wed May 13 06:40:30 PDT 2015


Thanks for the clarification. It makes sense.

On Tue, May 12, 2015 at 7:11 PM, Greg Clayton <gclayton at apple.com> wrote:

>
> > On May 11, 2015, at 8:50 AM, Tamas Berghammer <tberghammer at google.com>
> wrote:
> >
> > Hi All,
> >
> > What is the expected behavior of SBFrame::GetFunctionName() in case of
> an inlined function (or possibly more nested inlined function)? Should it
> return the name of the deepest inlined function, the name of the outer most
> (non inlined) function or some combination of these two?
> >
> > If I understand correctly, currently it returns the name of the deepest
> inlined function for the actual frame but TestNoreturnUnwind expect the
> name of the outer most (non inlined) function.
>
> No, each SBFrame represents and exact scope for the current stack frame.
> Lets say you have the following code in "main.c":
>
>
>      1  static inline inlined1()
>      2  {
>      3      if (...)
>      4      {
>      5          puts("inlined1");
>      6      }
>      7  }
>      8
>      9  static inline inlined2()
>     10  {
>     11      if (...)
>     12      {
>     13         puts("inlined2");
>     14         inlined1();
>     15      }
>     16  }
>     17
>     18  static inline inlined3()
>     19  {
>     20      if (...)
>     21      {
>     22          puts("inlined3");
>     23          inlined2()
>     24      }
>     25  }
>     26
>     27  int main()
>     28  {
>     29      if (...)
>     30      {
>     31          inlined3();
>     32      }
>     33  }
>
> If you set a breakpoint at on line 5 and run. If everything got inlined,
> you will have 4 frames:
>
> frame = thread.GetFrameAtIndex(0);
> frame.GetBlock() would return the the lexical from line 4's if statement
> frame.GetFunctionName() would return "inlined1"
> frame.GetFunction() would return "int main()"
> frame.GetLineEntry() would return main.c:5
> frame.GetFrameBlock() would return the SBBlock that represents the lexical
> block from line 2 for the inlined1 inlined function
>
> frame = thread.GetFrameAtIndex(1);
> frame.GetBlock() would return the the lexical from line 12's if statement
> frame.GetFunctionName() would return "inlined2"
> frame.GetFunction() would return "int main()"
> frame.GetLineEntry() would return main.c:14
> frame.GetFrameBlock() would return the SBBlock that represents the lexical
> block from line 10 for the inlined2 inlined function
>
> frame = thread.GetFrameAtIndex(2);
> frame.GetBlock() would return the the lexical from line 20's if statement
> frame.GetFunctionName() would return "inlined3"
> frame.GetFunction() would return "int main()"
> frame.GetLineEntry() would return main.c:23
> frame.GetFrameBlock() would return the SBBlock that represents the lexical
> block from line 19 for the inlined2 inlined function
>
> frame = thread.GetFrameAtIndex(3);
> frame.GetBlock() would return the the lexical from line 30's if statement
> frame.GetFunctionName() would return "main"
> frame.GetFunction() would return "int main()"
> frame.GetLineEntry() would return main.c:31
> frame.GetFrameBlock() would return the SBBlock that represents the lexical
> block from line 28 for the main function
>
> So the SBFrame::GetFunctionName() will return the name of the first
> inlined function block above the SBFrame's block (frame.GetBlock()) if
> there is one, else it will return the name of the function.
>
> So the important distinction is that a SBFrame doesn't always represent
> the deepest block since with inlined stack frames we might have multiple
> inlined functions in the same SBFunction. Each SBFrame would be represented
> by a separate object with a different block scope.
>
> Does that make sense?
>
> Greg
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20150513/fccc1085/attachment.html>


More information about the lldb-dev mailing list