"""Test that lldb can create a stack-only corefile, and load the main binary."""
import os
import re
import subprocess
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class TestStackCorefile(TestBase):
@skipIfOutOfTreeDebugserver # newer debugserver required for these qMemoryRegionInfo types
@no_debug_info_test
@skipUnlessDarwin
@skipIfRemote
def test(self):
corefile = self.getBuildArtifact("process.core")
self.build()
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "// break here", lldb.SBFileSpec("main.c")
)
frame = thread.GetFrameAtIndex(0)
stack_int = frame.GetValueForVariablePath("stack_int")
heap_int = frame.GetValueForVariablePath("*heap_int")
stack_str = frame.GetValueForVariablePath("stack_str")
heap_str = frame.GetValueForVariablePath("heap_str")
self.assertEqual(stack_int.GetValueAsUnsigned(), 5)
self.assertEqual(heap_int.GetValueAsUnsigned(), 10)
self.assertEqual(stack_str.summary, '"stack string"')
self.assertEqual(heap_str.summary, '"heap string"')
self.runCmd("process save-core -s stack " + corefile)
process.Kill()
self.dbg.DeleteTarget(target)
# Now load the corefile
target = self.dbg.CreateTarget("")
process = target.LoadCore(corefile)
thread = process.GetSelectedThread()
self.assertTrue(process.IsValid())
self.assertTrue(process.GetSelectedThread().IsValid())
if self.TraceOn():
self.runCmd("image list")
self.runCmd("bt")
self.runCmd("fr v")
num_modules = target.GetNumModules()
# We should only have the a.out binary and possibly
# the libdyld.dylib. Extra libraries loaded means
# extra LC_NOTE and unnecessarily large corefile.
self.assertTrue(num_modules == 1 or num_modules == 2)
# The heap variables should be unavailable now.
frame = thread.GetFrameAtIndex(0)
stack_int = frame.GetValueForVariablePath("stack_int")
heap_int = frame.GetValueForVariablePath("*heap_int")
stack_str = frame.GetValueForVariablePath("stack_str")
heap_str = frame.GetValueForVariablePath("heap_str")
## The heap SBValues both come back as IsValid()==true,
## which I'm not so sure is a great/correct thing --
## it hides the memory read error that actually happened,
## and we don't have a real value.
self.assertEqual(stack_int.GetValueAsUnsigned(), 5)
self.assertEqual(heap_int.GetValueAsUnsigned(), 0)
self.assertEqual(stack_str.summary, '"stack string"')
self.assertEqual(heap_str.summary, '""')