StopInfo.cpp revision 360784
1//===-- StopInfo.cpp --------------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#include <string> 10 11#include "lldb/Breakpoint/Breakpoint.h" 12#include "lldb/Breakpoint/BreakpointLocation.h" 13#include "lldb/Breakpoint/StoppointCallbackContext.h" 14#include "lldb/Breakpoint/Watchpoint.h" 15#include "lldb/Core/Debugger.h" 16#include "lldb/Core/ValueObject.h" 17#include "lldb/Expression/UserExpression.h" 18#include "lldb/Target/Process.h" 19#include "lldb/Target/StopInfo.h" 20#include "lldb/Target/Target.h" 21#include "lldb/Target/Thread.h" 22#include "lldb/Target/ThreadPlan.h" 23#include "lldb/Target/UnixSignals.h" 24#include "lldb/Utility/Log.h" 25#include "lldb/Utility/StreamString.h" 26 27using namespace lldb; 28using namespace lldb_private; 29 30StopInfo::StopInfo(Thread &thread, uint64_t value) 31 : m_thread_wp(thread.shared_from_this()), 32 m_stop_id(thread.GetProcess()->GetStopID()), 33 m_resume_id(thread.GetProcess()->GetResumeID()), m_value(value), 34 m_description(), m_override_should_notify(eLazyBoolCalculate), 35 m_override_should_stop(eLazyBoolCalculate), m_extended_info() {} 36 37bool StopInfo::IsValid() const { 38 ThreadSP thread_sp(m_thread_wp.lock()); 39 if (thread_sp) 40 return thread_sp->GetProcess()->GetStopID() == m_stop_id; 41 return false; 42} 43 44void StopInfo::MakeStopInfoValid() { 45 ThreadSP thread_sp(m_thread_wp.lock()); 46 if (thread_sp) { 47 m_stop_id = thread_sp->GetProcess()->GetStopID(); 48 m_resume_id = thread_sp->GetProcess()->GetResumeID(); 49 } 50} 51 52bool StopInfo::HasTargetRunSinceMe() { 53 ThreadSP thread_sp(m_thread_wp.lock()); 54 55 if (thread_sp) { 56 lldb::StateType ret_type = thread_sp->GetProcess()->GetPrivateState(); 57 if (ret_type == eStateRunning) { 58 return true; 59 } else if (ret_type == eStateStopped) { 60 // This is a little tricky. We want to count "run and stopped again 61 // before you could ask this question as a "TRUE" answer to 62 // HasTargetRunSinceMe. But we don't want to include any running of the 63 // target done for expressions. So we track both resumes, and resumes 64 // caused by expressions, and check if there are any resumes 65 // NOT caused 66 // by expressions. 67 68 uint32_t curr_resume_id = thread_sp->GetProcess()->GetResumeID(); 69 uint32_t last_user_expression_id = 70 thread_sp->GetProcess()->GetLastUserExpressionResumeID(); 71 if (curr_resume_id == m_resume_id) { 72 return false; 73 } else if (curr_resume_id > last_user_expression_id) { 74 return true; 75 } 76 } 77 } 78 return false; 79} 80 81// StopInfoBreakpoint 82 83namespace lldb_private { 84class StopInfoBreakpoint : public StopInfo { 85public: 86 StopInfoBreakpoint(Thread &thread, break_id_t break_id) 87 : StopInfo(thread, break_id), m_should_stop(false), 88 m_should_stop_is_valid(false), m_should_perform_action(true), 89 m_address(LLDB_INVALID_ADDRESS), m_break_id(LLDB_INVALID_BREAK_ID), 90 m_was_one_shot(false) { 91 StoreBPInfo(); 92 } 93 94 StopInfoBreakpoint(Thread &thread, break_id_t break_id, bool should_stop) 95 : StopInfo(thread, break_id), m_should_stop(should_stop), 96 m_should_stop_is_valid(true), m_should_perform_action(true), 97 m_address(LLDB_INVALID_ADDRESS), m_break_id(LLDB_INVALID_BREAK_ID), 98 m_was_one_shot(false) { 99 StoreBPInfo(); 100 } 101 102 ~StopInfoBreakpoint() override = default; 103 104 void StoreBPInfo() { 105 ThreadSP thread_sp(m_thread_wp.lock()); 106 if (thread_sp) { 107 BreakpointSiteSP bp_site_sp( 108 thread_sp->GetProcess()->GetBreakpointSiteList().FindByID(m_value)); 109 if (bp_site_sp) { 110 if (bp_site_sp->GetNumberOfOwners() == 1) { 111 BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(0); 112 if (bp_loc_sp) { 113 m_break_id = bp_loc_sp->GetBreakpoint().GetID(); 114 m_was_one_shot = bp_loc_sp->GetBreakpoint().IsOneShot(); 115 } 116 } 117 m_address = bp_site_sp->GetLoadAddress(); 118 } 119 } 120 } 121 122 bool IsValidForOperatingSystemThread(Thread &thread) override { 123 ProcessSP process_sp(thread.GetProcess()); 124 if (process_sp) { 125 BreakpointSiteSP bp_site_sp( 126 process_sp->GetBreakpointSiteList().FindByID(m_value)); 127 if (bp_site_sp) 128 return bp_site_sp->ValidForThisThread(&thread); 129 } 130 return false; 131 } 132 133 StopReason GetStopReason() const override { return eStopReasonBreakpoint; } 134 135 bool ShouldStopSynchronous(Event *event_ptr) override { 136 ThreadSP thread_sp(m_thread_wp.lock()); 137 if (thread_sp) { 138 if (!m_should_stop_is_valid) { 139 // Only check once if we should stop at a breakpoint 140 BreakpointSiteSP bp_site_sp( 141 thread_sp->GetProcess()->GetBreakpointSiteList().FindByID(m_value)); 142 if (bp_site_sp) { 143 ExecutionContext exe_ctx(thread_sp->GetStackFrameAtIndex(0)); 144 StoppointCallbackContext context(event_ptr, exe_ctx, true); 145 bp_site_sp->BumpHitCounts(); 146 m_should_stop = bp_site_sp->ShouldStop(&context); 147 } else { 148 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 149 150 LLDB_LOGF(log, 151 "Process::%s could not find breakpoint site id: %" PRId64 152 "...", 153 __FUNCTION__, m_value); 154 155 m_should_stop = true; 156 } 157 m_should_stop_is_valid = true; 158 } 159 return m_should_stop; 160 } 161 return false; 162 } 163 164 bool DoShouldNotify(Event *event_ptr) override { 165 ThreadSP thread_sp(m_thread_wp.lock()); 166 if (thread_sp) { 167 BreakpointSiteSP bp_site_sp( 168 thread_sp->GetProcess()->GetBreakpointSiteList().FindByID(m_value)); 169 if (bp_site_sp) { 170 bool all_internal = true; 171 172 for (uint32_t i = 0; i < bp_site_sp->GetNumberOfOwners(); i++) { 173 if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) { 174 all_internal = false; 175 break; 176 } 177 } 178 return !all_internal; 179 } 180 } 181 return true; 182 } 183 184 const char *GetDescription() override { 185 if (m_description.empty()) { 186 ThreadSP thread_sp(m_thread_wp.lock()); 187 if (thread_sp) { 188 BreakpointSiteSP bp_site_sp( 189 thread_sp->GetProcess()->GetBreakpointSiteList().FindByID(m_value)); 190 if (bp_site_sp) { 191 StreamString strm; 192 // If we have just hit an internal breakpoint, and it has a kind 193 // description, print that instead of the full breakpoint printing: 194 if (bp_site_sp->IsInternal()) { 195 size_t num_owners = bp_site_sp->GetNumberOfOwners(); 196 for (size_t idx = 0; idx < num_owners; idx++) { 197 const char *kind = bp_site_sp->GetOwnerAtIndex(idx) 198 ->GetBreakpoint() 199 .GetBreakpointKind(); 200 if (kind != nullptr) { 201 m_description.assign(kind); 202 return kind; 203 } 204 } 205 } 206 207 strm.Printf("breakpoint "); 208 bp_site_sp->GetDescription(&strm, eDescriptionLevelBrief); 209 m_description = strm.GetString(); 210 } else { 211 StreamString strm; 212 if (m_break_id != LLDB_INVALID_BREAK_ID) { 213 BreakpointSP break_sp = 214 thread_sp->GetProcess()->GetTarget().GetBreakpointByID( 215 m_break_id); 216 if (break_sp) { 217 if (break_sp->IsInternal()) { 218 const char *kind = break_sp->GetBreakpointKind(); 219 if (kind) 220 strm.Printf("internal %s breakpoint(%d).", kind, m_break_id); 221 else 222 strm.Printf("internal breakpoint(%d).", m_break_id); 223 } else { 224 strm.Printf("breakpoint %d.", m_break_id); 225 } 226 } else { 227 if (m_was_one_shot) 228 strm.Printf("one-shot breakpoint %d", m_break_id); 229 else 230 strm.Printf("breakpoint %d which has been deleted.", 231 m_break_id); 232 } 233 } else if (m_address == LLDB_INVALID_ADDRESS) 234 strm.Printf("breakpoint site %" PRIi64 235 " which has been deleted - unknown address", 236 m_value); 237 else 238 strm.Printf("breakpoint site %" PRIi64 239 " which has been deleted - was at 0x%" PRIx64, 240 m_value, m_address); 241 242 m_description = strm.GetString(); 243 } 244 } 245 } 246 return m_description.c_str(); 247 } 248 249protected: 250 bool ShouldStop(Event *event_ptr) override { 251 // This just reports the work done by PerformAction or the synchronous 252 // stop. It should only ever get called after they have had a chance to 253 // run. 254 assert(m_should_stop_is_valid); 255 return m_should_stop; 256 } 257 258 void PerformAction(Event *event_ptr) override { 259 if (!m_should_perform_action) 260 return; 261 m_should_perform_action = false; 262 bool internal_breakpoint = true; 263 264 ThreadSP thread_sp(m_thread_wp.lock()); 265 266 if (thread_sp) { 267 Log *log = lldb_private::GetLogIfAnyCategoriesSet( 268 LIBLLDB_LOG_BREAKPOINTS | LIBLLDB_LOG_STEP); 269 270 if (!thread_sp->IsValid()) { 271 // This shouldn't ever happen, but just in case, don't do more harm. 272 if (log) { 273 LLDB_LOGF(log, "PerformAction got called with an invalid thread."); 274 } 275 m_should_stop = true; 276 m_should_stop_is_valid = true; 277 return; 278 } 279 280 BreakpointSiteSP bp_site_sp( 281 thread_sp->GetProcess()->GetBreakpointSiteList().FindByID(m_value)); 282 std::unordered_set<break_id_t> precondition_breakpoints; 283 284 if (bp_site_sp) { 285 // Let's copy the owners list out of the site and store them in a local 286 // list. That way if one of the breakpoint actions changes the site, 287 // then we won't be operating on a bad list. 288 BreakpointLocationCollection site_locations; 289 size_t num_owners = bp_site_sp->CopyOwnersList(site_locations); 290 291 if (num_owners == 0) { 292 m_should_stop = true; 293 } else { 294 // We go through each location, and test first its precondition - 295 // this overrides everything. Note, we only do this once per 296 // breakpoint - not once per location... Then check the condition. 297 // If the condition says to stop, then we run the callback for that 298 // location. If that callback says to stop as well, then we set 299 // m_should_stop to true; we are going to stop. But we still want to 300 // give all the breakpoints whose conditions say we are going to stop 301 // a chance to run their callbacks. Of course if any callback 302 // restarts the target by putting "continue" in the callback, then 303 // we're going to restart, without running the rest of the callbacks. 304 // And in this case we will end up not stopping even if another 305 // location said we should stop. But that's better than not running 306 // all the callbacks. 307 308 m_should_stop = false; 309 310 // We don't select threads as we go through them testing breakpoint 311 // conditions and running commands. So we need to set the thread for 312 // expression evaluation here: 313 ThreadList::ExpressionExecutionThreadPusher thread_pusher(thread_sp); 314 315 ExecutionContext exe_ctx(thread_sp->GetStackFrameAtIndex(0)); 316 Process *process = exe_ctx.GetProcessPtr(); 317 if (process->GetModIDRef().IsLastResumeForUserExpression()) { 318 // If we are in the middle of evaluating an expression, don't run 319 // asynchronous breakpoint commands or expressions. That could 320 // lead to infinite recursion if the command or condition re-calls 321 // the function with this breakpoint. 322 // TODO: We can keep a list of the breakpoints we've seen while 323 // running expressions in the nested 324 // PerformAction calls that can arise when the action runs a 325 // function that hits another breakpoint, and only stop running 326 // commands when we see the same breakpoint hit a second time. 327 328 m_should_stop_is_valid = true; 329 330 // It is possible that the user has a breakpoint at the same site 331 // as the completed plan had (e.g. user has a breakpoint 332 // on a module entry point, and `ThreadPlanCallFunction` ends 333 // also there). We can't find an internal breakpoint in the loop 334 // later because it was already removed on the plan completion. 335 // So check if the plan was completed, and stop if so. 336 if (thread_sp->CompletedPlanOverridesBreakpoint()) { 337 m_should_stop = true; 338 thread_sp->ResetStopInfo(); 339 return; 340 } 341 342 LLDB_LOGF(log, "StopInfoBreakpoint::PerformAction - Hit a " 343 "breakpoint while running an expression," 344 " not running commands to avoid recursion."); 345 bool ignoring_breakpoints = 346 process->GetIgnoreBreakpointsInExpressions(); 347 if (ignoring_breakpoints) { 348 m_should_stop = false; 349 // Internal breakpoints will always stop. 350 for (size_t j = 0; j < num_owners; j++) { 351 lldb::BreakpointLocationSP bp_loc_sp = 352 bp_site_sp->GetOwnerAtIndex(j); 353 if (bp_loc_sp->GetBreakpoint().IsInternal()) { 354 m_should_stop = true; 355 break; 356 } 357 } 358 } else { 359 m_should_stop = true; 360 } 361 LLDB_LOGF(log, 362 "StopInfoBreakpoint::PerformAction - in expression, " 363 "continuing: %s.", 364 m_should_stop ? "true" : "false"); 365 process->GetTarget().GetDebugger().GetAsyncOutputStream()->Printf( 366 "Warning: hit breakpoint while running function, skipping " 367 "commands and conditions to prevent recursion.\n"); 368 return; 369 } 370 371 StoppointCallbackContext context(event_ptr, exe_ctx, false); 372 373 // For safety's sake let's also grab an extra reference to the 374 // breakpoint owners of the locations we're going to examine, since 375 // the locations are going to have to get back to their breakpoints, 376 // and the locations don't keep their owners alive. I'm just 377 // sticking the BreakpointSP's in a vector since I'm only using it to 378 // locally increment their retain counts. 379 380 std::vector<lldb::BreakpointSP> location_owners; 381 382 for (size_t j = 0; j < num_owners; j++) { 383 BreakpointLocationSP loc(site_locations.GetByIndex(j)); 384 location_owners.push_back(loc->GetBreakpoint().shared_from_this()); 385 } 386 387 for (size_t j = 0; j < num_owners; j++) { 388 lldb::BreakpointLocationSP bp_loc_sp = site_locations.GetByIndex(j); 389 StreamString loc_desc; 390 if (log) { 391 bp_loc_sp->GetDescription(&loc_desc, eDescriptionLevelBrief); 392 } 393 // If another action disabled this breakpoint or its location, then 394 // don't run the actions. 395 if (!bp_loc_sp->IsEnabled() || 396 !bp_loc_sp->GetBreakpoint().IsEnabled()) 397 continue; 398 399 // The breakpoint site may have many locations associated with it, 400 // not all of them valid for this thread. Skip the ones that 401 // aren't: 402 if (!bp_loc_sp->ValidForThisThread(thread_sp.get())) { 403 if (log) { 404 LLDB_LOGF(log, 405 "Breakpoint %s hit on thread 0x%llx but it was not " 406 "for this thread, continuing.", 407 loc_desc.GetData(), 408 static_cast<unsigned long long>(thread_sp->GetID())); 409 } 410 continue; 411 } 412 413 internal_breakpoint = bp_loc_sp->GetBreakpoint().IsInternal(); 414 415 // First run the precondition, but since the precondition is per 416 // breakpoint, only run it once per breakpoint. 417 std::pair<std::unordered_set<break_id_t>::iterator, bool> result = 418 precondition_breakpoints.insert( 419 bp_loc_sp->GetBreakpoint().GetID()); 420 if (!result.second) 421 continue; 422 423 bool precondition_result = 424 bp_loc_sp->GetBreakpoint().EvaluatePrecondition(context); 425 if (!precondition_result) 426 continue; 427 428 // Next run the condition for the breakpoint. If that says we 429 // should stop, then we'll run the callback for the breakpoint. If 430 // the callback says we shouldn't stop that will win. 431 432 if (bp_loc_sp->GetConditionText() != nullptr) { 433 Status condition_error; 434 bool condition_says_stop = 435 bp_loc_sp->ConditionSaysStop(exe_ctx, condition_error); 436 437 if (!condition_error.Success()) { 438 Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger(); 439 StreamSP error_sp = debugger.GetAsyncErrorStream(); 440 error_sp->Printf("Stopped due to an error evaluating condition " 441 "of breakpoint "); 442 bp_loc_sp->GetDescription(error_sp.get(), 443 eDescriptionLevelBrief); 444 error_sp->Printf(": \"%s\"", bp_loc_sp->GetConditionText()); 445 error_sp->EOL(); 446 const char *err_str = 447 condition_error.AsCString("<Unknown Error>"); 448 LLDB_LOGF(log, "Error evaluating condition: \"%s\"\n", err_str); 449 450 error_sp->PutCString(err_str); 451 error_sp->EOL(); 452 error_sp->Flush(); 453 } else { 454 LLDB_LOGF(log, 455 "Condition evaluated for breakpoint %s on thread " 456 "0x%llx conditon_says_stop: %i.", 457 loc_desc.GetData(), 458 static_cast<unsigned long long>(thread_sp->GetID()), 459 condition_says_stop); 460 if (!condition_says_stop) { 461 // We don't want to increment the hit count of breakpoints if 462 // the condition fails. We've already bumped it by the time 463 // we get here, so undo the bump: 464 bp_loc_sp->UndoBumpHitCount(); 465 continue; 466 } 467 } 468 } 469 470 // Check the auto-continue bit on the location, do this before the 471 // callback since it may change this, but that would be for the 472 // NEXT hit. Note, you might think you could check auto-continue 473 // before the condition, and not evaluate the condition if it says 474 // to continue. But failing the condition means the breakpoint was 475 // effectively NOT HIT. So these two states are different. 476 bool auto_continue_says_stop = true; 477 if (bp_loc_sp->IsAutoContinue()) 478 { 479 LLDB_LOGF(log, 480 "Continuing breakpoint %s as AutoContinue was set.", 481 loc_desc.GetData()); 482 // We want this stop reported, so you will know we auto-continued 483 // but only for external breakpoints: 484 if (!internal_breakpoint) 485 thread_sp->SetShouldReportStop(eVoteYes); 486 auto_continue_says_stop = false; 487 } 488 489 bool callback_says_stop = true; 490 491 // FIXME: For now the callbacks have to run in async mode - the 492 // first time we restart we need 493 // to get out of there. So set it here. 494 // When we figure out how to nest breakpoint hits then this will 495 // change. 496 497 Debugger &debugger = thread_sp->CalculateTarget()->GetDebugger(); 498 bool old_async = debugger.GetAsyncExecution(); 499 debugger.SetAsyncExecution(true); 500 501 callback_says_stop = bp_loc_sp->InvokeCallback(&context); 502 503 debugger.SetAsyncExecution(old_async); 504 505 if (callback_says_stop && auto_continue_says_stop) 506 m_should_stop = true; 507 508 // If we are going to stop for this breakpoint, then remove the 509 // breakpoint. 510 if (callback_says_stop && bp_loc_sp && 511 bp_loc_sp->GetBreakpoint().IsOneShot()) { 512 thread_sp->GetProcess()->GetTarget().RemoveBreakpointByID( 513 bp_loc_sp->GetBreakpoint().GetID()); 514 } 515 // Also make sure that the callback hasn't continued the target. If 516 // it did, when we'll set m_should_start to false and get out of 517 // here. 518 if (HasTargetRunSinceMe()) { 519 m_should_stop = false; 520 break; 521 } 522 } 523 } 524 // We've figured out what this stop wants to do, so mark it as valid so 525 // we don't compute it again. 526 m_should_stop_is_valid = true; 527 } else { 528 m_should_stop = true; 529 m_should_stop_is_valid = true; 530 Log *log_process( 531 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 532 533 LLDB_LOGF(log_process, 534 "Process::%s could not find breakpoint site id: %" PRId64 535 "...", 536 __FUNCTION__, m_value); 537 } 538 539 if ((!m_should_stop || internal_breakpoint) && 540 thread_sp->CompletedPlanOverridesBreakpoint()) { 541 542 // Override should_stop decision when we have completed step plan 543 // additionally to the breakpoint 544 m_should_stop = true; 545 546 // We know we're stopping for a completed plan and we don't want to 547 // show the breakpoint stop, so compute the public stop info immediately 548 // here. 549 thread_sp->CalculatePublicStopInfo(); 550 } 551 552 LLDB_LOGF(log, 553 "Process::%s returning from action with m_should_stop: %d.", 554 __FUNCTION__, m_should_stop); 555 } 556 } 557 558private: 559 bool m_should_stop; 560 bool m_should_stop_is_valid; 561 bool m_should_perform_action; // Since we are trying to preserve the "state" 562 // of the system even if we run functions 563 // etc. behind the users backs, we need to make sure we only REALLY perform 564 // the action once. 565 lldb::addr_t m_address; // We use this to capture the breakpoint site address 566 // when we create the StopInfo, 567 // in case somebody deletes it between the time the StopInfo is made and the 568 // description is asked for. 569 lldb::break_id_t m_break_id; 570 bool m_was_one_shot; 571}; 572 573// StopInfoWatchpoint 574 575class StopInfoWatchpoint : public StopInfo { 576public: 577 // Make sure watchpoint is properly disabled and subsequently enabled while 578 // performing watchpoint actions. 579 class WatchpointSentry { 580 public: 581 WatchpointSentry(ProcessSP p_sp, WatchpointSP w_sp) : process_sp(p_sp), 582 watchpoint_sp(w_sp) { 583 if (process_sp && watchpoint_sp) { 584 const bool notify = false; 585 watchpoint_sp->TurnOnEphemeralMode(); 586 process_sp->DisableWatchpoint(watchpoint_sp.get(), notify); 587 process_sp->AddPreResumeAction(SentryPreResumeAction, this); 588 } 589 } 590 591 void DoReenable() { 592 if (process_sp && watchpoint_sp) { 593 bool was_disabled = watchpoint_sp->IsDisabledDuringEphemeralMode(); 594 watchpoint_sp->TurnOffEphemeralMode(); 595 const bool notify = false; 596 if (was_disabled) { 597 process_sp->DisableWatchpoint(watchpoint_sp.get(), notify); 598 } else { 599 process_sp->EnableWatchpoint(watchpoint_sp.get(), notify); 600 } 601 } 602 } 603 604 ~WatchpointSentry() { 605 DoReenable(); 606 if (process_sp) 607 process_sp->ClearPreResumeAction(SentryPreResumeAction, this); 608 } 609 610 static bool SentryPreResumeAction(void *sentry_void) { 611 WatchpointSentry *sentry = (WatchpointSentry *) sentry_void; 612 sentry->DoReenable(); 613 return true; 614 } 615 616 private: 617 ProcessSP process_sp; 618 WatchpointSP watchpoint_sp; 619 }; 620 621 StopInfoWatchpoint(Thread &thread, break_id_t watch_id, 622 lldb::addr_t watch_hit_addr) 623 : StopInfo(thread, watch_id), m_should_stop(false), 624 m_should_stop_is_valid(false), m_watch_hit_addr(watch_hit_addr) {} 625 626 ~StopInfoWatchpoint() override = default; 627 628 StopReason GetStopReason() const override { return eStopReasonWatchpoint; } 629 630 const char *GetDescription() override { 631 if (m_description.empty()) { 632 StreamString strm; 633 strm.Printf("watchpoint %" PRIi64, m_value); 634 m_description = strm.GetString(); 635 } 636 return m_description.c_str(); 637 } 638 639protected: 640 bool ShouldStopSynchronous(Event *event_ptr) override { 641 // ShouldStop() method is idempotent and should not affect hit count. See 642 // Process::RunPrivateStateThread()->Process()->HandlePrivateEvent() 643 // -->Process()::ShouldBroadcastEvent()->ThreadList::ShouldStop()-> 644 // Thread::ShouldStop()->ThreadPlanBase::ShouldStop()-> 645 // StopInfoWatchpoint::ShouldStop() and 646 // Event::DoOnRemoval()->Process::ProcessEventData::DoOnRemoval()-> 647 // StopInfoWatchpoint::PerformAction(). 648 if (m_should_stop_is_valid) 649 return m_should_stop; 650 651 ThreadSP thread_sp(m_thread_wp.lock()); 652 if (thread_sp) { 653 WatchpointSP wp_sp( 654 thread_sp->CalculateTarget()->GetWatchpointList().FindByID( 655 GetValue())); 656 if (wp_sp) { 657 // Check if we should stop at a watchpoint. 658 ExecutionContext exe_ctx(thread_sp->GetStackFrameAtIndex(0)); 659 StoppointCallbackContext context(event_ptr, exe_ctx, true); 660 m_should_stop = wp_sp->ShouldStop(&context); 661 } else { 662 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 663 664 LLDB_LOGF(log, 665 "Process::%s could not find watchpoint location id: %" PRId64 666 "...", 667 __FUNCTION__, GetValue()); 668 669 m_should_stop = true; 670 } 671 } 672 m_should_stop_is_valid = true; 673 return m_should_stop; 674 } 675 676 bool ShouldStop(Event *event_ptr) override { 677 // This just reports the work done by PerformAction or the synchronous 678 // stop. It should only ever get called after they have had a chance to 679 // run. 680 assert(m_should_stop_is_valid); 681 return m_should_stop; 682 } 683 684 void PerformAction(Event *event_ptr) override { 685 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS); 686 // We're going to calculate if we should stop or not in some way during the 687 // course of this code. Also by default we're going to stop, so set that 688 // here. 689 m_should_stop = true; 690 691 692 ThreadSP thread_sp(m_thread_wp.lock()); 693 if (thread_sp) { 694 695 WatchpointSP wp_sp( 696 thread_sp->CalculateTarget()->GetWatchpointList().FindByID( 697 GetValue())); 698 if (wp_sp) { 699 ExecutionContext exe_ctx(thread_sp->GetStackFrameAtIndex(0)); 700 ProcessSP process_sp = exe_ctx.GetProcessSP(); 701 702 { 703 // check if this process is running on an architecture where 704 // watchpoints trigger before the associated instruction runs. if so, 705 // disable the WP, single-step and then re-enable the watchpoint 706 if (process_sp) { 707 uint32_t num; 708 bool wp_triggers_after; 709 710 if (process_sp->GetWatchpointSupportInfo(num, wp_triggers_after) 711 .Success()) { 712 if (!wp_triggers_after) { 713 // We need to preserve the watch_index before watchpoint is 714 // disable. Since Watchpoint::SetEnabled will clear the watch 715 // index. This will fix TestWatchpointIter failure 716 Watchpoint *wp = wp_sp.get(); 717 uint32_t watch_index = wp->GetHardwareIndex(); 718 process_sp->DisableWatchpoint(wp, false); 719 StopInfoSP stored_stop_info_sp = thread_sp->GetStopInfo(); 720 assert(stored_stop_info_sp.get() == this); 721 722 Status new_plan_status; 723 ThreadPlanSP new_plan_sp( 724 thread_sp->QueueThreadPlanForStepSingleInstruction( 725 false, // step-over 726 false, // abort_other_plans 727 true, // stop_other_threads 728 new_plan_status)); 729 if (new_plan_sp && new_plan_status.Success()) { 730 new_plan_sp->SetIsMasterPlan(true); 731 new_plan_sp->SetOkayToDiscard(false); 732 new_plan_sp->SetPrivate(true); 733 } 734 process_sp->GetThreadList().SetSelectedThreadByID( 735 thread_sp->GetID()); 736 process_sp->ResumeSynchronous(nullptr); 737 process_sp->GetThreadList().SetSelectedThreadByID( 738 thread_sp->GetID()); 739 thread_sp->SetStopInfo(stored_stop_info_sp); 740 process_sp->EnableWatchpoint(wp, false); 741 wp->SetHardwareIndex(watch_index); 742 } 743 } 744 } 745 } 746 747 // This sentry object makes sure the current watchpoint is disabled 748 // while performing watchpoint actions, and it is then enabled after we 749 // are finished. 750 WatchpointSentry sentry(process_sp, wp_sp); 751 752 /* 753 * MIPS: Last 3bits of the watchpoint address are masked by the kernel. 754 * For example: 755 * 'n' is at 0x120010d00 and 'm' is 0x120010d04. When a watchpoint is 756 * set at 'm', then 757 * watch exception is generated even when 'n' is read/written. To handle 758 * this case, 759 * server emulates the instruction at PC and finds the base address of 760 * the load/store 761 * instruction and appends it in the description of the stop-info 762 * packet. If watchpoint 763 * is not set on this address by user then this do not stop. 764 */ 765 if (m_watch_hit_addr != LLDB_INVALID_ADDRESS) { 766 WatchpointSP wp_hit_sp = 767 thread_sp->CalculateTarget()->GetWatchpointList().FindByAddress( 768 m_watch_hit_addr); 769 if (!wp_hit_sp) { 770 m_should_stop = false; 771 wp_sp->IncrementFalseAlarmsAndReviseHitCount(); 772 } 773 } 774 775 // TODO: This condition should be checked in the synchronous part of the 776 // watchpoint code 777 // (Watchpoint::ShouldStop), so that we avoid pulling an event even if 778 // the watchpoint fails the ignore count condition. It is moved here 779 // temporarily, because for archs with 780 // watchpoint_exceptions_received=before, the code in the previous 781 // lines takes care of moving the inferior to next PC. We have to check 782 // the ignore count condition after this is done, otherwise we will hit 783 // same watchpoint multiple times until we pass ignore condition, but 784 // we won't actually be ignoring them. 785 if (wp_sp->GetHitCount() <= wp_sp->GetIgnoreCount()) 786 m_should_stop = false; 787 788 Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger(); 789 790 if (m_should_stop && wp_sp->GetConditionText() != nullptr) { 791 // We need to make sure the user sees any parse errors in their 792 // condition, so we'll hook the constructor errors up to the 793 // debugger's Async I/O. 794 ExpressionResults result_code; 795 EvaluateExpressionOptions expr_options; 796 expr_options.SetUnwindOnError(true); 797 expr_options.SetIgnoreBreakpoints(true); 798 ValueObjectSP result_value_sp; 799 Status error; 800 result_code = UserExpression::Evaluate( 801 exe_ctx, expr_options, wp_sp->GetConditionText(), 802 llvm::StringRef(), result_value_sp, error); 803 804 if (result_code == eExpressionCompleted) { 805 if (result_value_sp) { 806 Scalar scalar_value; 807 if (result_value_sp->ResolveValue(scalar_value)) { 808 if (scalar_value.ULongLong(1) == 0) { 809 // We have been vetoed. This takes precedence over querying 810 // the watchpoint whether it should stop (aka ignore count 811 // and friends). See also StopInfoWatchpoint::ShouldStop() 812 // as well as Process::ProcessEventData::DoOnRemoval(). 813 m_should_stop = false; 814 } else 815 m_should_stop = true; 816 LLDB_LOGF(log, 817 "Condition successfully evaluated, result is %s.\n", 818 m_should_stop ? "true" : "false"); 819 } else { 820 m_should_stop = true; 821 LLDB_LOGF( 822 log, 823 "Failed to get an integer result from the expression."); 824 } 825 } 826 } else { 827 StreamSP error_sp = debugger.GetAsyncErrorStream(); 828 error_sp->Printf( 829 "Stopped due to an error evaluating condition of watchpoint "); 830 wp_sp->GetDescription(error_sp.get(), eDescriptionLevelBrief); 831 error_sp->Printf(": \"%s\"", wp_sp->GetConditionText()); 832 error_sp->EOL(); 833 const char *err_str = error.AsCString("<Unknown Error>"); 834 LLDB_LOGF(log, "Error evaluating condition: \"%s\"\n", err_str); 835 836 error_sp->PutCString(err_str); 837 error_sp->EOL(); 838 error_sp->Flush(); 839 // If the condition fails to be parsed or run, we should stop. 840 m_should_stop = true; 841 } 842 } 843 844 // If the condition says to stop, we run the callback to further decide 845 // whether to stop. 846 if (m_should_stop) { 847 // FIXME: For now the callbacks have to run in async mode - the 848 // first time we restart we need 849 // to get out of there. So set it here. 850 // When we figure out how to nest watchpoint hits then this will 851 // change. 852 853 bool old_async = debugger.GetAsyncExecution(); 854 debugger.SetAsyncExecution(true); 855 856 StoppointCallbackContext context(event_ptr, exe_ctx, false); 857 bool stop_requested = wp_sp->InvokeCallback(&context); 858 859 debugger.SetAsyncExecution(old_async); 860 861 // Also make sure that the callback hasn't continued the target. If 862 // it did, when we'll set m_should_stop to false and get out of here. 863 if (HasTargetRunSinceMe()) 864 m_should_stop = false; 865 866 if (m_should_stop && !stop_requested) { 867 // We have been vetoed by the callback mechanism. 868 m_should_stop = false; 869 } 870 } 871 // Finally, if we are going to stop, print out the new & old values: 872 if (m_should_stop) { 873 wp_sp->CaptureWatchedValue(exe_ctx); 874 875 Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger(); 876 StreamSP output_sp = debugger.GetAsyncOutputStream(); 877 wp_sp->DumpSnapshots(output_sp.get()); 878 output_sp->EOL(); 879 output_sp->Flush(); 880 } 881 882 } else { 883 Log *log_process( 884 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 885 886 LLDB_LOGF(log_process, 887 "Process::%s could not find watchpoint id: %" PRId64 "...", 888 __FUNCTION__, m_value); 889 } 890 LLDB_LOGF(log, 891 "Process::%s returning from action with m_should_stop: %d.", 892 __FUNCTION__, m_should_stop); 893 894 m_should_stop_is_valid = true; 895 } 896 } 897 898private: 899 bool m_should_stop; 900 bool m_should_stop_is_valid; 901 lldb::addr_t m_watch_hit_addr; 902}; 903 904// StopInfoUnixSignal 905 906class StopInfoUnixSignal : public StopInfo { 907public: 908 StopInfoUnixSignal(Thread &thread, int signo, const char *description) 909 : StopInfo(thread, signo) { 910 SetDescription(description); 911 } 912 913 ~StopInfoUnixSignal() override = default; 914 915 StopReason GetStopReason() const override { return eStopReasonSignal; } 916 917 bool ShouldStopSynchronous(Event *event_ptr) override { 918 ThreadSP thread_sp(m_thread_wp.lock()); 919 if (thread_sp) 920 return thread_sp->GetProcess()->GetUnixSignals()->GetShouldStop(m_value); 921 return false; 922 } 923 924 bool ShouldStop(Event *event_ptr) override { 925 ThreadSP thread_sp(m_thread_wp.lock()); 926 if (thread_sp) 927 return thread_sp->GetProcess()->GetUnixSignals()->GetShouldStop(m_value); 928 return false; 929 } 930 931 // If should stop returns false, check if we should notify of this event 932 bool DoShouldNotify(Event *event_ptr) override { 933 ThreadSP thread_sp(m_thread_wp.lock()); 934 if (thread_sp) { 935 bool should_notify = 936 thread_sp->GetProcess()->GetUnixSignals()->GetShouldNotify(m_value); 937 if (should_notify) { 938 StreamString strm; 939 strm.Printf( 940 "thread %d received signal: %s", thread_sp->GetIndexID(), 941 thread_sp->GetProcess()->GetUnixSignals()->GetSignalAsCString( 942 m_value)); 943 Process::ProcessEventData::AddRestartedReason(event_ptr, 944 strm.GetData()); 945 } 946 return should_notify; 947 } 948 return true; 949 } 950 951 void WillResume(lldb::StateType resume_state) override { 952 ThreadSP thread_sp(m_thread_wp.lock()); 953 if (thread_sp) { 954 if (!thread_sp->GetProcess()->GetUnixSignals()->GetShouldSuppress( 955 m_value)) 956 thread_sp->SetResumeSignal(m_value); 957 } 958 } 959 960 const char *GetDescription() override { 961 if (m_description.empty()) { 962 ThreadSP thread_sp(m_thread_wp.lock()); 963 if (thread_sp) { 964 StreamString strm; 965 const char *signal_name = 966 thread_sp->GetProcess()->GetUnixSignals()->GetSignalAsCString( 967 m_value); 968 if (signal_name) 969 strm.Printf("signal %s", signal_name); 970 else 971 strm.Printf("signal %" PRIi64, m_value); 972 m_description = strm.GetString(); 973 } 974 } 975 return m_description.c_str(); 976 } 977}; 978 979// StopInfoTrace 980 981class StopInfoTrace : public StopInfo { 982public: 983 StopInfoTrace(Thread &thread) : StopInfo(thread, LLDB_INVALID_UID) {} 984 985 ~StopInfoTrace() override = default; 986 987 StopReason GetStopReason() const override { return eStopReasonTrace; } 988 989 const char *GetDescription() override { 990 if (m_description.empty()) 991 return "trace"; 992 else 993 return m_description.c_str(); 994 } 995}; 996 997// StopInfoException 998 999class StopInfoException : public StopInfo { 1000public: 1001 StopInfoException(Thread &thread, const char *description) 1002 : StopInfo(thread, LLDB_INVALID_UID) { 1003 if (description) 1004 SetDescription(description); 1005 } 1006 1007 ~StopInfoException() override = default; 1008 1009 StopReason GetStopReason() const override { return eStopReasonException; } 1010 1011 const char *GetDescription() override { 1012 if (m_description.empty()) 1013 return "exception"; 1014 else 1015 return m_description.c_str(); 1016 } 1017}; 1018 1019// StopInfoThreadPlan 1020 1021class StopInfoThreadPlan : public StopInfo { 1022public: 1023 StopInfoThreadPlan(ThreadPlanSP &plan_sp, ValueObjectSP &return_valobj_sp, 1024 ExpressionVariableSP &expression_variable_sp) 1025 : StopInfo(plan_sp->GetThread(), LLDB_INVALID_UID), m_plan_sp(plan_sp), 1026 m_return_valobj_sp(return_valobj_sp), 1027 m_expression_variable_sp(expression_variable_sp) {} 1028 1029 ~StopInfoThreadPlan() override = default; 1030 1031 StopReason GetStopReason() const override { return eStopReasonPlanComplete; } 1032 1033 const char *GetDescription() override { 1034 if (m_description.empty()) { 1035 StreamString strm; 1036 m_plan_sp->GetDescription(&strm, eDescriptionLevelBrief); 1037 m_description = strm.GetString(); 1038 } 1039 return m_description.c_str(); 1040 } 1041 1042 ValueObjectSP GetReturnValueObject() { return m_return_valobj_sp; } 1043 1044 ExpressionVariableSP GetExpressionVariable() { 1045 return m_expression_variable_sp; 1046 } 1047 1048protected: 1049 bool ShouldStop(Event *event_ptr) override { 1050 if (m_plan_sp) 1051 return m_plan_sp->ShouldStop(event_ptr); 1052 else 1053 return StopInfo::ShouldStop(event_ptr); 1054 } 1055 1056private: 1057 ThreadPlanSP m_plan_sp; 1058 ValueObjectSP m_return_valobj_sp; 1059 ExpressionVariableSP m_expression_variable_sp; 1060}; 1061 1062// StopInfoExec 1063 1064class StopInfoExec : public StopInfo { 1065public: 1066 StopInfoExec(Thread &thread) 1067 : StopInfo(thread, LLDB_INVALID_UID), m_performed_action(false) {} 1068 1069 ~StopInfoExec() override = default; 1070 1071 bool ShouldStop(Event *event_ptr) override { 1072 ThreadSP thread_sp(m_thread_wp.lock()); 1073 if (thread_sp) 1074 return thread_sp->GetProcess()->GetStopOnExec(); 1075 return false; 1076 } 1077 1078 StopReason GetStopReason() const override { return eStopReasonExec; } 1079 1080 const char *GetDescription() override { return "exec"; } 1081 1082protected: 1083 void PerformAction(Event *event_ptr) override { 1084 // Only perform the action once 1085 if (m_performed_action) 1086 return; 1087 m_performed_action = true; 1088 ThreadSP thread_sp(m_thread_wp.lock()); 1089 if (thread_sp) 1090 thread_sp->GetProcess()->DidExec(); 1091 } 1092 1093 bool m_performed_action; 1094}; 1095 1096} // namespace lldb_private 1097 1098StopInfoSP StopInfo::CreateStopReasonWithBreakpointSiteID(Thread &thread, 1099 break_id_t break_id) { 1100 return StopInfoSP(new StopInfoBreakpoint(thread, break_id)); 1101} 1102 1103StopInfoSP StopInfo::CreateStopReasonWithBreakpointSiteID(Thread &thread, 1104 break_id_t break_id, 1105 bool should_stop) { 1106 return StopInfoSP(new StopInfoBreakpoint(thread, break_id, should_stop)); 1107} 1108 1109StopInfoSP 1110StopInfo::CreateStopReasonWithWatchpointID(Thread &thread, break_id_t watch_id, 1111 lldb::addr_t watch_hit_addr) { 1112 return StopInfoSP(new StopInfoWatchpoint(thread, watch_id, watch_hit_addr)); 1113} 1114 1115StopInfoSP StopInfo::CreateStopReasonWithSignal(Thread &thread, int signo, 1116 const char *description) { 1117 return StopInfoSP(new StopInfoUnixSignal(thread, signo, description)); 1118} 1119 1120StopInfoSP StopInfo::CreateStopReasonToTrace(Thread &thread) { 1121 return StopInfoSP(new StopInfoTrace(thread)); 1122} 1123 1124StopInfoSP StopInfo::CreateStopReasonWithPlan( 1125 ThreadPlanSP &plan_sp, ValueObjectSP return_valobj_sp, 1126 ExpressionVariableSP expression_variable_sp) { 1127 return StopInfoSP(new StopInfoThreadPlan(plan_sp, return_valobj_sp, 1128 expression_variable_sp)); 1129} 1130 1131StopInfoSP StopInfo::CreateStopReasonWithException(Thread &thread, 1132 const char *description) { 1133 return StopInfoSP(new StopInfoException(thread, description)); 1134} 1135 1136StopInfoSP StopInfo::CreateStopReasonWithExec(Thread &thread) { 1137 return StopInfoSP(new StopInfoExec(thread)); 1138} 1139 1140ValueObjectSP StopInfo::GetReturnValueObject(StopInfoSP &stop_info_sp) { 1141 if (stop_info_sp && 1142 stop_info_sp->GetStopReason() == eStopReasonPlanComplete) { 1143 StopInfoThreadPlan *plan_stop_info = 1144 static_cast<StopInfoThreadPlan *>(stop_info_sp.get()); 1145 return plan_stop_info->GetReturnValueObject(); 1146 } else 1147 return ValueObjectSP(); 1148} 1149 1150ExpressionVariableSP StopInfo::GetExpressionVariable(StopInfoSP &stop_info_sp) { 1151 if (stop_info_sp && 1152 stop_info_sp->GetStopReason() == eStopReasonPlanComplete) { 1153 StopInfoThreadPlan *plan_stop_info = 1154 static_cast<StopInfoThreadPlan *>(stop_info_sp.get()); 1155 return plan_stop_info->GetExpressionVariable(); 1156 } else 1157 return ExpressionVariableSP(); 1158} 1159 1160lldb::ValueObjectSP 1161StopInfo::GetCrashingDereference(StopInfoSP &stop_info_sp, 1162 lldb::addr_t *crashing_address) { 1163 if (!stop_info_sp) { 1164 return ValueObjectSP(); 1165 } 1166 1167 const char *description = stop_info_sp->GetDescription(); 1168 if (!description) { 1169 return ValueObjectSP(); 1170 } 1171 1172 ThreadSP thread_sp = stop_info_sp->GetThread(); 1173 if (!thread_sp) { 1174 return ValueObjectSP(); 1175 } 1176 1177 StackFrameSP frame_sp = thread_sp->GetSelectedFrame(); 1178 1179 if (!frame_sp) { 1180 return ValueObjectSP(); 1181 } 1182 1183 const char address_string[] = "address="; 1184 1185 const char *address_loc = strstr(description, address_string); 1186 if (!address_loc) { 1187 return ValueObjectSP(); 1188 } 1189 1190 address_loc += (sizeof(address_string) - 1); 1191 1192 uint64_t address = strtoull(address_loc, nullptr, 0); 1193 if (crashing_address) { 1194 *crashing_address = address; 1195 } 1196 1197 return frame_sp->GuessValueForAddress(address); 1198} 1199