[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