1 //===-- Debugger.cpp --------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Core/Debugger.h" 11 12 #include <map> 13 14 #include "llvm/ADT/StringRef.h" 15 16 #include "lldb/lldb-private.h" 17 #include "lldb/Core/FormatEntity.h" 18 #include "lldb/Core/Module.h" 19 #include "lldb/Core/PluginInterface.h" 20 #include "lldb/Core/PluginManager.h" 21 #include "lldb/Core/RegisterValue.h" 22 #include "lldb/Core/State.h" 23 #include "lldb/Core/StreamAsynchronousIO.h" 24 #include "lldb/Core/StreamCallback.h" 25 #include "lldb/Core/StreamFile.h" 26 #include "lldb/Core/StreamString.h" 27 #include "lldb/Core/StructuredData.h" 28 #include "lldb/Core/Timer.h" 29 #include "lldb/Core/ValueObject.h" 30 #include "lldb/Core/ValueObjectVariable.h" 31 #include "lldb/DataFormatters/DataVisualization.h" 32 #include "lldb/DataFormatters/FormatManager.h" 33 #include "lldb/DataFormatters/TypeSummary.h" 34 #include "lldb/Expression/REPL.h" 35 #include "lldb/Host/ConnectionFileDescriptor.h" 36 #include "lldb/Host/HostInfo.h" 37 #include "lldb/Host/Terminal.h" 38 #include "lldb/Host/ThreadLauncher.h" 39 #include "lldb/Interpreter/CommandInterpreter.h" 40 #include "lldb/Interpreter/OptionValueProperties.h" 41 #include "lldb/Interpreter/OptionValueSInt64.h" 42 #include "lldb/Interpreter/OptionValueString.h" 43 #include "lldb/Symbol/CompileUnit.h" 44 #include "lldb/Symbol/Function.h" 45 #include "lldb/Symbol/Symbol.h" 46 #include "lldb/Symbol/VariableList.h" 47 #include "lldb/Target/TargetList.h" 48 #include "lldb/Target/Language.h" 49 #include "lldb/Target/Process.h" 50 #include "lldb/Target/RegisterContext.h" 51 #include "lldb/Target/SectionLoadList.h" 52 #include "lldb/Target/StopInfo.h" 53 #include "lldb/Target/Target.h" 54 #include "lldb/Target/Thread.h" 55 #include "lldb/Utility/AnsiTerminal.h" 56 57 #include "llvm/Support/DynamicLibrary.h" 58 59 using namespace lldb; 60 using namespace lldb_private; 61 62 63 static lldb::user_id_t g_unique_id = 1; 64 static size_t g_debugger_event_thread_stack_bytes = 8 * 1024 * 1024; 65 66 #pragma mark Static Functions 67 68 static Mutex & 69 GetDebuggerListMutex () 70 { 71 static Mutex g_mutex(Mutex::eMutexTypeRecursive); 72 return g_mutex; 73 } 74 75 typedef std::vector<DebuggerSP> DebuggerList; 76 77 static DebuggerList & 78 GetDebuggerList() 79 { 80 // hide the static debugger list inside a singleton accessor to avoid 81 // global init constructors 82 static DebuggerList g_list; 83 return g_list; 84 } 85 86 OptionEnumValueElement 87 g_show_disassembly_enum_values[] = 88 { 89 { Debugger::eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 90 { Debugger::eStopDisassemblyTypeNoDebugInfo, "no-debuginfo", "Show disassembly when there is no debug information."}, 91 { Debugger::eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 92 { Debugger::eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 93 { 0, NULL, NULL } 94 }; 95 96 OptionEnumValueElement 97 g_language_enumerators[] = 98 { 99 { eScriptLanguageNone, "none", "Disable scripting languages."}, 100 { eScriptLanguagePython, "python", "Select python as the default scripting language."}, 101 { eScriptLanguageDefault, "default", "Select the lldb default as the default scripting language."}, 102 { 0, NULL, NULL } 103 }; 104 105 #define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}" 106 #define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 107 #define IS_OPTIMIZED "{${function.is-optimized} [opt]}" 108 109 #define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id%tid}"\ 110 "{, ${frame.pc}}"\ 111 MODULE_WITH_FUNC\ 112 FILE_AND_LINE\ 113 "{, name = '${thread.name}'}"\ 114 "{, queue = '${thread.queue}'}"\ 115 "{, activity = '${thread.info.activity.name}'}" \ 116 "{, ${thread.info.trace_messages} messages}" \ 117 "{, stop reason = ${thread.stop-reason}}"\ 118 "{\\nReturn value: ${thread.return-value}}"\ 119 "{\\nCompleted expression: ${thread.completed-expression}}"\ 120 "\\n" 121 122 #define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 123 MODULE_WITH_FUNC\ 124 FILE_AND_LINE\ 125 IS_OPTIMIZED\ 126 "\\n" 127 128 // Three parts to this disassembly format specification: 129 // 1. If this is a new function/symbol (no previous symbol/function), print 130 // dylib`funcname:\n 131 // 2. If this is a symbol context change (different from previous symbol/function), print 132 // dylib`funcname:\n 133 // 3. print 134 // address <+offset>: 135 #define DEFAULT_DISASSEMBLY_FORMAT "{${function.initial-function}{${module.file.basename}`}{${function.name-without-args}}:\n}{${function.changed}\n{${module.file.basename}`}{${function.name-without-args}}:\n}{${current-pc-arrow} }${addr-file-or-load}{ <${function.concrete-only-addr-offset-no-padding}>}: " 136 137 // gdb's disassembly format can be emulated with 138 // ${current-pc-arrow}${addr-file-or-load}{ <${function.name-without-args}${function.concrete-only-addr-offset-no-padding}>}: 139 140 // lldb's original format for disassembly would look like this format string - 141 // {${function.initial-function}{${module.file.basename}`}{${function.name-without-args}}:\n}{${function.changed}\n{${module.file.basename}`}{${function.name-without-args}}:\n}{${current-pc-arrow} }{${addr-file-or-load}}: 142 143 144 static PropertyDefinition 145 g_properties[] = 146 { 147 { "auto-confirm", OptionValue::eTypeBoolean , true, false, NULL, NULL, "If true all confirmation prompts will receive their default reply." }, 148 { "disassembly-format", OptionValue::eTypeFormatEntity, true, 0 , DEFAULT_DISASSEMBLY_FORMAT, NULL, "The default disassembly format string to use when disassembling instruction sequences." }, 149 { "frame-format", OptionValue::eTypeFormatEntity, true, 0 , DEFAULT_FRAME_FORMAT, NULL, "The default frame format string to use when displaying stack frame information for threads." }, 150 { "notify-void", OptionValue::eTypeBoolean , true, false, NULL, NULL, "Notify the user explicitly if an expression returns void (default: false)." }, 151 { "prompt", OptionValue::eTypeString , true, OptionValueString::eOptionEncodeCharacterEscapeSequences, "(lldb) ", NULL, "The debugger command line prompt displayed for the user." }, 152 { "script-lang", OptionValue::eTypeEnum , true, eScriptLanguagePython, NULL, g_language_enumerators, "The script language to be used for evaluating user-written scripts." }, 153 { "stop-disassembly-count", OptionValue::eTypeSInt64 , true, 4 , NULL, NULL, "The number of disassembly lines to show when displaying a stopped context." }, 154 { "stop-disassembly-display", OptionValue::eTypeEnum , true, Debugger::eStopDisassemblyTypeNoDebugInfo, NULL, g_show_disassembly_enum_values, "Control when to display disassembly when displaying a stopped context." }, 155 { "stop-line-count-after", OptionValue::eTypeSInt64 , true, 3 , NULL, NULL, "The number of sources lines to display that come after the current source line when displaying a stopped context." }, 156 { "stop-line-count-before", OptionValue::eTypeSInt64 , true, 3 , NULL, NULL, "The number of sources lines to display that come before the current source line when displaying a stopped context." }, 157 { "term-width", OptionValue::eTypeSInt64 , true, 80 , NULL, NULL, "The maximum number of columns to use for displaying text." }, 158 { "thread-format", OptionValue::eTypeFormatEntity, true, 0 , DEFAULT_THREAD_FORMAT, NULL, "The default thread format string to use when displaying thread information." }, 159 { "use-external-editor", OptionValue::eTypeBoolean , true, false, NULL, NULL, "Whether to use an external editor or not." }, 160 { "use-color", OptionValue::eTypeBoolean , true, true , NULL, NULL, "Whether to use Ansi color codes or not." }, 161 { "auto-one-line-summaries", OptionValue::eTypeBoolean , true, true, NULL, NULL, "If true, LLDB will automatically display small structs in one-liner format (default: true)." }, 162 { "auto-indent", OptionValue::eTypeBoolean , true, true , NULL, NULL, "If true, LLDB will auto indent/outdent code. Currently only supported in the REPL (default: true)." }, 163 { "print-decls", OptionValue::eTypeBoolean , true, true , NULL, NULL, "If true, LLDB will print the values of variables declared in an expression. Currently only supported in the REPL (default: true)." }, 164 { "tab-size", OptionValue::eTypeUInt64 , true, 4 , NULL, NULL, "The tab size to use when indenting code in multi-line input mode (default: 4)." }, 165 { "escape-non-printables", OptionValue::eTypeBoolean , true, true, NULL, NULL, "If true, LLDB will automatically escape non-printable and escape characters when formatting strings." }, 166 { NULL, OptionValue::eTypeInvalid , true, 0 , NULL, NULL, NULL } 167 }; 168 169 enum 170 { 171 ePropertyAutoConfirm = 0, 172 ePropertyDisassemblyFormat, 173 ePropertyFrameFormat, 174 ePropertyNotiftVoid, 175 ePropertyPrompt, 176 ePropertyScriptLanguage, 177 ePropertyStopDisassemblyCount, 178 ePropertyStopDisassemblyDisplay, 179 ePropertyStopLineCountAfter, 180 ePropertyStopLineCountBefore, 181 ePropertyTerminalWidth, 182 ePropertyThreadFormat, 183 ePropertyUseExternalEditor, 184 ePropertyUseColor, 185 ePropertyAutoOneLineSummaries, 186 ePropertyAutoIndent, 187 ePropertyPrintDecls, 188 ePropertyTabSize, 189 ePropertyEscapeNonPrintables 190 }; 191 192 LoadPluginCallbackType Debugger::g_load_plugin_callback = NULL; 193 194 Error 195 Debugger::SetPropertyValue (const ExecutionContext *exe_ctx, 196 VarSetOperationType op, 197 const char *property_path, 198 const char *value) 199 { 200 bool is_load_script = strcmp(property_path,"target.load-script-from-symbol-file") == 0; 201 bool is_escape_non_printables = strcmp(property_path, "escape-non-printables") == 0; 202 TargetSP target_sp; 203 LoadScriptFromSymFile load_script_old_value; 204 if (is_load_script && exe_ctx->GetTargetSP()) 205 { 206 target_sp = exe_ctx->GetTargetSP(); 207 load_script_old_value = target_sp->TargetProperties::GetLoadScriptFromSymbolFile(); 208 } 209 Error error (Properties::SetPropertyValue (exe_ctx, op, property_path, value)); 210 if (error.Success()) 211 { 212 // FIXME it would be nice to have "on-change" callbacks for properties 213 if (strcmp(property_path, g_properties[ePropertyPrompt].name) == 0) 214 { 215 const char *new_prompt = GetPrompt(); 216 std::string str = lldb_utility::ansi::FormatAnsiTerminalCodes (new_prompt, GetUseColor()); 217 if (str.length()) 218 new_prompt = str.c_str(); 219 GetCommandInterpreter().UpdatePrompt(new_prompt); 220 EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt))); 221 GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 222 } 223 else if (strcmp(property_path, g_properties[ePropertyUseColor].name) == 0) 224 { 225 // use-color changed. Ping the prompt so it can reset the ansi terminal codes. 226 SetPrompt (GetPrompt()); 227 } 228 else if (is_load_script && target_sp && load_script_old_value == eLoadScriptFromSymFileWarn) 229 { 230 if (target_sp->TargetProperties::GetLoadScriptFromSymbolFile() == eLoadScriptFromSymFileTrue) 231 { 232 std::list<Error> errors; 233 StreamString feedback_stream; 234 if (!target_sp->LoadScriptingResources(errors,&feedback_stream)) 235 { 236 StreamFileSP stream_sp (GetErrorFile()); 237 if (stream_sp) 238 { 239 for (auto error : errors) 240 { 241 stream_sp->Printf("%s\n",error.AsCString()); 242 } 243 if (feedback_stream.GetSize()) 244 stream_sp->Printf("%s",feedback_stream.GetData()); 245 } 246 } 247 } 248 } 249 else if (is_escape_non_printables) 250 { 251 DataVisualization::ForceUpdate(); 252 } 253 } 254 return error; 255 } 256 257 bool 258 Debugger::GetAutoConfirm () const 259 { 260 const uint32_t idx = ePropertyAutoConfirm; 261 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 262 } 263 264 const FormatEntity::Entry * 265 Debugger::GetDisassemblyFormat() const 266 { 267 const uint32_t idx = ePropertyDisassemblyFormat; 268 return m_collection_sp->GetPropertyAtIndexAsFormatEntity(NULL, idx); 269 } 270 271 const FormatEntity::Entry * 272 Debugger::GetFrameFormat() const 273 { 274 const uint32_t idx = ePropertyFrameFormat; 275 return m_collection_sp->GetPropertyAtIndexAsFormatEntity(NULL, idx); 276 } 277 278 bool 279 Debugger::GetNotifyVoid () const 280 { 281 const uint32_t idx = ePropertyNotiftVoid; 282 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 283 } 284 285 const char * 286 Debugger::GetPrompt() const 287 { 288 const uint32_t idx = ePropertyPrompt; 289 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 290 } 291 292 void 293 Debugger::SetPrompt(const char *p) 294 { 295 const uint32_t idx = ePropertyPrompt; 296 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 297 const char *new_prompt = GetPrompt(); 298 std::string str = lldb_utility::ansi::FormatAnsiTerminalCodes (new_prompt, GetUseColor()); 299 if (str.length()) 300 new_prompt = str.c_str(); 301 GetCommandInterpreter().UpdatePrompt(new_prompt); 302 } 303 304 const FormatEntity::Entry * 305 Debugger::GetThreadFormat() const 306 { 307 const uint32_t idx = ePropertyThreadFormat; 308 return m_collection_sp->GetPropertyAtIndexAsFormatEntity(NULL, idx); 309 } 310 311 lldb::ScriptLanguage 312 Debugger::GetScriptLanguage() const 313 { 314 const uint32_t idx = ePropertyScriptLanguage; 315 return (lldb::ScriptLanguage)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 316 } 317 318 bool 319 Debugger::SetScriptLanguage (lldb::ScriptLanguage script_lang) 320 { 321 const uint32_t idx = ePropertyScriptLanguage; 322 return m_collection_sp->SetPropertyAtIndexAsEnumeration (NULL, idx, script_lang); 323 } 324 325 uint32_t 326 Debugger::GetTerminalWidth () const 327 { 328 const uint32_t idx = ePropertyTerminalWidth; 329 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 330 } 331 332 bool 333 Debugger::SetTerminalWidth (uint32_t term_width) 334 { 335 const uint32_t idx = ePropertyTerminalWidth; 336 return m_collection_sp->SetPropertyAtIndexAsSInt64 (NULL, idx, term_width); 337 } 338 339 bool 340 Debugger::GetUseExternalEditor () const 341 { 342 const uint32_t idx = ePropertyUseExternalEditor; 343 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 344 } 345 346 bool 347 Debugger::SetUseExternalEditor (bool b) 348 { 349 const uint32_t idx = ePropertyUseExternalEditor; 350 return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 351 } 352 353 bool 354 Debugger::GetUseColor () const 355 { 356 const uint32_t idx = ePropertyUseColor; 357 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 358 } 359 360 bool 361 Debugger::SetUseColor (bool b) 362 { 363 const uint32_t idx = ePropertyUseColor; 364 bool ret = m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 365 SetPrompt (GetPrompt()); 366 return ret; 367 } 368 369 uint32_t 370 Debugger::GetStopSourceLineCount (bool before) const 371 { 372 const uint32_t idx = before ? ePropertyStopLineCountBefore : ePropertyStopLineCountAfter; 373 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 374 } 375 376 Debugger::StopDisassemblyType 377 Debugger::GetStopDisassemblyDisplay () const 378 { 379 const uint32_t idx = ePropertyStopDisassemblyDisplay; 380 return (Debugger::StopDisassemblyType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 381 } 382 383 uint32_t 384 Debugger::GetDisassemblyLineCount () const 385 { 386 const uint32_t idx = ePropertyStopDisassemblyCount; 387 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 388 } 389 390 bool 391 Debugger::GetAutoOneLineSummaries () const 392 { 393 const uint32_t idx = ePropertyAutoOneLineSummaries; 394 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, true); 395 } 396 397 bool 398 Debugger::GetEscapeNonPrintables () const 399 { 400 const uint32_t idx = ePropertyEscapeNonPrintables; 401 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, true); 402 } 403 404 bool 405 Debugger::GetAutoIndent () const 406 { 407 const uint32_t idx = ePropertyAutoIndent; 408 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, true); 409 } 410 411 bool 412 Debugger::SetAutoIndent (bool b) 413 { 414 const uint32_t idx = ePropertyAutoIndent; 415 return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 416 } 417 418 bool 419 Debugger::GetPrintDecls () const 420 { 421 const uint32_t idx = ePropertyPrintDecls; 422 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, true); 423 } 424 425 bool 426 Debugger::SetPrintDecls (bool b) 427 { 428 const uint32_t idx = ePropertyPrintDecls; 429 return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 430 } 431 432 uint32_t 433 Debugger::GetTabSize () const 434 { 435 const uint32_t idx = ePropertyTabSize; 436 return m_collection_sp->GetPropertyAtIndexAsUInt64 (NULL, idx, g_properties[idx].default_uint_value); 437 } 438 439 bool 440 Debugger::SetTabSize (uint32_t tab_size) 441 { 442 const uint32_t idx = ePropertyTabSize; 443 return m_collection_sp->SetPropertyAtIndexAsUInt64 (NULL, idx, tab_size); 444 } 445 446 447 #pragma mark Debugger 448 449 //const DebuggerPropertiesSP & 450 //Debugger::GetSettings() const 451 //{ 452 // return m_properties_sp; 453 //} 454 // 455 456 static bool lldb_initialized = false; 457 void 458 Debugger::Initialize(LoadPluginCallbackType load_plugin_callback) 459 { 460 assert(!lldb_initialized && "Debugger::Initialize called more than once!"); 461 462 lldb_initialized = true; 463 g_load_plugin_callback = load_plugin_callback; 464 } 465 466 void 467 Debugger::Terminate () 468 { 469 assert(lldb_initialized && "Debugger::Terminate called without a matching Debugger::Initialize!"); 470 471 // Clear our master list of debugger objects 472 Mutex::Locker locker (GetDebuggerListMutex ()); 473 auto& debuggers = GetDebuggerList(); 474 for (const auto& debugger: debuggers) 475 debugger->Clear(); 476 477 debuggers.clear(); 478 } 479 480 void 481 Debugger::SettingsInitialize () 482 { 483 Target::SettingsInitialize (); 484 } 485 486 void 487 Debugger::SettingsTerminate () 488 { 489 Target::SettingsTerminate (); 490 } 491 492 bool 493 Debugger::LoadPlugin (const FileSpec& spec, Error& error) 494 { 495 if (g_load_plugin_callback) 496 { 497 llvm::sys::DynamicLibrary dynlib = g_load_plugin_callback (shared_from_this(), spec, error); 498 if (dynlib.isValid()) 499 { 500 m_loaded_plugins.push_back(dynlib); 501 return true; 502 } 503 } 504 else 505 { 506 // The g_load_plugin_callback is registered in SBDebugger::Initialize() 507 // and if the public API layer isn't available (code is linking against 508 // all of the internal LLDB static libraries), then we can't load plugins 509 error.SetErrorString("Public API layer is not available"); 510 } 511 return false; 512 } 513 514 static FileSpec::EnumerateDirectoryResult 515 LoadPluginCallback 516 ( 517 void *baton, 518 FileSpec::FileType file_type, 519 const FileSpec &file_spec 520 ) 521 { 522 Error error; 523 524 static ConstString g_dylibext("dylib"); 525 static ConstString g_solibext("so"); 526 527 if (!baton) 528 return FileSpec::eEnumerateDirectoryResultQuit; 529 530 Debugger *debugger = (Debugger*)baton; 531 532 // If we have a regular file, a symbolic link or unknown file type, try 533 // and process the file. We must handle unknown as sometimes the directory 534 // enumeration might be enumerating a file system that doesn't have correct 535 // file type information. 536 if (file_type == FileSpec::eFileTypeRegular || 537 file_type == FileSpec::eFileTypeSymbolicLink || 538 file_type == FileSpec::eFileTypeUnknown ) 539 { 540 FileSpec plugin_file_spec (file_spec); 541 plugin_file_spec.ResolvePath (); 542 543 if (plugin_file_spec.GetFileNameExtension() != g_dylibext && 544 plugin_file_spec.GetFileNameExtension() != g_solibext) 545 { 546 return FileSpec::eEnumerateDirectoryResultNext; 547 } 548 549 Error plugin_load_error; 550 debugger->LoadPlugin (plugin_file_spec, plugin_load_error); 551 552 return FileSpec::eEnumerateDirectoryResultNext; 553 } 554 555 else if (file_type == FileSpec::eFileTypeUnknown || 556 file_type == FileSpec::eFileTypeDirectory || 557 file_type == FileSpec::eFileTypeSymbolicLink ) 558 { 559 // Try and recurse into anything that a directory or symbolic link. 560 // We must also do this for unknown as sometimes the directory enumeration 561 // might be enumerating a file system that doesn't have correct file type 562 // information. 563 return FileSpec::eEnumerateDirectoryResultEnter; 564 } 565 566 return FileSpec::eEnumerateDirectoryResultNext; 567 } 568 569 void 570 Debugger::InstanceInitialize () 571 { 572 FileSpec dir_spec; 573 const bool find_directories = true; 574 const bool find_files = true; 575 const bool find_other = true; 576 char dir_path[PATH_MAX]; 577 if (HostInfo::GetLLDBPath(ePathTypeLLDBSystemPlugins, dir_spec)) 578 { 579 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 580 { 581 FileSpec::EnumerateDirectory (dir_path, 582 find_directories, 583 find_files, 584 find_other, 585 LoadPluginCallback, 586 this); 587 } 588 } 589 590 if (HostInfo::GetLLDBPath(ePathTypeLLDBUserPlugins, dir_spec)) 591 { 592 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 593 { 594 FileSpec::EnumerateDirectory (dir_path, 595 find_directories, 596 find_files, 597 find_other, 598 LoadPluginCallback, 599 this); 600 } 601 } 602 603 PluginManager::DebuggerInitialize (*this); 604 } 605 606 DebuggerSP 607 Debugger::CreateInstance (lldb::LogOutputCallback log_callback, void *baton) 608 { 609 DebuggerSP debugger_sp (new Debugger(log_callback, baton)); 610 if (lldb_initialized) 611 { 612 Mutex::Locker locker (GetDebuggerListMutex ()); 613 GetDebuggerList().push_back(debugger_sp); 614 } 615 debugger_sp->InstanceInitialize (); 616 return debugger_sp; 617 } 618 619 void 620 Debugger::Destroy (DebuggerSP &debugger_sp) 621 { 622 if (debugger_sp.get() == NULL) 623 return; 624 625 debugger_sp->Clear(); 626 627 if (lldb_initialized) 628 { 629 Mutex::Locker locker (GetDebuggerListMutex ()); 630 DebuggerList &debugger_list = GetDebuggerList (); 631 DebuggerList::iterator pos, end = debugger_list.end(); 632 for (pos = debugger_list.begin (); pos != end; ++pos) 633 { 634 if ((*pos).get() == debugger_sp.get()) 635 { 636 debugger_list.erase (pos); 637 return; 638 } 639 } 640 } 641 } 642 643 DebuggerSP 644 Debugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 645 { 646 DebuggerSP debugger_sp; 647 if (lldb_initialized) 648 { 649 Mutex::Locker locker (GetDebuggerListMutex ()); 650 DebuggerList &debugger_list = GetDebuggerList(); 651 DebuggerList::iterator pos, end = debugger_list.end(); 652 653 for (pos = debugger_list.begin(); pos != end; ++pos) 654 { 655 if ((*pos).get()->m_instance_name == instance_name) 656 { 657 debugger_sp = *pos; 658 break; 659 } 660 } 661 } 662 return debugger_sp; 663 } 664 665 TargetSP 666 Debugger::FindTargetWithProcessID (lldb::pid_t pid) 667 { 668 TargetSP target_sp; 669 if (lldb_initialized) 670 { 671 Mutex::Locker locker (GetDebuggerListMutex ()); 672 DebuggerList &debugger_list = GetDebuggerList(); 673 DebuggerList::iterator pos, end = debugger_list.end(); 674 for (pos = debugger_list.begin(); pos != end; ++pos) 675 { 676 target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 677 if (target_sp) 678 break; 679 } 680 } 681 return target_sp; 682 } 683 684 TargetSP 685 Debugger::FindTargetWithProcess (Process *process) 686 { 687 TargetSP target_sp; 688 if (lldb_initialized) 689 { 690 Mutex::Locker locker (GetDebuggerListMutex ()); 691 DebuggerList &debugger_list = GetDebuggerList(); 692 DebuggerList::iterator pos, end = debugger_list.end(); 693 for (pos = debugger_list.begin(); pos != end; ++pos) 694 { 695 target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 696 if (target_sp) 697 break; 698 } 699 } 700 return target_sp; 701 } 702 703 Debugger::Debugger(lldb::LogOutputCallback log_callback, void *baton) : 704 UserID(g_unique_id++), 705 Properties(OptionValuePropertiesSP(new OptionValueProperties())), 706 m_input_file_sp(new StreamFile(stdin, false)), 707 m_output_file_sp(new StreamFile(stdout, false)), 708 m_error_file_sp(new StreamFile(stderr, false)), 709 m_terminal_state(), 710 m_target_list(*this), 711 m_platform_list(), 712 m_listener("lldb.Debugger"), 713 m_source_manager_ap(), 714 m_source_file_cache(), 715 m_command_interpreter_ap(new CommandInterpreter(*this, eScriptLanguageDefault, false)), 716 m_input_reader_stack(), 717 m_instance_name(), 718 m_loaded_plugins(), 719 m_event_handler_thread (), 720 m_io_handler_thread (), 721 m_sync_broadcaster (NULL, "lldb.debugger.sync") 722 { 723 char instance_cstr[256]; 724 snprintf(instance_cstr, sizeof(instance_cstr), "debugger_%d", (int)GetID()); 725 m_instance_name.SetCString(instance_cstr); 726 if (log_callback) 727 m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 728 m_command_interpreter_ap->Initialize (); 729 // Always add our default platform to the platform list 730 PlatformSP default_platform_sp (Platform::GetHostPlatform()); 731 assert (default_platform_sp.get()); 732 m_platform_list.Append (default_platform_sp, true); 733 734 m_collection_sp->Initialize (g_properties); 735 m_collection_sp->AppendProperty (ConstString("target"), 736 ConstString("Settings specify to debugging targets."), 737 true, 738 Target::GetGlobalProperties()->GetValueProperties()); 739 m_collection_sp->AppendProperty (ConstString("platform"), 740 ConstString("Platform settings."), 741 true, 742 Platform::GetGlobalPlatformProperties()->GetValueProperties()); 743 if (m_command_interpreter_ap.get()) 744 { 745 m_collection_sp->AppendProperty (ConstString("interpreter"), 746 ConstString("Settings specify to the debugger's command interpreter."), 747 true, 748 m_command_interpreter_ap->GetValueProperties()); 749 } 750 OptionValueSInt64 *term_width = m_collection_sp->GetPropertyAtIndexAsOptionValueSInt64 (NULL, ePropertyTerminalWidth); 751 term_width->SetMinimumValue(10); 752 term_width->SetMaximumValue(1024); 753 754 // Turn off use-color if this is a dumb terminal. 755 const char *term = getenv ("TERM"); 756 if (term && !strcmp (term, "dumb")) 757 SetUseColor (false); 758 } 759 760 Debugger::~Debugger () 761 { 762 Clear(); 763 } 764 765 void 766 Debugger::Clear() 767 { 768 ClearIOHandlers(); 769 StopIOHandlerThread(); 770 StopEventHandlerThread(); 771 m_listener.Clear(); 772 int num_targets = m_target_list.GetNumTargets(); 773 for (int i = 0; i < num_targets; i++) 774 { 775 TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 776 if (target_sp) 777 { 778 ProcessSP process_sp (target_sp->GetProcessSP()); 779 if (process_sp) 780 process_sp->Finalize(); 781 target_sp->Destroy(); 782 } 783 } 784 BroadcasterManager::Clear (); 785 786 // Close the input file _before_ we close the input read communications class 787 // as it does NOT own the input file, our m_input_file does. 788 m_terminal_state.Clear(); 789 if (m_input_file_sp) 790 m_input_file_sp->GetFile().Close (); 791 792 m_command_interpreter_ap->Clear(); 793 } 794 795 bool 796 Debugger::GetCloseInputOnEOF () const 797 { 798 // return m_input_comm.GetCloseOnEOF(); 799 return false; 800 } 801 802 void 803 Debugger::SetCloseInputOnEOF (bool b) 804 { 805 // m_input_comm.SetCloseOnEOF(b); 806 } 807 808 bool 809 Debugger::GetAsyncExecution () 810 { 811 return !m_command_interpreter_ap->GetSynchronous(); 812 } 813 814 void 815 Debugger::SetAsyncExecution (bool async_execution) 816 { 817 m_command_interpreter_ap->SetSynchronous (!async_execution); 818 } 819 820 821 void 822 Debugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 823 { 824 if (m_input_file_sp) 825 m_input_file_sp->GetFile().SetStream (fh, tranfer_ownership); 826 else 827 m_input_file_sp.reset (new StreamFile (fh, tranfer_ownership)); 828 829 File &in_file = m_input_file_sp->GetFile(); 830 if (in_file.IsValid() == false) 831 in_file.SetStream (stdin, true); 832 833 // Save away the terminal state if that is relevant, so that we can restore it in RestoreInputState. 834 SaveInputTerminalState (); 835 } 836 837 void 838 Debugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 839 { 840 if (m_output_file_sp) 841 m_output_file_sp->GetFile().SetStream (fh, tranfer_ownership); 842 else 843 m_output_file_sp.reset (new StreamFile (fh, tranfer_ownership)); 844 845 File &out_file = m_output_file_sp->GetFile(); 846 if (out_file.IsValid() == false) 847 out_file.SetStream (stdout, false); 848 849 // do not create the ScriptInterpreter just for setting the output file handle 850 // as the constructor will know how to do the right thing on its own 851 const bool can_create = false; 852 ScriptInterpreter* script_interpreter = GetCommandInterpreter().GetScriptInterpreter(can_create); 853 if (script_interpreter) 854 script_interpreter->ResetOutputFileHandle (fh); 855 } 856 857 void 858 Debugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 859 { 860 if (m_error_file_sp) 861 m_error_file_sp->GetFile().SetStream (fh, tranfer_ownership); 862 else 863 m_error_file_sp.reset (new StreamFile (fh, tranfer_ownership)); 864 865 File &err_file = m_error_file_sp->GetFile(); 866 if (err_file.IsValid() == false) 867 err_file.SetStream (stderr, false); 868 } 869 870 void 871 Debugger::SaveInputTerminalState () 872 { 873 if (m_input_file_sp) 874 { 875 File &in_file = m_input_file_sp->GetFile(); 876 if (in_file.GetDescriptor() != File::kInvalidDescriptor) 877 m_terminal_state.Save(in_file.GetDescriptor(), true); 878 } 879 } 880 881 void 882 Debugger::RestoreInputTerminalState () 883 { 884 m_terminal_state.Restore(); 885 } 886 887 ExecutionContext 888 Debugger::GetSelectedExecutionContext () 889 { 890 ExecutionContext exe_ctx; 891 TargetSP target_sp(GetSelectedTarget()); 892 exe_ctx.SetTargetSP (target_sp); 893 894 if (target_sp) 895 { 896 ProcessSP process_sp (target_sp->GetProcessSP()); 897 exe_ctx.SetProcessSP (process_sp); 898 if (process_sp && process_sp->IsRunning() == false) 899 { 900 ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 901 if (thread_sp) 902 { 903 exe_ctx.SetThreadSP (thread_sp); 904 exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 905 if (exe_ctx.GetFramePtr() == NULL) 906 exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 907 } 908 } 909 } 910 return exe_ctx; 911 } 912 913 void 914 Debugger::DispatchInputInterrupt () 915 { 916 Mutex::Locker locker (m_input_reader_stack.GetMutex()); 917 IOHandlerSP reader_sp (m_input_reader_stack.Top()); 918 if (reader_sp) 919 reader_sp->Interrupt(); 920 } 921 922 void 923 Debugger::DispatchInputEndOfFile () 924 { 925 Mutex::Locker locker (m_input_reader_stack.GetMutex()); 926 IOHandlerSP reader_sp (m_input_reader_stack.Top()); 927 if (reader_sp) 928 reader_sp->GotEOF(); 929 } 930 931 void 932 Debugger::ClearIOHandlers () 933 { 934 // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 935 Mutex::Locker locker (m_input_reader_stack.GetMutex()); 936 while (m_input_reader_stack.GetSize() > 1) 937 { 938 IOHandlerSP reader_sp (m_input_reader_stack.Top()); 939 if (reader_sp) 940 PopIOHandler (reader_sp); 941 } 942 } 943 944 void 945 Debugger::ExecuteIOHandlers() 946 { 947 while (1) 948 { 949 IOHandlerSP reader_sp(m_input_reader_stack.Top()); 950 if (!reader_sp) 951 break; 952 953 reader_sp->Run(); 954 955 // Remove all input readers that are done from the top of the stack 956 while (1) 957 { 958 IOHandlerSP top_reader_sp = m_input_reader_stack.Top(); 959 if (top_reader_sp && top_reader_sp->GetIsDone()) 960 PopIOHandler (top_reader_sp); 961 else 962 break; 963 } 964 } 965 ClearIOHandlers(); 966 } 967 968 bool 969 Debugger::IsTopIOHandler (const lldb::IOHandlerSP& reader_sp) 970 { 971 return m_input_reader_stack.IsTop (reader_sp); 972 } 973 974 bool 975 Debugger::CheckTopIOHandlerTypes (IOHandler::Type top_type, IOHandler::Type second_top_type) 976 { 977 return m_input_reader_stack.CheckTopIOHandlerTypes (top_type, second_top_type); 978 } 979 980 void 981 Debugger::PrintAsync (const char *s, size_t len, bool is_stdout) 982 { 983 lldb::StreamFileSP stream = is_stdout ? GetOutputFile() : GetErrorFile(); 984 m_input_reader_stack.PrintAsync(stream.get(), s, len); 985 } 986 987 ConstString 988 Debugger::GetTopIOHandlerControlSequence(char ch) 989 { 990 return m_input_reader_stack.GetTopIOHandlerControlSequence (ch); 991 } 992 993 const char * 994 Debugger::GetIOHandlerCommandPrefix() 995 { 996 return m_input_reader_stack.GetTopIOHandlerCommandPrefix(); 997 } 998 999 const char * 1000 Debugger::GetIOHandlerHelpPrologue() 1001 { 1002 return m_input_reader_stack.GetTopIOHandlerHelpPrologue(); 1003 } 1004 1005 void 1006 Debugger::RunIOHandler (const IOHandlerSP& reader_sp) 1007 { 1008 PushIOHandler (reader_sp); 1009 1010 IOHandlerSP top_reader_sp = reader_sp; 1011 while (top_reader_sp) 1012 { 1013 top_reader_sp->Run(); 1014 1015 if (top_reader_sp.get() == reader_sp.get()) 1016 { 1017 if (PopIOHandler (reader_sp)) 1018 break; 1019 } 1020 1021 while (1) 1022 { 1023 top_reader_sp = m_input_reader_stack.Top(); 1024 if (top_reader_sp && top_reader_sp->GetIsDone()) 1025 PopIOHandler (top_reader_sp); 1026 else 1027 break; 1028 } 1029 } 1030 } 1031 1032 void 1033 Debugger::AdoptTopIOHandlerFilesIfInvalid (StreamFileSP &in, StreamFileSP &out, StreamFileSP &err) 1034 { 1035 // Before an IOHandler runs, it must have in/out/err streams. 1036 // This function is called when one ore more of the streams 1037 // are NULL. We use the top input reader's in/out/err streams, 1038 // or fall back to the debugger file handles, or we fall back 1039 // onto stdin/stdout/stderr as a last resort. 1040 1041 Mutex::Locker locker (m_input_reader_stack.GetMutex()); 1042 IOHandlerSP top_reader_sp (m_input_reader_stack.Top()); 1043 // If no STDIN has been set, then set it appropriately 1044 if (!in) 1045 { 1046 if (top_reader_sp) 1047 in = top_reader_sp->GetInputStreamFile(); 1048 else 1049 in = GetInputFile(); 1050 1051 // If there is nothing, use stdin 1052 if (!in) 1053 in = StreamFileSP(new StreamFile(stdin, false)); 1054 } 1055 // If no STDOUT has been set, then set it appropriately 1056 if (!out) 1057 { 1058 if (top_reader_sp) 1059 out = top_reader_sp->GetOutputStreamFile(); 1060 else 1061 out = GetOutputFile(); 1062 1063 // If there is nothing, use stdout 1064 if (!out) 1065 out = StreamFileSP(new StreamFile(stdout, false)); 1066 } 1067 // If no STDERR has been set, then set it appropriately 1068 if (!err) 1069 { 1070 if (top_reader_sp) 1071 err = top_reader_sp->GetErrorStreamFile(); 1072 else 1073 err = GetErrorFile(); 1074 1075 // If there is nothing, use stderr 1076 if (!err) 1077 err = StreamFileSP(new StreamFile(stdout, false)); 1078 1079 } 1080 } 1081 1082 void 1083 Debugger::PushIOHandler (const IOHandlerSP& reader_sp) 1084 { 1085 if (!reader_sp) 1086 return; 1087 1088 Mutex::Locker locker (m_input_reader_stack.GetMutex()); 1089 1090 // Get the current top input reader... 1091 IOHandlerSP top_reader_sp (m_input_reader_stack.Top()); 1092 1093 // Don't push the same IO handler twice... 1094 if (reader_sp == top_reader_sp) 1095 return; 1096 1097 // Push our new input reader 1098 m_input_reader_stack.Push (reader_sp); 1099 reader_sp->Activate(); 1100 1101 // Interrupt the top input reader to it will exit its Run() function 1102 // and let this new input reader take over 1103 if (top_reader_sp) 1104 { 1105 top_reader_sp->Deactivate(); 1106 top_reader_sp->Cancel(); 1107 } 1108 } 1109 1110 bool 1111 Debugger::PopIOHandler (const IOHandlerSP& pop_reader_sp) 1112 { 1113 if (! pop_reader_sp) 1114 return false; 1115 1116 Mutex::Locker locker (m_input_reader_stack.GetMutex()); 1117 1118 // The reader on the stop of the stack is done, so let the next 1119 // read on the stack refresh its prompt and if there is one... 1120 if (m_input_reader_stack.IsEmpty()) 1121 return false; 1122 1123 IOHandlerSP reader_sp(m_input_reader_stack.Top()); 1124 1125 if (pop_reader_sp != reader_sp) 1126 return false; 1127 1128 reader_sp->Deactivate(); 1129 reader_sp->Cancel(); 1130 m_input_reader_stack.Pop (); 1131 1132 reader_sp = m_input_reader_stack.Top(); 1133 if (reader_sp) 1134 reader_sp->Activate(); 1135 1136 return true; 1137 } 1138 1139 StreamSP 1140 Debugger::GetAsyncOutputStream () 1141 { 1142 return StreamSP (new StreamAsynchronousIO (*this, true)); 1143 } 1144 1145 StreamSP 1146 Debugger::GetAsyncErrorStream () 1147 { 1148 return StreamSP (new StreamAsynchronousIO (*this, false)); 1149 } 1150 1151 size_t 1152 Debugger::GetNumDebuggers() 1153 { 1154 if (lldb_initialized) 1155 { 1156 Mutex::Locker locker (GetDebuggerListMutex ()); 1157 return GetDebuggerList().size(); 1158 } 1159 return 0; 1160 } 1161 1162 lldb::DebuggerSP 1163 Debugger::GetDebuggerAtIndex (size_t index) 1164 { 1165 DebuggerSP debugger_sp; 1166 1167 if (lldb_initialized) 1168 { 1169 Mutex::Locker locker (GetDebuggerListMutex ()); 1170 DebuggerList &debugger_list = GetDebuggerList(); 1171 1172 if (index < debugger_list.size()) 1173 debugger_sp = debugger_list[index]; 1174 } 1175 1176 return debugger_sp; 1177 } 1178 1179 DebuggerSP 1180 Debugger::FindDebuggerWithID (lldb::user_id_t id) 1181 { 1182 DebuggerSP debugger_sp; 1183 1184 if (lldb_initialized) 1185 { 1186 Mutex::Locker locker (GetDebuggerListMutex ()); 1187 DebuggerList &debugger_list = GetDebuggerList(); 1188 DebuggerList::iterator pos, end = debugger_list.end(); 1189 for (pos = debugger_list.begin(); pos != end; ++pos) 1190 { 1191 if ((*pos).get()->GetID() == id) 1192 { 1193 debugger_sp = *pos; 1194 break; 1195 } 1196 } 1197 } 1198 return debugger_sp; 1199 } 1200 1201 #if 0 1202 static void 1203 TestPromptFormats (StackFrame *frame) 1204 { 1205 if (frame == NULL) 1206 return; 1207 1208 StreamString s; 1209 const char *prompt_format = 1210 "{addr = '${addr}'\n}" 1211 "{addr-file-or-load = '${addr-file-or-load}'\n}" 1212 "{current-pc-arrow = '${current-pc-arrow}'\n}" 1213 "{process.id = '${process.id}'\n}" 1214 "{process.name = '${process.name}'\n}" 1215 "{process.file.basename = '${process.file.basename}'\n}" 1216 "{process.file.fullpath = '${process.file.fullpath}'\n}" 1217 "{thread.id = '${thread.id}'\n}" 1218 "{thread.index = '${thread.index}'\n}" 1219 "{thread.name = '${thread.name}'\n}" 1220 "{thread.queue = '${thread.queue}'\n}" 1221 "{thread.stop-reason = '${thread.stop-reason}'\n}" 1222 "{target.arch = '${target.arch}'\n}" 1223 "{module.file.basename = '${module.file.basename}'\n}" 1224 "{module.file.fullpath = '${module.file.fullpath}'\n}" 1225 "{file.basename = '${file.basename}'\n}" 1226 "{file.fullpath = '${file.fullpath}'\n}" 1227 "{frame.index = '${frame.index}'\n}" 1228 "{frame.pc = '${frame.pc}'\n}" 1229 "{frame.sp = '${frame.sp}'\n}" 1230 "{frame.fp = '${frame.fp}'\n}" 1231 "{frame.flags = '${frame.flags}'\n}" 1232 "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 1233 "{frame.reg.rip = '${frame.reg.rip}'\n}" 1234 "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 1235 "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 1236 "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 1237 "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 1238 "{frame.reg.carp = '${frame.reg.carp}'\n}" 1239 "{function.id = '${function.id}'\n}" 1240 "{function.changed = '${function.changed}'\n}" 1241 "{function.initial-function = '${function.initial-function}'\n}" 1242 "{function.name = '${function.name}'\n}" 1243 "{function.name-without-args = '${function.name-without-args}'\n}" 1244 "{function.name-with-args = '${function.name-with-args}'\n}" 1245 "{function.addr-offset = '${function.addr-offset}'\n}" 1246 "{function.concrete-only-addr-offset-no-padding = '${function.concrete-only-addr-offset-no-padding}'\n}" 1247 "{function.line-offset = '${function.line-offset}'\n}" 1248 "{function.pc-offset = '${function.pc-offset}'\n}" 1249 "{line.file.basename = '${line.file.basename}'\n}" 1250 "{line.file.fullpath = '${line.file.fullpath}'\n}" 1251 "{line.number = '${line.number}'\n}" 1252 "{line.start-addr = '${line.start-addr}'\n}" 1253 "{line.end-addr = '${line.end-addr}'\n}" 1254 ; 1255 1256 SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 1257 ExecutionContext exe_ctx; 1258 frame->CalculateExecutionContext(exe_ctx); 1259 if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s)) 1260 { 1261 printf("%s\n", s.GetData()); 1262 } 1263 else 1264 { 1265 printf ("what we got: %s\n", s.GetData()); 1266 } 1267 } 1268 #endif 1269 1270 bool 1271 Debugger::FormatDisassemblerAddress (const FormatEntity::Entry *format, 1272 const SymbolContext *sc, 1273 const SymbolContext *prev_sc, 1274 const ExecutionContext *exe_ctx, 1275 const Address *addr, 1276 Stream &s) 1277 { 1278 FormatEntity::Entry format_entry; 1279 1280 if (format == NULL) 1281 { 1282 if (exe_ctx != NULL && exe_ctx->HasTargetScope()) 1283 format = exe_ctx->GetTargetRef().GetDebugger().GetDisassemblyFormat(); 1284 if (format == NULL) 1285 { 1286 FormatEntity::Parse("${addr}: ", format_entry); 1287 format = &format_entry; 1288 } 1289 } 1290 bool function_changed = false; 1291 bool initial_function = false; 1292 if (prev_sc && (prev_sc->function || prev_sc->symbol)) 1293 { 1294 if (sc && (sc->function || sc->symbol)) 1295 { 1296 if (prev_sc->symbol && sc->symbol) 1297 { 1298 if (!sc->symbol->Compare (prev_sc->symbol->GetName(), prev_sc->symbol->GetType())) 1299 { 1300 function_changed = true; 1301 } 1302 } 1303 else if (prev_sc->function && sc->function) 1304 { 1305 if (prev_sc->function->GetMangled() != sc->function->GetMangled()) 1306 { 1307 function_changed = true; 1308 } 1309 } 1310 } 1311 } 1312 // The first context on a list of instructions will have a prev_sc that 1313 // has no Function or Symbol -- if SymbolContext had an IsValid() method, it 1314 // would return false. But we do get a prev_sc pointer. 1315 if ((sc && (sc->function || sc->symbol)) 1316 && prev_sc && (prev_sc->function == NULL && prev_sc->symbol == NULL)) 1317 { 1318 initial_function = true; 1319 } 1320 return FormatEntity::Format(*format, s, sc, exe_ctx, addr, NULL, function_changed, initial_function); 1321 } 1322 1323 1324 void 1325 Debugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 1326 { 1327 // For simplicity's sake, I am not going to deal with how to close down any 1328 // open logging streams, I just redirect everything from here on out to the 1329 // callback. 1330 m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 1331 } 1332 1333 bool 1334 Debugger::EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream) 1335 { 1336 StreamSP log_stream_sp; 1337 if (m_log_callback_stream_sp) 1338 { 1339 log_stream_sp = m_log_callback_stream_sp; 1340 // For now when using the callback mode you always get thread & timestamp. 1341 log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 1342 } 1343 else if (log_file == NULL || *log_file == '\0') 1344 { 1345 log_stream_sp = GetOutputFile(); 1346 } 1347 else 1348 { 1349 LogStreamMap::iterator pos = m_log_streams.find(log_file); 1350 if (pos != m_log_streams.end()) 1351 log_stream_sp = pos->second.lock(); 1352 if (!log_stream_sp) 1353 { 1354 uint32_t options = File::eOpenOptionWrite | File::eOpenOptionCanCreate 1355 | File::eOpenOptionCloseOnExec | File::eOpenOptionAppend; 1356 if (! (log_options & LLDB_LOG_OPTION_APPEND)) 1357 options |= File::eOpenOptionTruncate; 1358 1359 log_stream_sp.reset (new StreamFile (log_file, options)); 1360 m_log_streams[log_file] = log_stream_sp; 1361 } 1362 } 1363 assert (log_stream_sp.get()); 1364 1365 if (log_options == 0) 1366 log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 1367 1368 return Log::EnableLogChannel(log_stream_sp, log_options, channel, categories, error_stream); 1369 } 1370 1371 SourceManager & 1372 Debugger::GetSourceManager () 1373 { 1374 if (m_source_manager_ap.get() == NULL) 1375 m_source_manager_ap.reset (new SourceManager (shared_from_this())); 1376 return *m_source_manager_ap; 1377 } 1378 1379 1380 1381 // This function handles events that were broadcast by the process. 1382 void 1383 Debugger::HandleBreakpointEvent (const EventSP &event_sp) 1384 { 1385 using namespace lldb; 1386 const uint32_t event_type = Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event_sp); 1387 1388 // if (event_type & eBreakpointEventTypeAdded 1389 // || event_type & eBreakpointEventTypeRemoved 1390 // || event_type & eBreakpointEventTypeEnabled 1391 // || event_type & eBreakpointEventTypeDisabled 1392 // || event_type & eBreakpointEventTypeCommandChanged 1393 // || event_type & eBreakpointEventTypeConditionChanged 1394 // || event_type & eBreakpointEventTypeIgnoreChanged 1395 // || event_type & eBreakpointEventTypeLocationsResolved) 1396 // { 1397 // // Don't do anything about these events, since the breakpoint commands already echo these actions. 1398 // } 1399 // 1400 if (event_type & eBreakpointEventTypeLocationsAdded) 1401 { 1402 uint32_t num_new_locations = Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent(event_sp); 1403 if (num_new_locations > 0) 1404 { 1405 BreakpointSP breakpoint = Breakpoint::BreakpointEventData::GetBreakpointFromEvent(event_sp); 1406 StreamSP output_sp (GetAsyncOutputStream()); 1407 if (output_sp) 1408 { 1409 output_sp->Printf("%d location%s added to breakpoint %d\n", 1410 num_new_locations, 1411 num_new_locations == 1 ? "" : "s", 1412 breakpoint->GetID()); 1413 output_sp->Flush(); 1414 } 1415 } 1416 } 1417 // else if (event_type & eBreakpointEventTypeLocationsRemoved) 1418 // { 1419 // // These locations just get disabled, not sure it is worth spamming folks about this on the command line. 1420 // } 1421 // else if (event_type & eBreakpointEventTypeLocationsResolved) 1422 // { 1423 // // This might be an interesting thing to note, but I'm going to leave it quiet for now, it just looked noisy. 1424 // } 1425 } 1426 1427 size_t 1428 Debugger::GetProcessSTDOUT (Process *process, Stream *stream) 1429 { 1430 size_t total_bytes = 0; 1431 if (stream == NULL) 1432 stream = GetOutputFile().get(); 1433 1434 if (stream) 1435 { 1436 // The process has stuff waiting for stdout; get it and write it out to the appropriate place. 1437 if (process == NULL) 1438 { 1439 TargetSP target_sp = GetTargetList().GetSelectedTarget(); 1440 if (target_sp) 1441 process = target_sp->GetProcessSP().get(); 1442 } 1443 if (process) 1444 { 1445 Error error; 1446 size_t len; 1447 char stdio_buffer[1024]; 1448 while ((len = process->GetSTDOUT (stdio_buffer, sizeof (stdio_buffer), error)) > 0) 1449 { 1450 stream->Write(stdio_buffer, len); 1451 total_bytes += len; 1452 } 1453 } 1454 stream->Flush(); 1455 } 1456 return total_bytes; 1457 } 1458 1459 size_t 1460 Debugger::GetProcessSTDERR (Process *process, Stream *stream) 1461 { 1462 size_t total_bytes = 0; 1463 if (stream == NULL) 1464 stream = GetOutputFile().get(); 1465 1466 if (stream) 1467 { 1468 // The process has stuff waiting for stderr; get it and write it out to the appropriate place. 1469 if (process == NULL) 1470 { 1471 TargetSP target_sp = GetTargetList().GetSelectedTarget(); 1472 if (target_sp) 1473 process = target_sp->GetProcessSP().get(); 1474 } 1475 if (process) 1476 { 1477 Error error; 1478 size_t len; 1479 char stdio_buffer[1024]; 1480 while ((len = process->GetSTDERR (stdio_buffer, sizeof (stdio_buffer), error)) > 0) 1481 { 1482 stream->Write(stdio_buffer, len); 1483 total_bytes += len; 1484 } 1485 } 1486 stream->Flush(); 1487 } 1488 return total_bytes; 1489 } 1490 1491 1492 // This function handles events that were broadcast by the process. 1493 void 1494 Debugger::HandleProcessEvent (const EventSP &event_sp) 1495 { 1496 using namespace lldb; 1497 const uint32_t event_type = event_sp->GetType(); 1498 ProcessSP process_sp = Process::ProcessEventData::GetProcessFromEvent(event_sp.get()); 1499 1500 StreamSP output_stream_sp = GetAsyncOutputStream(); 1501 StreamSP error_stream_sp = GetAsyncErrorStream(); 1502 const bool gui_enabled = IsForwardingEvents(); 1503 1504 if (!gui_enabled) 1505 { 1506 bool pop_process_io_handler = false; 1507 assert (process_sp); 1508 1509 bool state_is_stopped = false; 1510 const bool got_state_changed = (event_type & Process::eBroadcastBitStateChanged) != 0; 1511 const bool got_stdout = (event_type & Process::eBroadcastBitSTDOUT) != 0; 1512 const bool got_stderr = (event_type & Process::eBroadcastBitSTDERR) != 0; 1513 if (got_state_changed) 1514 { 1515 StateType event_state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 1516 state_is_stopped = StateIsStoppedState(event_state, false); 1517 } 1518 1519 // Display running state changes first before any STDIO 1520 if (got_state_changed && !state_is_stopped) 1521 { 1522 Process::HandleProcessStateChangedEvent (event_sp, output_stream_sp.get(), pop_process_io_handler); 1523 } 1524 1525 // Now display and STDOUT 1526 if (got_stdout || got_state_changed) 1527 { 1528 GetProcessSTDOUT (process_sp.get(), output_stream_sp.get()); 1529 } 1530 1531 // Now display and STDERR 1532 if (got_stderr || got_state_changed) 1533 { 1534 GetProcessSTDERR (process_sp.get(), error_stream_sp.get()); 1535 } 1536 1537 // Now display any stopped state changes after any STDIO 1538 if (got_state_changed && state_is_stopped) 1539 { 1540 Process::HandleProcessStateChangedEvent (event_sp, output_stream_sp.get(), pop_process_io_handler); 1541 } 1542 1543 output_stream_sp->Flush(); 1544 error_stream_sp->Flush(); 1545 1546 if (pop_process_io_handler) 1547 process_sp->PopProcessIOHandler(); 1548 } 1549 } 1550 1551 void 1552 Debugger::HandleThreadEvent (const EventSP &event_sp) 1553 { 1554 // At present the only thread event we handle is the Frame Changed event, 1555 // and all we do for that is just reprint the thread status for that thread. 1556 using namespace lldb; 1557 const uint32_t event_type = event_sp->GetType(); 1558 if (event_type == Thread::eBroadcastBitStackChanged || 1559 event_type == Thread::eBroadcastBitThreadSelected ) 1560 { 1561 ThreadSP thread_sp (Thread::ThreadEventData::GetThreadFromEvent (event_sp.get())); 1562 if (thread_sp) 1563 { 1564 thread_sp->GetStatus(*GetAsyncOutputStream(), 0, 1, 1); 1565 } 1566 } 1567 } 1568 1569 bool 1570 Debugger::IsForwardingEvents () 1571 { 1572 return (bool)m_forward_listener_sp; 1573 } 1574 1575 void 1576 Debugger::EnableForwardEvents (const ListenerSP &listener_sp) 1577 { 1578 m_forward_listener_sp = listener_sp; 1579 } 1580 1581 void 1582 Debugger::CancelForwardEvents (const ListenerSP &listener_sp) 1583 { 1584 m_forward_listener_sp.reset(); 1585 } 1586 1587 1588 void 1589 Debugger::DefaultEventHandler() 1590 { 1591 Listener& listener(GetListener()); 1592 ConstString broadcaster_class_target(Target::GetStaticBroadcasterClass()); 1593 ConstString broadcaster_class_process(Process::GetStaticBroadcasterClass()); 1594 ConstString broadcaster_class_thread(Thread::GetStaticBroadcasterClass()); 1595 BroadcastEventSpec target_event_spec (broadcaster_class_target, 1596 Target::eBroadcastBitBreakpointChanged); 1597 1598 BroadcastEventSpec process_event_spec (broadcaster_class_process, 1599 Process::eBroadcastBitStateChanged | 1600 Process::eBroadcastBitSTDOUT | 1601 Process::eBroadcastBitSTDERR); 1602 1603 BroadcastEventSpec thread_event_spec (broadcaster_class_thread, 1604 Thread::eBroadcastBitStackChanged | 1605 Thread::eBroadcastBitThreadSelected ); 1606 1607 listener.StartListeningForEventSpec (*this, target_event_spec); 1608 listener.StartListeningForEventSpec (*this, process_event_spec); 1609 listener.StartListeningForEventSpec (*this, thread_event_spec); 1610 listener.StartListeningForEvents (m_command_interpreter_ap.get(), 1611 CommandInterpreter::eBroadcastBitQuitCommandReceived | 1612 CommandInterpreter::eBroadcastBitAsynchronousOutputData | 1613 CommandInterpreter::eBroadcastBitAsynchronousErrorData ); 1614 1615 // Let the thread that spawned us know that we have started up and 1616 // that we are now listening to all required events so no events get missed 1617 m_sync_broadcaster.BroadcastEvent(eBroadcastBitEventThreadIsListening); 1618 1619 bool done = false; 1620 while (!done) 1621 { 1622 EventSP event_sp; 1623 if (listener.WaitForEvent(NULL, event_sp)) 1624 { 1625 if (event_sp) 1626 { 1627 Broadcaster *broadcaster = event_sp->GetBroadcaster(); 1628 if (broadcaster) 1629 { 1630 uint32_t event_type = event_sp->GetType(); 1631 ConstString broadcaster_class (broadcaster->GetBroadcasterClass()); 1632 if (broadcaster_class == broadcaster_class_process) 1633 { 1634 HandleProcessEvent (event_sp); 1635 } 1636 else if (broadcaster_class == broadcaster_class_target) 1637 { 1638 if (Breakpoint::BreakpointEventData::GetEventDataFromEvent(event_sp.get())) 1639 { 1640 HandleBreakpointEvent (event_sp); 1641 } 1642 } 1643 else if (broadcaster_class == broadcaster_class_thread) 1644 { 1645 HandleThreadEvent (event_sp); 1646 } 1647 else if (broadcaster == m_command_interpreter_ap.get()) 1648 { 1649 if (event_type & CommandInterpreter::eBroadcastBitQuitCommandReceived) 1650 { 1651 done = true; 1652 } 1653 else if (event_type & CommandInterpreter::eBroadcastBitAsynchronousErrorData) 1654 { 1655 const char *data = reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event_sp.get())); 1656 if (data && data[0]) 1657 { 1658 StreamSP error_sp (GetAsyncErrorStream()); 1659 if (error_sp) 1660 { 1661 error_sp->PutCString(data); 1662 error_sp->Flush(); 1663 } 1664 } 1665 } 1666 else if (event_type & CommandInterpreter::eBroadcastBitAsynchronousOutputData) 1667 { 1668 const char *data = reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event_sp.get())); 1669 if (data && data[0]) 1670 { 1671 StreamSP output_sp (GetAsyncOutputStream()); 1672 if (output_sp) 1673 { 1674 output_sp->PutCString(data); 1675 output_sp->Flush(); 1676 } 1677 } 1678 } 1679 } 1680 } 1681 1682 if (m_forward_listener_sp) 1683 m_forward_listener_sp->AddEvent(event_sp); 1684 } 1685 } 1686 } 1687 } 1688 1689 lldb::thread_result_t 1690 Debugger::EventHandlerThread (lldb::thread_arg_t arg) 1691 { 1692 ((Debugger *)arg)->DefaultEventHandler(); 1693 return NULL; 1694 } 1695 1696 bool 1697 Debugger::StartEventHandlerThread() 1698 { 1699 if (!m_event_handler_thread.IsJoinable()) 1700 { 1701 // We must synchronize with the DefaultEventHandler() thread to ensure 1702 // it is up and running and listening to events before we return from 1703 // this function. We do this by listening to events for the 1704 // eBroadcastBitEventThreadIsListening from the m_sync_broadcaster 1705 Listener listener("lldb.debugger.event-handler"); 1706 listener.StartListeningForEvents(&m_sync_broadcaster, eBroadcastBitEventThreadIsListening); 1707 1708 // Use larger 8MB stack for this thread 1709 m_event_handler_thread = ThreadLauncher::LaunchThread("lldb.debugger.event-handler", EventHandlerThread, 1710 this, 1711 NULL, 1712 g_debugger_event_thread_stack_bytes); 1713 1714 // Make sure DefaultEventHandler() is running and listening to events before we return 1715 // from this function. We are only listening for events of type 1716 // eBroadcastBitEventThreadIsListening so we don't need to check the event, we just need 1717 // to wait an infinite amount of time for it (NULL timeout as the first parameter) 1718 lldb::EventSP event_sp; 1719 listener.WaitForEvent(NULL, event_sp); 1720 } 1721 return m_event_handler_thread.IsJoinable(); 1722 } 1723 1724 void 1725 Debugger::StopEventHandlerThread() 1726 { 1727 if (m_event_handler_thread.IsJoinable()) 1728 { 1729 GetCommandInterpreter().BroadcastEvent(CommandInterpreter::eBroadcastBitQuitCommandReceived); 1730 m_event_handler_thread.Join(nullptr); 1731 } 1732 } 1733 1734 1735 lldb::thread_result_t 1736 Debugger::IOHandlerThread (lldb::thread_arg_t arg) 1737 { 1738 Debugger *debugger = (Debugger *)arg; 1739 debugger->ExecuteIOHandlers(); 1740 debugger->StopEventHandlerThread(); 1741 return NULL; 1742 } 1743 1744 bool 1745 Debugger::HasIOHandlerThread() 1746 { 1747 return m_io_handler_thread.IsJoinable(); 1748 } 1749 1750 bool 1751 Debugger::StartIOHandlerThread() 1752 { 1753 if (!m_io_handler_thread.IsJoinable()) 1754 m_io_handler_thread = ThreadLauncher::LaunchThread ("lldb.debugger.io-handler", 1755 IOHandlerThread, 1756 this, 1757 NULL, 1758 8*1024*1024); // Use larger 8MB stack for this thread 1759 return m_io_handler_thread.IsJoinable(); 1760 } 1761 1762 void 1763 Debugger::StopIOHandlerThread() 1764 { 1765 if (m_io_handler_thread.IsJoinable()) 1766 { 1767 if (m_input_file_sp) 1768 m_input_file_sp->GetFile().Close(); 1769 m_io_handler_thread.Join(nullptr); 1770 } 1771 } 1772 1773 void 1774 Debugger::JoinIOHandlerThread() 1775 { 1776 if (HasIOHandlerThread()) 1777 { 1778 thread_result_t result; 1779 m_io_handler_thread.Join(&result); 1780 m_io_handler_thread = LLDB_INVALID_HOST_THREAD; 1781 } 1782 } 1783 1784 Target * 1785 Debugger::GetDummyTarget() 1786 { 1787 return m_target_list.GetDummyTarget (*this).get(); 1788 } 1789 1790 Target * 1791 Debugger::GetSelectedOrDummyTarget(bool prefer_dummy) 1792 { 1793 Target *target = nullptr; 1794 if (!prefer_dummy) 1795 { 1796 target = m_target_list.GetSelectedTarget().get(); 1797 if (target) 1798 return target; 1799 } 1800 1801 return GetDummyTarget(); 1802 } 1803 1804 Error 1805 Debugger::RunREPL (LanguageType language, const char *repl_options) 1806 { 1807 Error err; 1808 FileSpec repl_executable; 1809 1810 if (language == eLanguageTypeUnknown) 1811 { 1812 std::set<LanguageType> repl_languages; 1813 1814 Language::GetLanguagesSupportingREPLs(repl_languages); 1815 1816 if (repl_languages.size() == 1) 1817 { 1818 language = *repl_languages.begin(); 1819 } 1820 else if (repl_languages.size() == 0) 1821 { 1822 err.SetErrorStringWithFormat("LLDB isn't configured with support support for any REPLs."); 1823 return err; 1824 } 1825 else 1826 { 1827 err.SetErrorStringWithFormat("Multiple possible REPL languages. Please specify a language."); 1828 return err; 1829 } 1830 } 1831 1832 Target *const target = nullptr; // passing in an empty target means the REPL must create one 1833 1834 REPLSP repl_sp(REPL::Create(err, language, this, target, repl_options)); 1835 1836 if (!err.Success()) 1837 { 1838 return err; 1839 } 1840 1841 if (!repl_sp) 1842 { 1843 err.SetErrorStringWithFormat("couldn't find a REPL for %s", Language::GetNameForLanguageType(language)); 1844 return err; 1845 } 1846 1847 repl_sp->SetCompilerOptions(repl_options); 1848 repl_sp->RunLoop(); 1849 1850 return err; 1851 } 1852 1853