diff options
author | Dimitar Vlahovski <dvlahovski@google.com> | 2016-11-01 15:48:24 +0000 |
---|---|---|
committer | Dimitar Vlahovski <dvlahovski@google.com> | 2016-11-01 15:48:24 +0000 |
commit | 5a19c0cc50160b6475c431936e250fbc1aa4a5f6 (patch) | |
tree | cd52f8de99416eac06c677b73d4123f5717fa8d5 /lldb/packages/Python/lldbsuite/test | |
parent | 8a915ed644b910ae9d7d2aef7ad491791fbd4944 (diff) | |
download | bcm5719-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.py | 76 |
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. |