summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test
diff options
context:
space:
mode:
authorDimitar Vlahovski <dvlahovski@google.com>2016-11-01 15:48:24 +0000
committerDimitar Vlahovski <dvlahovski@google.com>2016-11-01 15:48:24 +0000
commit5a19c0cc50160b6475c431936e250fbc1aa4a5f6 (patch)
treecd52f8de99416eac06c677b73d4123f5717fa8d5 /lldb/packages/Python/lldbsuite/test
parent8a915ed644b910ae9d7d2aef7ad491791fbd4944 (diff)
downloadbcm5719-llvm-5a19c0cc50160b6475c431936e250fbc1aa4a5f6.tar.gz
bcm5719-llvm-5a19c0cc50160b6475c431936e250fbc1aa4a5f6.zip
Minidump plugin: Fix flaky test
Summary: One of the tests was flaky, because similarly to https://reviews.llvm.org/D18697 (rL265391) - if there is a process running which is with the same PID as in the core file, the minidump core file debugging will fail, because we get some information from the running process. The fix is routing the ProcessInfo requests through the Process class and overriding it in ProcessMinidump to return correct data. Reviewers: labath Subscribers: lldb-commits, beanz Differential Revision: https://reviews.llvm.org/D26193 llvm-svn: 285698
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test')
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py76
1 files changed, 68 insertions, 8 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
index 8e839a6f05b..4691b019097 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
@@ -5,6 +5,7 @@ Test basics of Minidump debugging.
from __future__ import print_function
from six import iteritems
+import shutil
import lldb
from lldbsuite.test.decorators import *
@@ -18,6 +19,10 @@ class MiniDumpNewTestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
+ _linux_x86_64_pid = 29917
+ _linux_x86_64_not_crashed_pid = 29939
+ _linux_x86_64_not_crashed_pid_offset = 0xD967
+
def test_process_info_in_minidump(self):
"""Test that lldb can read the process information from the Minidump."""
# target create -c linux-x86_64.dmp
@@ -26,7 +31,7 @@ class MiniDumpNewTestCase(TestBase):
self.process = self.target.LoadCore("linux-x86_64.dmp")
self.assertTrue(self.process, PROCESS_IS_VALID)
self.assertEqual(self.process.GetNumThreads(), 1)
- self.assertEqual(self.process.GetProcessID(), 29917)
+ self.assertEqual(self.process.GetProcessID(), self._linux_x86_64_pid)
def test_thread_info_in_minidump(self):
"""Test that lldb can read the thread information from the Minidump."""
@@ -49,6 +54,7 @@ class MiniDumpNewTestCase(TestBase):
self.target = self.dbg.GetSelectedTarget()
self.process = self.target.LoadCore("linux-x86_64.dmp")
self.assertEqual(self.process.GetNumThreads(), 1)
+ self.assertEqual(self.process.GetProcessID(), self._linux_x86_64_pid)
thread = self.process.GetThreadAtIndex(0)
# frame #0: linux-x86_64`crash()
# frame #1: linux-x86_64`_start
@@ -61,7 +67,8 @@ class MiniDumpNewTestCase(TestBase):
self.assertEqual(pc, eip.GetValueAsUnsigned())
def test_snapshot_minidump(self):
- """Test that if we load a snapshot minidump file (meaning the process did not crash) there is no stop reason."""
+ """Test that if we load a snapshot minidump file (meaning the process
+ did not crash) there is no stop reason."""
# target create -c linux-x86_64_not_crashed.dmp
self.dbg.CreateTarget(None)
self.target = self.dbg.GetSelectedTarget()
@@ -72,14 +79,13 @@ class MiniDumpNewTestCase(TestBase):
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, None)
- def test_deeper_stack_in_minidump(self):
- """Test that we can examine a more interesting stack in a Minidump."""
- # Launch with the Minidump, and inspect the stack.
- # target create linux-x86_64_not_crashed -c linux-x86_64_not_crashed.dmp
- target = self.dbg.CreateTarget("linux-x86_64_not_crashed")
- process = target.LoadCore("linux-x86_64_not_crashed.dmp")
+ def do_test_deeper_stack(self, binary, core, pid):
+ target = self.dbg.CreateTarget(binary)
+ process = target.LoadCore(core)
thread = process.GetThreadAtIndex(0)
+ self.assertEqual(process.GetProcessID(), pid)
+
expected_stack = {1: 'bar', 2: 'foo', 3: '_start'}
self.assertGreaterEqual(thread.GetNumFrames(), len(expected_stack))
for index, name in iteritems(expected_stack):
@@ -88,6 +94,60 @@ class MiniDumpNewTestCase(TestBase):
function_name = frame.GetFunctionName()
self.assertTrue(name in function_name)
+ def test_deeper_stack_in_minidump(self):
+ """Test that we can examine a more interesting stack in a Minidump."""
+ # Launch with the Minidump, and inspect the stack.
+ # target create linux-x86_64_not_crashed -c linux-x86_64_not_crashed.dmp
+ self.do_test_deeper_stack("linux-x86_64_not_crashed",
+ "linux-x86_64_not_crashed.dmp",
+ self._linux_x86_64_not_crashed_pid)
+
+ def do_change_pid_in_minidump(self, core, newcore, offset, oldpid, newpid):
+ """ This assumes that the minidump is breakpad generated on Linux -
+ meaning that the PID in the file will be an ascii string part of
+ /proc/PID/status which is written in the file
+ """
+ shutil.copyfile(core, newcore)
+ with open(newcore, "r+") as f:
+ f.seek(offset)
+ self.assertEqual(f.read(5), oldpid)
+
+ f.seek(offset)
+ if len(newpid) < len(oldpid):
+ newpid += " " * (len(oldpid) - len(newpid))
+ newpid += "\n"
+ f.write(newpid)
+
+ def test_deeper_stack_in_minidump_with_same_pid_running(self):
+ """Test that we read the information from the core correctly even if we
+ have a running process with the same PID"""
+ try:
+ self.do_change_pid_in_minidump("linux-x86_64_not_crashed.dmp",
+ "linux-x86_64_not_crashed-pid.dmp",
+ self._linux_x86_64_not_crashed_pid_offset,
+ str(self._linux_x86_64_not_crashed_pid),
+ str(os.getpid()))
+ self.do_test_deeper_stack("linux-x86_64_not_crashed",
+ "linux-x86_64_not_crashed-pid.dmp",
+ os.getpid())
+ finally:
+ self.RemoveTempFile("linux-x86_64_not_crashed-pid.dmp")
+
+ def test_two_cores_same_pid(self):
+ """Test that we handle the situation if we have two core files with the same PID """
+ try:
+ self.do_change_pid_in_minidump("linux-x86_64_not_crashed.dmp",
+ "linux-x86_64_not_crashed-pid.dmp",
+ self._linux_x86_64_not_crashed_pid_offset,
+ str(self._linux_x86_64_not_crashed_pid),
+ str(self._linux_x86_64_pid))
+ self.do_test_deeper_stack("linux-x86_64_not_crashed",
+ "linux-x86_64_not_crashed-pid.dmp",
+ self._linux_x86_64_pid)
+ self.test_stack_info_in_minidump()
+ finally:
+ self.RemoveTempFile("linux-x86_64_not_crashed-pid.dmp")
+
def test_local_variables_in_minidump(self):
"""Test that we can examine local variables in a Minidump."""
# Launch with the Minidump, and inspect a local variable.
OpenPOWER on IntegriCloud