[Lldb-commits] [lldb] r274750 - Fix for PrintStackTraces
Ravitheja Addepally via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 7 06:00:29 PDT 2016
Author: ravitheja
Date: Thu Jul 7 08:00:29 2016
New Revision: 274750
URL: http://llvm.org/viewvc/llvm-project?rev=274750&view=rev
Log:
Fix for PrintStackTraces
Summary:
The issue arises due to the wrong unwinder used for the first
stack frame, where the default unwinder returns erroneous frame
whereas the fallback would have given the correct frame had it
been used.
The following fix consists of two parts ->
1) The first part changes the unwinding strategy, earlier the
default unwinder was used to get 2 more stack frames and if it
failed a fallback unwinder was used. Now we try to obtain as many
frames (max 10) as we can get from default unwinder and also
fallback unwinder and use the one that gives more number of frames.
2) Normally unwindplans are assosciated with functions and the
row to be used is obtained from the offset (obtained from the low_pc
of the function symbol). Sometimes it may occur that the unwindplan
is assosciated to the complete Elf section in which case the offset
calculation would be wrong as the debugger uses the same offset originally
obtained from the function symbol. Hence this offset is recalculated.
Reviewers: tberghammer, lldb-commits, labath, jasonmolenda
Subscribers: jingham
Differential Revision: http://reviews.llvm.org/D21221
Added:
lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/
lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/Makefile
lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/TestEhFrameUnwind.py
lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/main.c
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/Makefile?rev=274750&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/Makefile Thu Jul 7 08:00:29 2016
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+CFLAGS ?= -g -fomit-frame-pointer
+
+include $(LEVEL)/Makefile.rules
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/TestEhFrameUnwind.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/TestEhFrameUnwind.py?rev=274750&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/TestEhFrameUnwind.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/TestEhFrameUnwind.py Thu Jul 7 08:00:29 2016
@@ -0,0 +1,51 @@
+"""
+Test that we can backtrace correctly from Non ABI functions on the stack
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class EHFrameBasedUnwind(TestBase):
+ mydir = TestBase.compute_mydir(__file__)
+
+
+ @skipUnlessPlatform(['linux'])
+ @skipIf(archs=["aarch64", "arm", "i386", "i686"])
+ def test (self):
+ """Test that we can backtrace correctly from Non ABI functions on the stack"""
+ self.build()
+ self.setTearDownCleanup()
+
+ exe = os.path.join(os.getcwd(), "a.out")
+ target = self.dbg.CreateTarget(exe)
+
+ self.assertTrue(target, VALID_TARGET)
+
+ lldbutil.run_break_set_by_symbol (self, "func")
+
+ process = target.LaunchSimple (["abc", "xyz"], None, self.get_process_working_directory())
+
+ if not process:
+ self.fail("SBTarget.Launch() failed")
+
+ if process.GetState() != lldb.eStateStopped:
+ self.fail("Process should be in the 'stopped' state, "
+ "instead the actual state is: '%s'" %
+ lldbutil.state_type_to_str(process.GetState()))
+
+ stacktraces = lldbutil.print_stacktraces(process, string_buffer=True)
+ self.expect(stacktraces, exe=False,
+ substrs = ['(int)argc=3'])
+
+ self.runCmd("thread step-inst")
+
+ stacktraces = lldbutil.print_stacktraces(process, string_buffer=True)
+ self.expect(stacktraces, exe=False,
+ substrs = ['(int)argc=3'])
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/main.c?rev=274750&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/main.c (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/unwind/ehframe/main.c Thu Jul 7 08:00:29 2016
@@ -0,0 +1,20 @@
+void func() {
+ __asm__ (
+ "pushq $0x10;"
+ ".cfi_def_cfa_offset 16;"
+ "jmp label;"
+ "movq $0x48, %rax;"
+"label: subq $0x38, %rax;"
+ "movq $0x48, %rcx;"
+ "movq $0x48, %rdx;"
+ "movq $0x48, %rax;"
+ "popq %rax;"
+ );
+
+}
+
+
+int main(int argc, char const *argv[])
+{
+ func();
+}
\ No newline at end of file
More information about the lldb-commits
mailing list