Skip to content

Commit

Permalink
Fix for PrintStackTraces
Browse files Browse the repository at this point in the history
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

llvm-svn: 274750
  • Loading branch information
ravithejaintel committed Jul 7, 2016
1 parent 4446c21 commit b3b972a
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 0 deletions.
@@ -0,0 +1,7 @@
LEVEL = ../../../make

C_SOURCES := main.c

CFLAGS ?= -g -fomit-frame-pointer

include $(LEVEL)/Makefile.rules
@@ -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'])
@@ -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();
}

0 comments on commit b3b972a

Please sign in to comment.