forked from OSchip/llvm-project
[lldb] Improve the error message in run_to_breakpoint_do_run
Improve the error message when we fail to hit the initial breakpoint in run_to_breakpoint_do_run. In addition to the process state, we now also report the exit code and reason (if the process exited) as well as the inferior's output. Differential revision: https://reviews.llvm.org/D111978
This commit is contained in:
parent
75e551e5d8
commit
ec48a0df91
|
@ -235,7 +235,7 @@ def state_type_to_str(enum):
|
|||
elif enum == lldb.eStateSuspended:
|
||||
return "suspended"
|
||||
else:
|
||||
raise Exception("Unknown StateType enum")
|
||||
raise Exception("Unknown StateType enum: " + str(enum))
|
||||
|
||||
|
||||
def stop_reason_to_str(enum):
|
||||
|
@ -945,7 +945,22 @@ def run_to_breakpoint_do_run(test, target, bkpt, launch_info = None,
|
|||
test.assertFalse(error.Fail(),
|
||||
"Process launch failed: %s" % (error.GetCString()))
|
||||
|
||||
test.assertState(process.GetState(), lldb.eStateStopped)
|
||||
def processStateInfo(process):
|
||||
info = "state: {}".format(state_type_to_str(process.state))
|
||||
if process.state == lldb.eStateExited:
|
||||
info += ", exit code: {}".format(process.GetExitStatus())
|
||||
if process.exit_description:
|
||||
info += ", exit description: '{}'".format(process.exit_description)
|
||||
stdout = process.GetSTDOUT(999)
|
||||
if stdout:
|
||||
info += ", stdout: '{}'".format(stdout)
|
||||
stderr = process.GetSTDERR(999)
|
||||
if stderr:
|
||||
info += ", stderr: '{}'".format(stderr)
|
||||
return info
|
||||
|
||||
if process.state != lldb.eStateStopped:
|
||||
test.fail("Test process is not stopped at breakpoint: {}".format(processStateInfo(process)))
|
||||
|
||||
# Frame #0 should be at our breakpoint.
|
||||
threads = get_threads_stopped_at_breakpoint(
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
CXX_SOURCES := main.cpp
|
||||
|
||||
include Makefile.rules
|
|
@ -0,0 +1,27 @@
|
|||
"""
|
||||
Tests lldbutil's behavior when running to a source breakpoint fails.
|
||||
"""
|
||||
|
||||
import lldb
|
||||
import lldbsuite.test.lldbutil as lldbutil
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test.decorators import *
|
||||
|
||||
|
||||
class LLDBUtilFailedToHitBreakpointTest(TestBase):
|
||||
|
||||
NO_DEBUG_INFO_TESTCASE = True
|
||||
|
||||
@expectedFailureAll(oslist=["windows"])
|
||||
def test_error_message(self):
|
||||
"""
|
||||
Tests that run_to_source_breakpoint prints the right error message
|
||||
when failing to hit the wanted breakpoint.
|
||||
"""
|
||||
self.build()
|
||||
with self.assertRaisesRegex(
|
||||
AssertionError,
|
||||
"Test process is not stopped at breakpoint: state: exited, exit code: 0, stdout: 'stdout_needlestderr_needle'"
|
||||
):
|
||||
lldbutil.run_to_source_breakpoint(self, "// break here",
|
||||
lldb.SBFileSpec("main.cpp"))
|
|
@ -0,0 +1,21 @@
|
|||
#include <iostream>
|
||||
#include <thread>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Print the string that the test looks for to make sure stdout and stderr
|
||||
// got recorded.
|
||||
std::cout << "stdout_needle" << std::flush;
|
||||
std::cerr << "stderr_needle" << std::flush;
|
||||
|
||||
// Work around a timing issue that sometimes prevents stderr from being
|
||||
// captured.
|
||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||
|
||||
// This is unreachable during normal test execution as we don't pass any
|
||||
// (or +100) arguments. This still needs to be theoretically reachable code
|
||||
// so that the compiler will generate code for this (that we can set a
|
||||
// breakpoint on).
|
||||
if (argc > 100)
|
||||
return 1; // break here
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue