[lldb] Improve user expression diagnostics (#123242)

This patch rewords some of the user expression diagnostics.

 - Differentiate between being interrupted and hitting a breakpoint.
- Use "expression execution" to make it more obvious that the diagnostic
is associated with the user expression.
 - Consistently use a colon instead of semicolons and commas.

rdar://143059974
This commit is contained in:
Jonas Devlieghere 2025-01-16 16:09:20 -08:00 committed by GitHub
parent 13c7617897
commit 8ac0aaaebb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 31 additions and 24 deletions

View File

@ -187,18 +187,22 @@ LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
if (execution_result == lldb::eExpressionInterrupted ||
execution_result == lldb::eExpressionHitBreakpoint) {
const char *error_desc = nullptr;
const char *explanation = execution_result == lldb::eExpressionInterrupted
? "was interrupted"
: "hit a breakpoint";
if (user_expression_plan) {
if (auto real_stop_info_sp = user_expression_plan->GetRealStopInfo())
error_desc = real_stop_info_sp->GetDescription();
}
if (error_desc)
diagnostic_manager.Printf(lldb::eSeverityError,
"Execution was interrupted, reason: %s.",
"Expression execution %s: %s.", explanation,
error_desc);
else
diagnostic_manager.PutString(lldb::eSeverityError,
"Execution was interrupted.");
diagnostic_manager.Printf(lldb::eSeverityError,
"Expression execution %s.", explanation);
if ((execution_result == lldb::eExpressionInterrupted &&
options.DoesUnwindOnError()) ||
@ -212,31 +216,35 @@ LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
user_expression_plan->TransferExpressionOwnership();
diagnostic_manager.AppendMessageToDiagnostic(
"The process has been left at the point where it was "
"interrupted, "
"use \"thread return -x\" to return to the state before "
"expression evaluation.");
"interrupted, use \"thread return -x\" to return to the state "
"before expression evaluation.");
}
return execution_result;
} else if (execution_result == lldb::eExpressionStoppedForDebug) {
}
if (execution_result == lldb::eExpressionStoppedForDebug) {
diagnostic_manager.PutString(
lldb::eSeverityInfo,
"Execution was halted at the first instruction of the expression "
"function because \"debug\" was requested.\n"
"Expression execution was halted at the first instruction of the "
"expression function because \"debug\" was requested.\n"
"Use \"thread return -x\" to return to the state before expression "
"evaluation.");
return execution_result;
} else if (execution_result == lldb::eExpressionThreadVanished) {
diagnostic_manager.Printf(
lldb::eSeverityError,
"Couldn't complete execution; the thread "
"on which the expression was being run: 0x%" PRIx64
" exited during its execution.",
expr_thread_id);
return execution_result;
} else if (execution_result != lldb::eExpressionCompleted) {
}
if (execution_result == lldb::eExpressionThreadVanished) {
diagnostic_manager.Printf(lldb::eSeverityError,
"Couldn't execute function; result was %s",
"Couldn't execute expression: the thread on "
"which the expression was being run (0x%" PRIx64
") exited during its execution.",
expr_thread_id);
return execution_result;
}
if (execution_result != lldb::eExpressionCompleted) {
diagnostic_manager.Printf(lldb::eSeverityError,
"Couldn't execute expression: result was %s",
toString(execution_result).c_str());
return execution_result;
}
@ -245,9 +253,9 @@ LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
if (FinalizeJITExecution(diagnostic_manager, exe_ctx, result,
function_stack_bottom, function_stack_top)) {
return lldb::eExpressionCompleted;
} else {
return lldb::eExpressionResultUnavailable;
}
return lldb::eExpressionResultUnavailable;
}
bool LLVMUserExpression::FinalizeJITExecution(

View File

@ -31,7 +31,7 @@ class ExprCommandCallStopContinueTestCase(TestBase):
self.expect(
"expr -i false -- returnsFive()",
error=True,
substrs=["Execution was interrupted, reason: breakpoint"],
substrs=["Expression execution hit a breakpoint: breakpoint"],
)
self.runCmd("continue", "Continue completed")

View File

@ -2,7 +2,6 @@
Test stopping at a breakpoint in an expression, and unwinding from there.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
@ -71,7 +70,7 @@ class UnwindFromExpressionTest(TestBase):
self.assertTrue(val.GetError().Fail(), "We did not complete the execution.")
error_str = val.GetError().GetCString()
self.assertIn(
"Execution was interrupted, reason: breakpoint",
"Expression execution hit a breakpoint: breakpoint",
error_str,
"And the reason was right.",
)