SBTarget.cpp revision 263363
1//===-- SBTarget.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/lldb-python.h" 11 12#include "lldb/API/SBTarget.h" 13 14#include "lldb/lldb-public.h" 15 16#include "lldb/API/SBDebugger.h" 17#include "lldb/API/SBBreakpoint.h" 18#include "lldb/API/SBExpressionOptions.h" 19#include "lldb/API/SBFileSpec.h" 20#include "lldb/API/SBListener.h" 21#include "lldb/API/SBModule.h" 22#include "lldb/API/SBModuleSpec.h" 23#include "lldb/API/SBSourceManager.h" 24#include "lldb/API/SBProcess.h" 25#include "lldb/API/SBStream.h" 26#include "lldb/API/SBSymbolContextList.h" 27#include "lldb/Breakpoint/BreakpointID.h" 28#include "lldb/Breakpoint/BreakpointIDList.h" 29#include "lldb/Breakpoint/BreakpointList.h" 30#include "lldb/Breakpoint/BreakpointLocation.h" 31#include "lldb/Core/Address.h" 32#include "lldb/Core/AddressResolver.h" 33#include "lldb/Core/AddressResolverName.h" 34#include "lldb/Core/ArchSpec.h" 35#include "lldb/Core/Debugger.h" 36#include "lldb/Core/Disassembler.h" 37#include "lldb/Core/Log.h" 38#include "lldb/Core/Module.h" 39#include "lldb/Core/ModuleSpec.h" 40#include "lldb/Core/RegularExpression.h" 41#include "lldb/Core/SearchFilter.h" 42#include "lldb/Core/Section.h" 43#include "lldb/Core/STLUtils.h" 44#include "lldb/Core/ValueObjectConstResult.h" 45#include "lldb/Core/ValueObjectList.h" 46#include "lldb/Core/ValueObjectVariable.h" 47#include "lldb/Host/FileSpec.h" 48#include "lldb/Host/Host.h" 49#include "lldb/Interpreter/Args.h" 50#include "lldb/Symbol/ObjectFile.h" 51#include "lldb/Symbol/SymbolVendor.h" 52#include "lldb/Symbol/VariableList.h" 53#include "lldb/Target/LanguageRuntime.h" 54#include "lldb/Target/Process.h" 55#include "lldb/Target/Target.h" 56#include "lldb/Target/TargetList.h" 57 58#include "lldb/Interpreter/CommandReturnObject.h" 59#include "../source/Commands/CommandObjectBreakpoint.h" 60 61 62using namespace lldb; 63using namespace lldb_private; 64 65#define DEFAULT_DISASM_BYTE_SIZE 32 66 67SBLaunchInfo::SBLaunchInfo (const char **argv) : 68 m_opaque_sp(new ProcessLaunchInfo()) 69{ 70 m_opaque_sp->GetFlags().Reset (eLaunchFlagDebug | eLaunchFlagDisableASLR); 71 if (argv && argv[0]) 72 m_opaque_sp->GetArguments().SetArguments(argv); 73} 74 75SBLaunchInfo::~SBLaunchInfo() 76{ 77} 78 79lldb_private::ProcessLaunchInfo & 80SBLaunchInfo::ref () 81{ 82 return *m_opaque_sp; 83} 84 85 86uint32_t 87SBLaunchInfo::GetUserID() 88{ 89 return m_opaque_sp->GetUserID(); 90} 91 92uint32_t 93SBLaunchInfo::GetGroupID() 94{ 95 return m_opaque_sp->GetGroupID(); 96} 97 98bool 99SBLaunchInfo::UserIDIsValid () 100{ 101 return m_opaque_sp->UserIDIsValid(); 102} 103 104bool 105SBLaunchInfo::GroupIDIsValid () 106{ 107 return m_opaque_sp->GroupIDIsValid(); 108} 109 110void 111SBLaunchInfo::SetUserID (uint32_t uid) 112{ 113 m_opaque_sp->SetUserID (uid); 114} 115 116void 117SBLaunchInfo::SetGroupID (uint32_t gid) 118{ 119 m_opaque_sp->SetGroupID (gid); 120} 121 122uint32_t 123SBLaunchInfo::GetNumArguments () 124{ 125 return m_opaque_sp->GetArguments().GetArgumentCount(); 126} 127 128const char * 129SBLaunchInfo::GetArgumentAtIndex (uint32_t idx) 130{ 131 return m_opaque_sp->GetArguments().GetArgumentAtIndex(idx); 132} 133 134void 135SBLaunchInfo::SetArguments (const char **argv, bool append) 136{ 137 if (append) 138 { 139 if (argv) 140 m_opaque_sp->GetArguments().AppendArguments(argv); 141 } 142 else 143 { 144 if (argv) 145 m_opaque_sp->GetArguments().SetArguments(argv); 146 else 147 m_opaque_sp->GetArguments().Clear(); 148 } 149} 150 151uint32_t 152SBLaunchInfo::GetNumEnvironmentEntries () 153{ 154 return m_opaque_sp->GetEnvironmentEntries().GetArgumentCount(); 155} 156 157const char * 158SBLaunchInfo::GetEnvironmentEntryAtIndex (uint32_t idx) 159{ 160 return m_opaque_sp->GetEnvironmentEntries().GetArgumentAtIndex(idx); 161} 162 163void 164SBLaunchInfo::SetEnvironmentEntries (const char **envp, bool append) 165{ 166 if (append) 167 { 168 if (envp) 169 m_opaque_sp->GetEnvironmentEntries().AppendArguments(envp); 170 } 171 else 172 { 173 if (envp) 174 m_opaque_sp->GetEnvironmentEntries().SetArguments(envp); 175 else 176 m_opaque_sp->GetEnvironmentEntries().Clear(); 177 } 178} 179 180void 181SBLaunchInfo::Clear () 182{ 183 m_opaque_sp->Clear(); 184} 185 186const char * 187SBLaunchInfo::GetWorkingDirectory () const 188{ 189 return m_opaque_sp->GetWorkingDirectory(); 190} 191 192void 193SBLaunchInfo::SetWorkingDirectory (const char *working_dir) 194{ 195 m_opaque_sp->SetWorkingDirectory(working_dir); 196} 197 198uint32_t 199SBLaunchInfo::GetLaunchFlags () 200{ 201 return m_opaque_sp->GetFlags().Get(); 202} 203 204void 205SBLaunchInfo::SetLaunchFlags (uint32_t flags) 206{ 207 m_opaque_sp->GetFlags().Reset(flags); 208} 209 210const char * 211SBLaunchInfo::GetProcessPluginName () 212{ 213 return m_opaque_sp->GetProcessPluginName(); 214} 215 216void 217SBLaunchInfo::SetProcessPluginName (const char *plugin_name) 218{ 219 return m_opaque_sp->SetProcessPluginName (plugin_name); 220} 221 222const char * 223SBLaunchInfo::GetShell () 224{ 225 return m_opaque_sp->GetShell(); 226} 227 228void 229SBLaunchInfo::SetShell (const char * path) 230{ 231 m_opaque_sp->SetShell (path); 232} 233 234uint32_t 235SBLaunchInfo::GetResumeCount () 236{ 237 return m_opaque_sp->GetResumeCount(); 238} 239 240void 241SBLaunchInfo::SetResumeCount (uint32_t c) 242{ 243 m_opaque_sp->SetResumeCount (c); 244} 245 246bool 247SBLaunchInfo::AddCloseFileAction (int fd) 248{ 249 return m_opaque_sp->AppendCloseFileAction(fd); 250} 251 252bool 253SBLaunchInfo::AddDuplicateFileAction (int fd, int dup_fd) 254{ 255 return m_opaque_sp->AppendDuplicateFileAction(fd, dup_fd); 256} 257 258bool 259SBLaunchInfo::AddOpenFileAction (int fd, const char *path, bool read, bool write) 260{ 261 return m_opaque_sp->AppendOpenFileAction(fd, path, read, write); 262} 263 264bool 265SBLaunchInfo::AddSuppressFileAction (int fd, bool read, bool write) 266{ 267 return m_opaque_sp->AppendSuppressFileAction(fd, read, write); 268} 269 270 271SBAttachInfo::SBAttachInfo () : 272 m_opaque_sp (new ProcessAttachInfo()) 273{ 274} 275 276SBAttachInfo::SBAttachInfo (lldb::pid_t pid) : 277 m_opaque_sp (new ProcessAttachInfo()) 278{ 279 m_opaque_sp->SetProcessID (pid); 280} 281 282SBAttachInfo::SBAttachInfo (const char *path, bool wait_for) : 283 m_opaque_sp (new ProcessAttachInfo()) 284{ 285 if (path && path[0]) 286 m_opaque_sp->GetExecutableFile().SetFile(path, false); 287 m_opaque_sp->SetWaitForLaunch (wait_for); 288} 289 290SBAttachInfo::SBAttachInfo (const SBAttachInfo &rhs) : 291 m_opaque_sp (new ProcessAttachInfo()) 292{ 293 *m_opaque_sp = *rhs.m_opaque_sp; 294} 295 296SBAttachInfo::~SBAttachInfo() 297{ 298} 299 300lldb_private::ProcessAttachInfo & 301SBAttachInfo::ref () 302{ 303 return *m_opaque_sp; 304} 305 306SBAttachInfo & 307SBAttachInfo::operator = (const SBAttachInfo &rhs) 308{ 309 if (this != &rhs) 310 *m_opaque_sp = *rhs.m_opaque_sp; 311 return *this; 312} 313 314lldb::pid_t 315SBAttachInfo::GetProcessID () 316{ 317 return m_opaque_sp->GetProcessID(); 318} 319 320void 321SBAttachInfo::SetProcessID (lldb::pid_t pid) 322{ 323 m_opaque_sp->SetProcessID (pid); 324} 325 326 327uint32_t 328SBAttachInfo::GetResumeCount () 329{ 330 return m_opaque_sp->GetResumeCount(); 331} 332 333void 334SBAttachInfo::SetResumeCount (uint32_t c) 335{ 336 m_opaque_sp->SetResumeCount (c); 337} 338 339const char * 340SBAttachInfo::GetProcessPluginName () 341{ 342 return m_opaque_sp->GetProcessPluginName(); 343} 344 345void 346SBAttachInfo::SetProcessPluginName (const char *plugin_name) 347{ 348 return m_opaque_sp->SetProcessPluginName (plugin_name); 349} 350 351void 352SBAttachInfo::SetExecutable (const char *path) 353{ 354 if (path && path[0]) 355 m_opaque_sp->GetExecutableFile().SetFile(path, false); 356 else 357 m_opaque_sp->GetExecutableFile().Clear(); 358} 359 360void 361SBAttachInfo::SetExecutable (SBFileSpec exe_file) 362{ 363 if (exe_file.IsValid()) 364 m_opaque_sp->GetExecutableFile() = exe_file.ref(); 365 else 366 m_opaque_sp->GetExecutableFile().Clear(); 367} 368 369bool 370SBAttachInfo::GetWaitForLaunch () 371{ 372 return m_opaque_sp->GetWaitForLaunch(); 373} 374 375void 376SBAttachInfo::SetWaitForLaunch (bool b) 377{ 378 m_opaque_sp->SetWaitForLaunch (b); 379} 380 381bool 382SBAttachInfo::GetIgnoreExisting () 383{ 384 return m_opaque_sp->GetIgnoreExisting(); 385} 386 387void 388SBAttachInfo::SetIgnoreExisting (bool b) 389{ 390 m_opaque_sp->SetIgnoreExisting (b); 391} 392 393uint32_t 394SBAttachInfo::GetUserID() 395{ 396 return m_opaque_sp->GetUserID(); 397} 398 399uint32_t 400SBAttachInfo::GetGroupID() 401{ 402 return m_opaque_sp->GetGroupID(); 403} 404 405bool 406SBAttachInfo::UserIDIsValid () 407{ 408 return m_opaque_sp->UserIDIsValid(); 409} 410 411bool 412SBAttachInfo::GroupIDIsValid () 413{ 414 return m_opaque_sp->GroupIDIsValid(); 415} 416 417void 418SBAttachInfo::SetUserID (uint32_t uid) 419{ 420 m_opaque_sp->SetUserID (uid); 421} 422 423void 424SBAttachInfo::SetGroupID (uint32_t gid) 425{ 426 m_opaque_sp->SetGroupID (gid); 427} 428 429uint32_t 430SBAttachInfo::GetEffectiveUserID() 431{ 432 return m_opaque_sp->GetEffectiveUserID(); 433} 434 435uint32_t 436SBAttachInfo::GetEffectiveGroupID() 437{ 438 return m_opaque_sp->GetEffectiveGroupID(); 439} 440 441bool 442SBAttachInfo::EffectiveUserIDIsValid () 443{ 444 return m_opaque_sp->EffectiveUserIDIsValid(); 445} 446 447bool 448SBAttachInfo::EffectiveGroupIDIsValid () 449{ 450 return m_opaque_sp->EffectiveGroupIDIsValid (); 451} 452 453void 454SBAttachInfo::SetEffectiveUserID (uint32_t uid) 455{ 456 m_opaque_sp->SetEffectiveUserID(uid); 457} 458 459void 460SBAttachInfo::SetEffectiveGroupID (uint32_t gid) 461{ 462 m_opaque_sp->SetEffectiveGroupID(gid); 463} 464 465lldb::pid_t 466SBAttachInfo::GetParentProcessID () 467{ 468 return m_opaque_sp->GetParentProcessID(); 469} 470 471void 472SBAttachInfo::SetParentProcessID (lldb::pid_t pid) 473{ 474 m_opaque_sp->SetParentProcessID (pid); 475} 476 477bool 478SBAttachInfo::ParentProcessIDIsValid() 479{ 480 return m_opaque_sp->ParentProcessIDIsValid(); 481} 482 483 484//---------------------------------------------------------------------- 485// SBTarget constructor 486//---------------------------------------------------------------------- 487SBTarget::SBTarget () : 488 m_opaque_sp () 489{ 490} 491 492SBTarget::SBTarget (const SBTarget& rhs) : 493 m_opaque_sp (rhs.m_opaque_sp) 494{ 495} 496 497SBTarget::SBTarget(const TargetSP& target_sp) : 498 m_opaque_sp (target_sp) 499{ 500} 501 502const SBTarget& 503SBTarget::operator = (const SBTarget& rhs) 504{ 505 if (this != &rhs) 506 m_opaque_sp = rhs.m_opaque_sp; 507 return *this; 508} 509 510//---------------------------------------------------------------------- 511// Destructor 512//---------------------------------------------------------------------- 513SBTarget::~SBTarget() 514{ 515} 516 517const char * 518SBTarget::GetBroadcasterClassName () 519{ 520 return Target::GetStaticBroadcasterClass().AsCString(); 521} 522 523bool 524SBTarget::IsValid () const 525{ 526 return m_opaque_sp.get() != NULL && m_opaque_sp->IsValid(); 527} 528 529SBProcess 530SBTarget::GetProcess () 531{ 532 SBProcess sb_process; 533 ProcessSP process_sp; 534 TargetSP target_sp(GetSP()); 535 if (target_sp) 536 { 537 process_sp = target_sp->GetProcessSP(); 538 sb_process.SetSP (process_sp); 539 } 540 541 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 542 if (log) 543 { 544 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)", 545 target_sp.get(), process_sp.get()); 546 } 547 548 return sb_process; 549} 550 551SBDebugger 552SBTarget::GetDebugger () const 553{ 554 SBDebugger debugger; 555 TargetSP target_sp(GetSP()); 556 if (target_sp) 557 debugger.reset (target_sp->GetDebugger().shared_from_this()); 558 return debugger; 559} 560 561SBProcess 562SBTarget::LoadCore (const char *core_file) 563{ 564 SBProcess sb_process; 565 TargetSP target_sp(GetSP()); 566 if (target_sp) 567 { 568 FileSpec filespec(core_file, true); 569 ProcessSP process_sp (target_sp->CreateProcess(target_sp->GetDebugger().GetListener(), 570 NULL, 571 &filespec)); 572 if (process_sp) 573 { 574 process_sp->LoadCore(); 575 sb_process.SetSP (process_sp); 576 } 577 } 578 return sb_process; 579} 580 581SBProcess 582SBTarget::LaunchSimple 583( 584 char const **argv, 585 char const **envp, 586 const char *working_directory 587) 588{ 589 char *stdin_path = NULL; 590 char *stdout_path = NULL; 591 char *stderr_path = NULL; 592 uint32_t launch_flags = 0; 593 bool stop_at_entry = false; 594 SBError error; 595 SBListener listener = GetDebugger().GetListener(); 596 return Launch (listener, 597 argv, 598 envp, 599 stdin_path, 600 stdout_path, 601 stderr_path, 602 working_directory, 603 launch_flags, 604 stop_at_entry, 605 error); 606} 607 608SBProcess 609SBTarget::Launch 610( 611 SBListener &listener, 612 char const **argv, 613 char const **envp, 614 const char *stdin_path, 615 const char *stdout_path, 616 const char *stderr_path, 617 const char *working_directory, 618 uint32_t launch_flags, // See LaunchFlags 619 bool stop_at_entry, 620 lldb::SBError& error 621) 622{ 623 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 624 625 SBProcess sb_process; 626 ProcessSP process_sp; 627 TargetSP target_sp(GetSP()); 628 629 if (log) 630 { 631 log->Printf ("SBTarget(%p)::Launch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...", 632 target_sp.get(), 633 argv, 634 envp, 635 stdin_path ? stdin_path : "NULL", 636 stdout_path ? stdout_path : "NULL", 637 stderr_path ? stderr_path : "NULL", 638 working_directory ? working_directory : "NULL", 639 launch_flags, 640 stop_at_entry, 641 error.get()); 642 } 643 644 if (target_sp) 645 { 646 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 647 648 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR")) 649 launch_flags |= eLaunchFlagDisableASLR; 650 651 StateType state = eStateInvalid; 652 process_sp = target_sp->GetProcessSP(); 653 if (process_sp) 654 { 655 state = process_sp->GetState(); 656 657 if (process_sp->IsAlive() && state != eStateConnected) 658 { 659 if (state == eStateAttaching) 660 error.SetErrorString ("process attach is in progress"); 661 else 662 error.SetErrorString ("a process is already being debugged"); 663 return sb_process; 664 } 665 } 666 667 if (state == eStateConnected) 668 { 669 // If we are already connected, then we have already specified the 670 // listener, so if a valid listener is supplied, we need to error out 671 // to let the client know. 672 if (listener.IsValid()) 673 { 674 error.SetErrorString ("process is connected and already has a listener, pass empty listener"); 675 return sb_process; 676 } 677 } 678 else 679 { 680 if (listener.IsValid()) 681 process_sp = target_sp->CreateProcess (listener.ref(), NULL, NULL); 682 else 683 process_sp = target_sp->CreateProcess (target_sp->GetDebugger().GetListener(), NULL, NULL); 684 } 685 686 if (process_sp) 687 { 688 sb_process.SetSP (process_sp); 689 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO")) 690 launch_flags |= eLaunchFlagDisableSTDIO; 691 692 ProcessLaunchInfo launch_info (stdin_path, stdout_path, stderr_path, working_directory, launch_flags); 693 694 Module *exe_module = target_sp->GetExecutableModulePointer(); 695 if (exe_module) 696 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 697 if (argv) 698 launch_info.GetArguments().AppendArguments (argv); 699 if (envp) 700 launch_info.GetEnvironmentEntries ().SetArguments (envp); 701 702 error.SetError (process_sp->Launch (launch_info)); 703 if (error.Success()) 704 { 705 // We we are stopping at the entry point, we can return now! 706 if (stop_at_entry) 707 return sb_process; 708 709 // Make sure we are stopped at the entry 710 StateType state = process_sp->WaitForProcessToStop (NULL); 711 if (state == eStateStopped) 712 { 713 // resume the process to skip the entry point 714 error.SetError (process_sp->Resume()); 715 if (error.Success()) 716 { 717 // If we are doing synchronous mode, then wait for the 718 // process to stop yet again! 719 if (target_sp->GetDebugger().GetAsyncExecution () == false) 720 process_sp->WaitForProcessToStop (NULL); 721 } 722 } 723 } 724 } 725 else 726 { 727 error.SetErrorString ("unable to create lldb_private::Process"); 728 } 729 } 730 else 731 { 732 error.SetErrorString ("SBTarget is invalid"); 733 } 734 735 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 736 if (log) 737 { 738 log->Printf ("SBTarget(%p)::Launch (...) => SBProcess(%p)", 739 target_sp.get(), process_sp.get()); 740 } 741 742 return sb_process; 743} 744 745SBProcess 746SBTarget::Launch (SBLaunchInfo &sb_launch_info, SBError& error) 747{ 748 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 749 750 SBProcess sb_process; 751 ProcessSP process_sp; 752 TargetSP target_sp(GetSP()); 753 754 if (log) 755 { 756 log->Printf ("SBTarget(%p)::Launch (launch_info, error)...", target_sp.get()); 757 } 758 759 if (target_sp) 760 { 761 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 762 StateType state = eStateInvalid; 763 process_sp = target_sp->GetProcessSP(); 764 if (process_sp) 765 { 766 state = process_sp->GetState(); 767 768 if (process_sp->IsAlive() && state != eStateConnected) 769 { 770 if (state == eStateAttaching) 771 error.SetErrorString ("process attach is in progress"); 772 else 773 error.SetErrorString ("a process is already being debugged"); 774 return sb_process; 775 } 776 } 777 778 if (state != eStateConnected) 779 process_sp = target_sp->CreateProcess (target_sp->GetDebugger().GetListener(), NULL, NULL); 780 781 if (process_sp) 782 { 783 sb_process.SetSP (process_sp); 784 lldb_private::ProcessLaunchInfo &launch_info = sb_launch_info.ref(); 785 786 Module *exe_module = target_sp->GetExecutableModulePointer(); 787 if (exe_module) 788 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 789 790 const ArchSpec &arch_spec = target_sp->GetArchitecture(); 791 if (arch_spec.IsValid()) 792 launch_info.GetArchitecture () = arch_spec; 793 794 error.SetError (process_sp->Launch (launch_info)); 795 const bool synchronous_execution = target_sp->GetDebugger().GetAsyncExecution () == false; 796 if (error.Success()) 797 { 798 if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) 799 { 800 // If we are doing synchronous mode, then wait for the initial 801 // stop to happen, else, return and let the caller watch for 802 // the stop 803 if (synchronous_execution) 804 process_sp->WaitForProcessToStop (NULL); 805 // We we are stopping at the entry point, we can return now! 806 return sb_process; 807 } 808 809 // Make sure we are stopped at the entry 810 StateType state = process_sp->WaitForProcessToStop (NULL); 811 if (state == eStateStopped) 812 { 813 // resume the process to skip the entry point 814 error.SetError (process_sp->Resume()); 815 if (error.Success()) 816 { 817 // If we are doing synchronous mode, then wait for the 818 // process to stop yet again! 819 if (synchronous_execution) 820 process_sp->WaitForProcessToStop (NULL); 821 } 822 } 823 } 824 } 825 else 826 { 827 error.SetErrorString ("unable to create lldb_private::Process"); 828 } 829 } 830 else 831 { 832 error.SetErrorString ("SBTarget is invalid"); 833 } 834 835 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 836 if (log) 837 { 838 log->Printf ("SBTarget(%p)::Launch (...) => SBProcess(%p)", 839 target_sp.get(), process_sp.get()); 840 } 841 842 return sb_process; 843} 844 845lldb::SBProcess 846SBTarget::Attach (SBAttachInfo &sb_attach_info, SBError& error) 847{ 848 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 849 850 SBProcess sb_process; 851 ProcessSP process_sp; 852 TargetSP target_sp(GetSP()); 853 854 if (log) 855 { 856 log->Printf ("SBTarget(%p)::Attach (sb_attach_info, error)...", target_sp.get()); 857 } 858 859 if (target_sp) 860 { 861 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 862 863 StateType state = eStateInvalid; 864 process_sp = target_sp->GetProcessSP(); 865 if (process_sp) 866 { 867 state = process_sp->GetState(); 868 869 if (process_sp->IsAlive() && state != eStateConnected) 870 { 871 if (state == eStateAttaching) 872 error.SetErrorString ("process attach is in progress"); 873 else 874 error.SetErrorString ("a process is already being debugged"); 875 if (log) 876 { 877 log->Printf ("SBTarget(%p)::Attach (...) => error %s", 878 target_sp.get(), error.GetCString()); 879 } 880 return sb_process; 881 } 882 } 883 884 if (state != eStateConnected) 885 process_sp = target_sp->CreateProcess (target_sp->GetDebugger().GetListener(), NULL, NULL); 886 887 if (process_sp) 888 { 889 ProcessAttachInfo &attach_info = sb_attach_info.ref(); 890 if (attach_info.ProcessIDIsValid() && !attach_info.UserIDIsValid()) 891 { 892 PlatformSP platform_sp = target_sp->GetPlatform(); 893 // See if we can pre-verify if a process exists or not 894 if (platform_sp && platform_sp->IsConnected()) 895 { 896 lldb::pid_t attach_pid = attach_info.GetProcessID(); 897 ProcessInstanceInfo instance_info; 898 if (platform_sp->GetProcessInfo(attach_pid, instance_info)) 899 { 900 attach_info.SetUserID(instance_info.GetEffectiveUserID()); 901 } 902 else 903 { 904 error.ref().SetErrorStringWithFormat("no process found with process ID %" PRIu64, attach_pid); 905 if (log) 906 { 907 log->Printf ("SBTarget(%p)::Attach (...) => error %s", 908 target_sp.get(), error.GetCString()); 909 } 910 return sb_process; 911 } 912 } 913 } 914 error.SetError (process_sp->Attach (attach_info)); 915 if (error.Success()) 916 { 917 sb_process.SetSP (process_sp); 918 // If we are doing synchronous mode, then wait for the 919 // process to stop! 920 if (target_sp->GetDebugger().GetAsyncExecution () == false) 921 process_sp->WaitForProcessToStop (NULL); 922 } 923 } 924 else 925 { 926 error.SetErrorString ("unable to create lldb_private::Process"); 927 } 928 } 929 else 930 { 931 error.SetErrorString ("SBTarget is invalid"); 932 } 933 934 if (log) 935 { 936 log->Printf ("SBTarget(%p)::Attach (...) => SBProcess(%p)", 937 target_sp.get(), process_sp.get()); 938 } 939 940 return sb_process; 941} 942 943 944#if defined(__APPLE__) 945 946lldb::SBProcess 947SBTarget::AttachToProcessWithID (SBListener &listener, 948 ::pid_t pid, 949 lldb::SBError& error) 950{ 951 return AttachToProcessWithID (listener, (lldb::pid_t)pid, error); 952} 953 954#endif // #if defined(__APPLE__) 955 956lldb::SBProcess 957SBTarget::AttachToProcessWithID 958( 959 SBListener &listener, 960 lldb::pid_t pid,// The process ID to attach to 961 SBError& error // An error explaining what went wrong if attach fails 962) 963{ 964 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 965 966 SBProcess sb_process; 967 ProcessSP process_sp; 968 TargetSP target_sp(GetSP()); 969 970 if (log) 971 { 972 log->Printf ("SBTarget(%p)::AttachToProcessWithID (listener, pid=%" PRId64 ", error)...", target_sp.get(), pid); 973 } 974 975 if (target_sp) 976 { 977 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 978 979 StateType state = eStateInvalid; 980 process_sp = target_sp->GetProcessSP(); 981 if (process_sp) 982 { 983 state = process_sp->GetState(); 984 985 if (process_sp->IsAlive() && state != eStateConnected) 986 { 987 if (state == eStateAttaching) 988 error.SetErrorString ("process attach is in progress"); 989 else 990 error.SetErrorString ("a process is already being debugged"); 991 return sb_process; 992 } 993 } 994 995 if (state == eStateConnected) 996 { 997 // If we are already connected, then we have already specified the 998 // listener, so if a valid listener is supplied, we need to error out 999 // to let the client know. 1000 if (listener.IsValid()) 1001 { 1002 error.SetErrorString ("process is connected and already has a listener, pass empty listener"); 1003 return sb_process; 1004 } 1005 } 1006 else 1007 { 1008 if (listener.IsValid()) 1009 process_sp = target_sp->CreateProcess (listener.ref(), NULL, NULL); 1010 else 1011 process_sp = target_sp->CreateProcess (target_sp->GetDebugger().GetListener(), NULL, NULL); 1012 } 1013 if (process_sp) 1014 { 1015 sb_process.SetSP (process_sp); 1016 1017 ProcessAttachInfo attach_info; 1018 attach_info.SetProcessID (pid); 1019 1020 PlatformSP platform_sp = target_sp->GetPlatform(); 1021 ProcessInstanceInfo instance_info; 1022 if (platform_sp->GetProcessInfo(pid, instance_info)) 1023 { 1024 attach_info.SetUserID(instance_info.GetEffectiveUserID()); 1025 } 1026 error.SetError (process_sp->Attach (attach_info)); 1027 if (error.Success()) 1028 { 1029 // If we are doing synchronous mode, then wait for the 1030 // process to stop! 1031 if (target_sp->GetDebugger().GetAsyncExecution () == false) 1032 process_sp->WaitForProcessToStop (NULL); 1033 } 1034 } 1035 else 1036 { 1037 error.SetErrorString ("unable to create lldb_private::Process"); 1038 } 1039 } 1040 else 1041 { 1042 error.SetErrorString ("SBTarget is invalid"); 1043 } 1044 1045 if (log) 1046 { 1047 log->Printf ("SBTarget(%p)::AttachToProcessWithID (...) => SBProcess(%p)", 1048 target_sp.get(), process_sp.get()); 1049 } 1050 return sb_process; 1051} 1052 1053lldb::SBProcess 1054SBTarget::AttachToProcessWithName 1055( 1056 SBListener &listener, 1057 const char *name, // basename of process to attach to 1058 bool wait_for, // if true wait for a new instance of "name" to be launched 1059 SBError& error // An error explaining what went wrong if attach fails 1060) 1061{ 1062 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1063 1064 SBProcess sb_process; 1065 ProcessSP process_sp; 1066 TargetSP target_sp(GetSP()); 1067 1068 if (log) 1069 { 1070 log->Printf ("SBTarget(%p)::AttachToProcessWithName (listener, name=%s, wait_for=%s, error)...", target_sp.get(), name, wait_for ? "true" : "false"); 1071 } 1072 1073 if (name && target_sp) 1074 { 1075 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1076 1077 StateType state = eStateInvalid; 1078 process_sp = target_sp->GetProcessSP(); 1079 if (process_sp) 1080 { 1081 state = process_sp->GetState(); 1082 1083 if (process_sp->IsAlive() && state != eStateConnected) 1084 { 1085 if (state == eStateAttaching) 1086 error.SetErrorString ("process attach is in progress"); 1087 else 1088 error.SetErrorString ("a process is already being debugged"); 1089 return sb_process; 1090 } 1091 } 1092 1093 if (state == eStateConnected) 1094 { 1095 // If we are already connected, then we have already specified the 1096 // listener, so if a valid listener is supplied, we need to error out 1097 // to let the client know. 1098 if (listener.IsValid()) 1099 { 1100 error.SetErrorString ("process is connected and already has a listener, pass empty listener"); 1101 return sb_process; 1102 } 1103 } 1104 else 1105 { 1106 if (listener.IsValid()) 1107 process_sp = target_sp->CreateProcess (listener.ref(), NULL, NULL); 1108 else 1109 process_sp = target_sp->CreateProcess (target_sp->GetDebugger().GetListener(), NULL, NULL); 1110 } 1111 1112 if (process_sp) 1113 { 1114 sb_process.SetSP (process_sp); 1115 ProcessAttachInfo attach_info; 1116 attach_info.GetExecutableFile().SetFile(name, false); 1117 attach_info.SetWaitForLaunch(wait_for); 1118 error.SetError (process_sp->Attach (attach_info)); 1119 if (error.Success()) 1120 { 1121 // If we are doing synchronous mode, then wait for the 1122 // process to stop! 1123 if (target_sp->GetDebugger().GetAsyncExecution () == false) 1124 process_sp->WaitForProcessToStop (NULL); 1125 } 1126 } 1127 else 1128 { 1129 error.SetErrorString ("unable to create lldb_private::Process"); 1130 } 1131 } 1132 else 1133 { 1134 error.SetErrorString ("SBTarget is invalid"); 1135 } 1136 1137 if (log) 1138 { 1139 log->Printf ("SBTarget(%p)::AttachToPorcessWithName (...) => SBProcess(%p)", 1140 target_sp.get(), process_sp.get()); 1141 } 1142 return sb_process; 1143} 1144 1145lldb::SBProcess 1146SBTarget::ConnectRemote 1147( 1148 SBListener &listener, 1149 const char *url, 1150 const char *plugin_name, 1151 SBError& error 1152) 1153{ 1154 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1155 1156 SBProcess sb_process; 1157 ProcessSP process_sp; 1158 TargetSP target_sp(GetSP()); 1159 1160 if (log) 1161 { 1162 log->Printf ("SBTarget(%p)::ConnectRemote (listener, url=%s, plugin_name=%s, error)...", target_sp.get(), url, plugin_name); 1163 } 1164 1165 if (target_sp) 1166 { 1167 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1168 if (listener.IsValid()) 1169 process_sp = target_sp->CreateProcess (listener.ref(), plugin_name, NULL); 1170 else 1171 process_sp = target_sp->CreateProcess (target_sp->GetDebugger().GetListener(), plugin_name, NULL); 1172 1173 1174 if (process_sp) 1175 { 1176 sb_process.SetSP (process_sp); 1177 error.SetError (process_sp->ConnectRemote (NULL, url)); 1178 } 1179 else 1180 { 1181 error.SetErrorString ("unable to create lldb_private::Process"); 1182 } 1183 } 1184 else 1185 { 1186 error.SetErrorString ("SBTarget is invalid"); 1187 } 1188 1189 if (log) 1190 { 1191 log->Printf ("SBTarget(%p)::ConnectRemote (...) => SBProcess(%p)", 1192 target_sp.get(), process_sp.get()); 1193 } 1194 return sb_process; 1195} 1196 1197SBFileSpec 1198SBTarget::GetExecutable () 1199{ 1200 1201 SBFileSpec exe_file_spec; 1202 TargetSP target_sp(GetSP()); 1203 if (target_sp) 1204 { 1205 Module *exe_module = target_sp->GetExecutableModulePointer(); 1206 if (exe_module) 1207 exe_file_spec.SetFileSpec (exe_module->GetFileSpec()); 1208 } 1209 1210 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1211 if (log) 1212 { 1213 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)", 1214 target_sp.get(), exe_file_spec.get()); 1215 } 1216 1217 return exe_file_spec; 1218} 1219 1220bool 1221SBTarget::operator == (const SBTarget &rhs) const 1222{ 1223 return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 1224} 1225 1226bool 1227SBTarget::operator != (const SBTarget &rhs) const 1228{ 1229 return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 1230} 1231 1232lldb::TargetSP 1233SBTarget::GetSP () const 1234{ 1235 return m_opaque_sp; 1236} 1237 1238void 1239SBTarget::SetSP (const lldb::TargetSP& target_sp) 1240{ 1241 m_opaque_sp = target_sp; 1242} 1243 1244lldb::SBAddress 1245SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr) 1246{ 1247 lldb::SBAddress sb_addr; 1248 Address &addr = sb_addr.ref(); 1249 TargetSP target_sp(GetSP()); 1250 if (target_sp) 1251 { 1252 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1253 if (target_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, addr)) 1254 return sb_addr; 1255 } 1256 1257 // We have a load address that isn't in a section, just return an address 1258 // with the offset filled in (the address) and the section set to NULL 1259 addr.SetRawAddress(vm_addr); 1260 return sb_addr; 1261} 1262 1263SBSymbolContext 1264SBTarget::ResolveSymbolContextForAddress (const SBAddress& addr, 1265 uint32_t resolve_scope) 1266{ 1267 SBSymbolContext sc; 1268 if (addr.IsValid()) 1269 { 1270 TargetSP target_sp(GetSP()); 1271 if (target_sp) 1272 target_sp->GetImages().ResolveSymbolContextForAddress (addr.ref(), resolve_scope, sc.ref()); 1273 } 1274 return sc; 1275} 1276 1277 1278SBBreakpoint 1279SBTarget::BreakpointCreateByLocation (const char *file, 1280 uint32_t line) 1281{ 1282 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line)); 1283} 1284 1285SBBreakpoint 1286SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, 1287 uint32_t line) 1288{ 1289 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1290 1291 SBBreakpoint sb_bp; 1292 TargetSP target_sp(GetSP()); 1293 if (target_sp && line != 0) 1294 { 1295 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1296 1297 const LazyBool check_inlines = eLazyBoolCalculate; 1298 const LazyBool skip_prologue = eLazyBoolCalculate; 1299 const bool internal = false; 1300 const bool hardware = false; 1301 *sb_bp = target_sp->CreateBreakpoint (NULL, *sb_file_spec, line, check_inlines, skip_prologue, internal, hardware); 1302 } 1303 1304 if (log) 1305 { 1306 SBStream sstr; 1307 sb_bp.GetDescription (sstr); 1308 char path[PATH_MAX]; 1309 sb_file_spec->GetPath (path, sizeof(path)); 1310 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s", 1311 target_sp.get(), 1312 path, 1313 line, 1314 sb_bp.get(), 1315 sstr.GetData()); 1316 } 1317 1318 return sb_bp; 1319} 1320 1321SBBreakpoint 1322SBTarget::BreakpointCreateByName (const char *symbol_name, 1323 const char *module_name) 1324{ 1325 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1326 1327 SBBreakpoint sb_bp; 1328 TargetSP target_sp(GetSP()); 1329 if (target_sp.get()) 1330 { 1331 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1332 1333 const bool internal = false; 1334 const bool hardware = false; 1335 const LazyBool skip_prologue = eLazyBoolCalculate; 1336 if (module_name && module_name[0]) 1337 { 1338 FileSpecList module_spec_list; 1339 module_spec_list.Append (FileSpec (module_name, false)); 1340 *sb_bp = target_sp->CreateBreakpoint (&module_spec_list, NULL, symbol_name, eFunctionNameTypeAuto, skip_prologue, internal, hardware); 1341 } 1342 else 1343 { 1344 *sb_bp = target_sp->CreateBreakpoint (NULL, NULL, symbol_name, eFunctionNameTypeAuto, skip_prologue, internal, hardware); 1345 } 1346 } 1347 1348 if (log) 1349 { 1350 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)", 1351 target_sp.get(), symbol_name, module_name, sb_bp.get()); 1352 } 1353 1354 return sb_bp; 1355} 1356 1357lldb::SBBreakpoint 1358SBTarget::BreakpointCreateByName (const char *symbol_name, 1359 const SBFileSpecList &module_list, 1360 const SBFileSpecList &comp_unit_list) 1361{ 1362 uint32_t name_type_mask = eFunctionNameTypeAuto; 1363 return BreakpointCreateByName (symbol_name, name_type_mask, module_list, comp_unit_list); 1364} 1365 1366lldb::SBBreakpoint 1367SBTarget::BreakpointCreateByName (const char *symbol_name, 1368 uint32_t name_type_mask, 1369 const SBFileSpecList &module_list, 1370 const SBFileSpecList &comp_unit_list) 1371{ 1372 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1373 1374 SBBreakpoint sb_bp; 1375 TargetSP target_sp(GetSP()); 1376 if (target_sp && symbol_name && symbol_name[0]) 1377 { 1378 const bool internal = false; 1379 const bool hardware = false; 1380 const LazyBool skip_prologue = eLazyBoolCalculate; 1381 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1382 *sb_bp = target_sp->CreateBreakpoint (module_list.get(), 1383 comp_unit_list.get(), 1384 symbol_name, 1385 name_type_mask, 1386 skip_prologue, 1387 internal, 1388 hardware); 1389 } 1390 1391 if (log) 1392 { 1393 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", name_type: %d) => SBBreakpoint(%p)", 1394 target_sp.get(), symbol_name, name_type_mask, sb_bp.get()); 1395 } 1396 1397 return sb_bp; 1398} 1399 1400lldb::SBBreakpoint 1401SBTarget::BreakpointCreateByNames (const char *symbol_names[], 1402 uint32_t num_names, 1403 uint32_t name_type_mask, 1404 const SBFileSpecList &module_list, 1405 const SBFileSpecList &comp_unit_list) 1406{ 1407 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1408 1409 SBBreakpoint sb_bp; 1410 TargetSP target_sp(GetSP()); 1411 if (target_sp && num_names > 0) 1412 { 1413 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1414 const bool internal = false; 1415 const bool hardware = false; 1416 const LazyBool skip_prologue = eLazyBoolCalculate; 1417 *sb_bp = target_sp->CreateBreakpoint (module_list.get(), 1418 comp_unit_list.get(), 1419 symbol_names, 1420 num_names, 1421 name_type_mask, 1422 skip_prologue, 1423 internal, 1424 hardware); 1425 } 1426 1427 if (log) 1428 { 1429 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbols={", target_sp.get()); 1430 for (uint32_t i = 0 ; i < num_names; i++) 1431 { 1432 char sep; 1433 if (i < num_names - 1) 1434 sep = ','; 1435 else 1436 sep = '}'; 1437 if (symbol_names[i] != NULL) 1438 log->Printf ("\"%s\"%c ", symbol_names[i], sep); 1439 else 1440 log->Printf ("\"<NULL>\"%c ", sep); 1441 1442 } 1443 log->Printf ("name_type: %d) => SBBreakpoint(%p)", name_type_mask, sb_bp.get()); 1444 } 1445 1446 return sb_bp; 1447} 1448 1449SBBreakpoint 1450SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, 1451 const char *module_name) 1452{ 1453 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1454 1455 SBBreakpoint sb_bp; 1456 TargetSP target_sp(GetSP()); 1457 if (target_sp && symbol_name_regex && symbol_name_regex[0]) 1458 { 1459 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1460 RegularExpression regexp(symbol_name_regex); 1461 const bool internal = false; 1462 const bool hardware = false; 1463 const LazyBool skip_prologue = eLazyBoolCalculate; 1464 1465 if (module_name && module_name[0]) 1466 { 1467 FileSpecList module_spec_list; 1468 module_spec_list.Append (FileSpec (module_name, false)); 1469 1470 *sb_bp = target_sp->CreateFuncRegexBreakpoint (&module_spec_list, NULL, regexp, skip_prologue, internal, hardware); 1471 } 1472 else 1473 { 1474 *sb_bp = target_sp->CreateFuncRegexBreakpoint (NULL, NULL, regexp, skip_prologue, internal, hardware); 1475 } 1476 } 1477 1478 if (log) 1479 { 1480 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)", 1481 target_sp.get(), symbol_name_regex, module_name, sb_bp.get()); 1482 } 1483 1484 return sb_bp; 1485} 1486 1487lldb::SBBreakpoint 1488SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, 1489 const SBFileSpecList &module_list, 1490 const SBFileSpecList &comp_unit_list) 1491{ 1492 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1493 1494 SBBreakpoint sb_bp; 1495 TargetSP target_sp(GetSP()); 1496 if (target_sp && symbol_name_regex && symbol_name_regex[0]) 1497 { 1498 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1499 RegularExpression regexp(symbol_name_regex); 1500 const bool internal = false; 1501 const bool hardware = false; 1502 const LazyBool skip_prologue = eLazyBoolCalculate; 1503 1504 *sb_bp = target_sp->CreateFuncRegexBreakpoint (module_list.get(), comp_unit_list.get(), regexp, skip_prologue, internal, hardware); 1505 } 1506 1507 if (log) 1508 { 1509 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\") => SBBreakpoint(%p)", 1510 target_sp.get(), symbol_name_regex, sb_bp.get()); 1511 } 1512 1513 return sb_bp; 1514} 1515 1516SBBreakpoint 1517SBTarget::BreakpointCreateByAddress (addr_t address) 1518{ 1519 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1520 1521 SBBreakpoint sb_bp; 1522 TargetSP target_sp(GetSP()); 1523 if (target_sp) 1524 { 1525 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1526 const bool hardware = false; 1527 *sb_bp = target_sp->CreateBreakpoint (address, false, hardware); 1528 } 1529 1530 if (log) 1531 { 1532 log->Printf ("SBTarget(%p)::BreakpointCreateByAddress (address=%" PRIu64 ") => SBBreakpoint(%p)", target_sp.get(), (uint64_t) address, sb_bp.get()); 1533 } 1534 1535 return sb_bp; 1536} 1537 1538lldb::SBBreakpoint 1539SBTarget::BreakpointCreateBySourceRegex (const char *source_regex, 1540 const lldb::SBFileSpec &source_file, 1541 const char *module_name) 1542{ 1543 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1544 1545 SBBreakpoint sb_bp; 1546 TargetSP target_sp(GetSP()); 1547 if (target_sp && source_regex && source_regex[0]) 1548 { 1549 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1550 RegularExpression regexp(source_regex); 1551 FileSpecList source_file_spec_list; 1552 const bool hardware = false; 1553 source_file_spec_list.Append (source_file.ref()); 1554 1555 if (module_name && module_name[0]) 1556 { 1557 FileSpecList module_spec_list; 1558 module_spec_list.Append (FileSpec (module_name, false)); 1559 1560 *sb_bp = target_sp->CreateSourceRegexBreakpoint (&module_spec_list, &source_file_spec_list, regexp, false, hardware); 1561 } 1562 else 1563 { 1564 *sb_bp = target_sp->CreateSourceRegexBreakpoint (NULL, &source_file_spec_list, regexp, false, hardware); 1565 } 1566 } 1567 1568 if (log) 1569 { 1570 char path[PATH_MAX]; 1571 source_file->GetPath (path, sizeof(path)); 1572 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (source_regex=\"%s\", file=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)", 1573 target_sp.get(), source_regex, path, module_name, sb_bp.get()); 1574 } 1575 1576 return sb_bp; 1577} 1578 1579lldb::SBBreakpoint 1580SBTarget::BreakpointCreateBySourceRegex (const char *source_regex, 1581 const SBFileSpecList &module_list, 1582 const lldb::SBFileSpecList &source_file_list) 1583{ 1584 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1585 1586 SBBreakpoint sb_bp; 1587 TargetSP target_sp(GetSP()); 1588 if (target_sp && source_regex && source_regex[0]) 1589 { 1590 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1591 const bool hardware = false; 1592 RegularExpression regexp(source_regex); 1593 *sb_bp = target_sp->CreateSourceRegexBreakpoint (module_list.get(), source_file_list.get(), regexp, false, hardware); 1594 } 1595 1596 if (log) 1597 { 1598 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (source_regex=\"%s\") => SBBreakpoint(%p)", 1599 target_sp.get(), source_regex, sb_bp.get()); 1600 } 1601 1602 return sb_bp; 1603} 1604 1605lldb::SBBreakpoint 1606SBTarget::BreakpointCreateForException (lldb::LanguageType language, 1607 bool catch_bp, 1608 bool throw_bp) 1609{ 1610 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1611 1612 SBBreakpoint sb_bp; 1613 TargetSP target_sp(GetSP()); 1614 if (target_sp) 1615 { 1616 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1617 const bool hardware = false; 1618 *sb_bp = target_sp->CreateExceptionBreakpoint (language, catch_bp, throw_bp, hardware); 1619 } 1620 1621 if (log) 1622 { 1623 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (Language: %s, catch: %s throw: %s) => SBBreakpoint(%p)", 1624 target_sp.get(), 1625 LanguageRuntime::GetNameForLanguageType(language), 1626 catch_bp ? "on" : "off", 1627 throw_bp ? "on" : "off", 1628 sb_bp.get()); 1629 } 1630 1631 return sb_bp; 1632} 1633 1634uint32_t 1635SBTarget::GetNumBreakpoints () const 1636{ 1637 TargetSP target_sp(GetSP()); 1638 if (target_sp) 1639 { 1640 // The breakpoint list is thread safe, no need to lock 1641 return target_sp->GetBreakpointList().GetSize(); 1642 } 1643 return 0; 1644} 1645 1646SBBreakpoint 1647SBTarget::GetBreakpointAtIndex (uint32_t idx) const 1648{ 1649 SBBreakpoint sb_breakpoint; 1650 TargetSP target_sp(GetSP()); 1651 if (target_sp) 1652 { 1653 // The breakpoint list is thread safe, no need to lock 1654 *sb_breakpoint = target_sp->GetBreakpointList().GetBreakpointAtIndex(idx); 1655 } 1656 return sb_breakpoint; 1657} 1658 1659bool 1660SBTarget::BreakpointDelete (break_id_t bp_id) 1661{ 1662 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1663 1664 bool result = false; 1665 TargetSP target_sp(GetSP()); 1666 if (target_sp) 1667 { 1668 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1669 result = target_sp->RemoveBreakpointByID (bp_id); 1670 } 1671 1672 if (log) 1673 { 1674 log->Printf ("SBTarget(%p)::BreakpointDelete (bp_id=%d) => %i", target_sp.get(), (uint32_t) bp_id, result); 1675 } 1676 1677 return result; 1678} 1679 1680SBBreakpoint 1681SBTarget::FindBreakpointByID (break_id_t bp_id) 1682{ 1683 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1684 1685 SBBreakpoint sb_breakpoint; 1686 TargetSP target_sp(GetSP()); 1687 if (target_sp && bp_id != LLDB_INVALID_BREAK_ID) 1688 { 1689 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1690 *sb_breakpoint = target_sp->GetBreakpointByID (bp_id); 1691 } 1692 1693 if (log) 1694 { 1695 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)", 1696 target_sp.get(), (uint32_t) bp_id, sb_breakpoint.get()); 1697 } 1698 1699 return sb_breakpoint; 1700} 1701 1702bool 1703SBTarget::EnableAllBreakpoints () 1704{ 1705 TargetSP target_sp(GetSP()); 1706 if (target_sp) 1707 { 1708 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1709 target_sp->EnableAllBreakpoints (); 1710 return true; 1711 } 1712 return false; 1713} 1714 1715bool 1716SBTarget::DisableAllBreakpoints () 1717{ 1718 TargetSP target_sp(GetSP()); 1719 if (target_sp) 1720 { 1721 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1722 target_sp->DisableAllBreakpoints (); 1723 return true; 1724 } 1725 return false; 1726} 1727 1728bool 1729SBTarget::DeleteAllBreakpoints () 1730{ 1731 TargetSP target_sp(GetSP()); 1732 if (target_sp) 1733 { 1734 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1735 target_sp->RemoveAllBreakpoints (); 1736 return true; 1737 } 1738 return false; 1739} 1740 1741uint32_t 1742SBTarget::GetNumWatchpoints () const 1743{ 1744 TargetSP target_sp(GetSP()); 1745 if (target_sp) 1746 { 1747 // The watchpoint list is thread safe, no need to lock 1748 return target_sp->GetWatchpointList().GetSize(); 1749 } 1750 return 0; 1751} 1752 1753SBWatchpoint 1754SBTarget::GetWatchpointAtIndex (uint32_t idx) const 1755{ 1756 SBWatchpoint sb_watchpoint; 1757 TargetSP target_sp(GetSP()); 1758 if (target_sp) 1759 { 1760 // The watchpoint list is thread safe, no need to lock 1761 sb_watchpoint.SetSP (target_sp->GetWatchpointList().GetByIndex(idx)); 1762 } 1763 return sb_watchpoint; 1764} 1765 1766bool 1767SBTarget::DeleteWatchpoint (watch_id_t wp_id) 1768{ 1769 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1770 1771 bool result = false; 1772 TargetSP target_sp(GetSP()); 1773 if (target_sp) 1774 { 1775 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1776 Mutex::Locker locker; 1777 target_sp->GetWatchpointList().GetListMutex(locker); 1778 result = target_sp->RemoveWatchpointByID (wp_id); 1779 } 1780 1781 if (log) 1782 { 1783 log->Printf ("SBTarget(%p)::WatchpointDelete (wp_id=%d) => %i", target_sp.get(), (uint32_t) wp_id, result); 1784 } 1785 1786 return result; 1787} 1788 1789SBWatchpoint 1790SBTarget::FindWatchpointByID (lldb::watch_id_t wp_id) 1791{ 1792 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1793 1794 SBWatchpoint sb_watchpoint; 1795 lldb::WatchpointSP watchpoint_sp; 1796 TargetSP target_sp(GetSP()); 1797 if (target_sp && wp_id != LLDB_INVALID_WATCH_ID) 1798 { 1799 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1800 Mutex::Locker locker; 1801 target_sp->GetWatchpointList().GetListMutex(locker); 1802 watchpoint_sp = target_sp->GetWatchpointList().FindByID(wp_id); 1803 sb_watchpoint.SetSP (watchpoint_sp); 1804 } 1805 1806 if (log) 1807 { 1808 log->Printf ("SBTarget(%p)::FindWatchpointByID (bp_id=%d) => SBWatchpoint(%p)", 1809 target_sp.get(), (uint32_t) wp_id, watchpoint_sp.get()); 1810 } 1811 1812 return sb_watchpoint; 1813} 1814 1815lldb::SBWatchpoint 1816SBTarget::WatchAddress (lldb::addr_t addr, size_t size, bool read, bool write, SBError &error) 1817{ 1818 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1819 1820 SBWatchpoint sb_watchpoint; 1821 lldb::WatchpointSP watchpoint_sp; 1822 TargetSP target_sp(GetSP()); 1823 if (target_sp && (read || write) && addr != LLDB_INVALID_ADDRESS && size > 0) 1824 { 1825 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1826 uint32_t watch_type = 0; 1827 if (read) 1828 watch_type |= LLDB_WATCH_TYPE_READ; 1829 if (write) 1830 watch_type |= LLDB_WATCH_TYPE_WRITE; 1831 if (watch_type == 0) 1832 { 1833 error.SetErrorString("Can't create a watchpoint that is neither read nor write."); 1834 return sb_watchpoint; 1835 } 1836 1837 // Target::CreateWatchpoint() is thread safe. 1838 Error cw_error; 1839 // This API doesn't take in a type, so we can't figure out what it is. 1840 ClangASTType *type = NULL; 1841 watchpoint_sp = target_sp->CreateWatchpoint(addr, size, type, watch_type, cw_error); 1842 error.SetError(cw_error); 1843 sb_watchpoint.SetSP (watchpoint_sp); 1844 } 1845 1846 if (log) 1847 { 1848 log->Printf ("SBTarget(%p)::WatchAddress (addr=0x%" PRIx64 ", 0x%u) => SBWatchpoint(%p)", 1849 target_sp.get(), addr, (uint32_t) size, watchpoint_sp.get()); 1850 } 1851 1852 return sb_watchpoint; 1853} 1854 1855bool 1856SBTarget::EnableAllWatchpoints () 1857{ 1858 TargetSP target_sp(GetSP()); 1859 if (target_sp) 1860 { 1861 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1862 Mutex::Locker locker; 1863 target_sp->GetWatchpointList().GetListMutex(locker); 1864 target_sp->EnableAllWatchpoints (); 1865 return true; 1866 } 1867 return false; 1868} 1869 1870bool 1871SBTarget::DisableAllWatchpoints () 1872{ 1873 TargetSP target_sp(GetSP()); 1874 if (target_sp) 1875 { 1876 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1877 Mutex::Locker locker; 1878 target_sp->GetWatchpointList().GetListMutex(locker); 1879 target_sp->DisableAllWatchpoints (); 1880 return true; 1881 } 1882 return false; 1883} 1884 1885SBValue 1886SBTarget::CreateValueFromAddress (const char *name, SBAddress addr, SBType type) 1887{ 1888 SBValue sb_value; 1889 lldb::ValueObjectSP new_value_sp; 1890 if (IsValid() && name && *name && addr.IsValid() && type.IsValid()) 1891 { 1892 lldb::addr_t address(addr.GetLoadAddress(*this)); 1893 lldb::TypeImplSP type_impl_sp (type.GetSP()); 1894 ClangASTType pointer_ast_type(type_impl_sp->GetClangASTType(true).GetPointerType ()); 1895 if (pointer_ast_type) 1896 { 1897 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); 1898 1899 ExecutionContext exe_ctx (ExecutionContextRef(ExecutionContext(m_opaque_sp.get(),false))); 1900 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 1901 pointer_ast_type, 1902 ConstString(name), 1903 buffer, 1904 exe_ctx.GetByteOrder(), 1905 exe_ctx.GetAddressByteSize())); 1906 1907 if (ptr_result_valobj_sp) 1908 { 1909 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress); 1910 Error err; 1911 new_value_sp = ptr_result_valobj_sp->Dereference(err); 1912 if (new_value_sp) 1913 new_value_sp->SetName(ConstString(name)); 1914 } 1915 } 1916 } 1917 sb_value.SetSP(new_value_sp); 1918 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1919 if (log) 1920 { 1921 if (new_value_sp) 1922 log->Printf ("SBTarget(%p)::CreateValueFromAddress => \"%s\"", m_opaque_sp.get(), new_value_sp->GetName().AsCString()); 1923 else 1924 log->Printf ("SBTarget(%p)::CreateValueFromAddress => NULL", m_opaque_sp.get()); 1925 } 1926 return sb_value; 1927} 1928 1929bool 1930SBTarget::DeleteAllWatchpoints () 1931{ 1932 TargetSP target_sp(GetSP()); 1933 if (target_sp) 1934 { 1935 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1936 Mutex::Locker locker; 1937 target_sp->GetWatchpointList().GetListMutex(locker); 1938 target_sp->RemoveAllWatchpoints (); 1939 return true; 1940 } 1941 return false; 1942} 1943 1944 1945lldb::SBModule 1946SBTarget::AddModule (const char *path, 1947 const char *triple, 1948 const char *uuid_cstr) 1949{ 1950 return AddModule (path, triple, uuid_cstr, NULL); 1951} 1952 1953lldb::SBModule 1954SBTarget::AddModule (const char *path, 1955 const char *triple, 1956 const char *uuid_cstr, 1957 const char *symfile) 1958{ 1959 lldb::SBModule sb_module; 1960 TargetSP target_sp(GetSP()); 1961 if (target_sp) 1962 { 1963 ModuleSpec module_spec; 1964 if (path) 1965 module_spec.GetFileSpec().SetFile(path, false); 1966 1967 if (uuid_cstr) 1968 module_spec.GetUUID().SetFromCString(uuid_cstr); 1969 1970 if (triple) 1971 module_spec.GetArchitecture().SetTriple (triple, target_sp->GetPlatform ().get()); 1972 else 1973 module_spec.GetArchitecture() = target_sp->GetArchitecture(); 1974 1975 if (symfile) 1976 module_spec.GetSymbolFileSpec ().SetFile(symfile, false); 1977 1978 sb_module.SetSP(target_sp->GetSharedModule (module_spec)); 1979 } 1980 return sb_module; 1981} 1982 1983lldb::SBModule 1984SBTarget::AddModule (const SBModuleSpec &module_spec) 1985{ 1986 lldb::SBModule sb_module; 1987 TargetSP target_sp(GetSP()); 1988 if (target_sp) 1989 sb_module.SetSP(target_sp->GetSharedModule (*module_spec.m_opaque_ap)); 1990 return sb_module; 1991} 1992 1993bool 1994SBTarget::AddModule (lldb::SBModule &module) 1995{ 1996 TargetSP target_sp(GetSP()); 1997 if (target_sp) 1998 { 1999 target_sp->GetImages().AppendIfNeeded (module.GetSP()); 2000 return true; 2001 } 2002 return false; 2003} 2004 2005uint32_t 2006SBTarget::GetNumModules () const 2007{ 2008 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2009 2010 uint32_t num = 0; 2011 TargetSP target_sp(GetSP()); 2012 if (target_sp) 2013 { 2014 // The module list is thread safe, no need to lock 2015 num = target_sp->GetImages().GetSize(); 2016 } 2017 2018 if (log) 2019 log->Printf ("SBTarget(%p)::GetNumModules () => %d", target_sp.get(), num); 2020 2021 return num; 2022} 2023 2024void 2025SBTarget::Clear () 2026{ 2027 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2028 2029 if (log) 2030 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get()); 2031 2032 m_opaque_sp.reset(); 2033} 2034 2035 2036SBModule 2037SBTarget::FindModule (const SBFileSpec &sb_file_spec) 2038{ 2039 SBModule sb_module; 2040 TargetSP target_sp(GetSP()); 2041 if (target_sp && sb_file_spec.IsValid()) 2042 { 2043 ModuleSpec module_spec(*sb_file_spec); 2044 // The module list is thread safe, no need to lock 2045 sb_module.SetSP (target_sp->GetImages().FindFirstModule (module_spec)); 2046 } 2047 return sb_module; 2048} 2049 2050lldb::ByteOrder 2051SBTarget::GetByteOrder () 2052{ 2053 TargetSP target_sp(GetSP()); 2054 if (target_sp) 2055 return target_sp->GetArchitecture().GetByteOrder(); 2056 return eByteOrderInvalid; 2057} 2058 2059const char * 2060SBTarget::GetTriple () 2061{ 2062 TargetSP target_sp(GetSP()); 2063 if (target_sp) 2064 { 2065 std::string triple (target_sp->GetArchitecture().GetTriple().str()); 2066 // Unique the string so we don't run into ownership issues since 2067 // the const strings put the string into the string pool once and 2068 // the strings never comes out 2069 ConstString const_triple (triple.c_str()); 2070 return const_triple.GetCString(); 2071 } 2072 return NULL; 2073} 2074 2075uint32_t 2076SBTarget::GetAddressByteSize() 2077{ 2078 TargetSP target_sp(GetSP()); 2079 if (target_sp) 2080 return target_sp->GetArchitecture().GetAddressByteSize(); 2081 return sizeof(void*); 2082} 2083 2084 2085SBModule 2086SBTarget::GetModuleAtIndex (uint32_t idx) 2087{ 2088 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2089 2090 SBModule sb_module; 2091 ModuleSP module_sp; 2092 TargetSP target_sp(GetSP()); 2093 if (target_sp) 2094 { 2095 // The module list is thread safe, no need to lock 2096 module_sp = target_sp->GetImages().GetModuleAtIndex(idx); 2097 sb_module.SetSP (module_sp); 2098 } 2099 2100 if (log) 2101 { 2102 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)", 2103 target_sp.get(), idx, module_sp.get()); 2104 } 2105 2106 return sb_module; 2107} 2108 2109bool 2110SBTarget::RemoveModule (lldb::SBModule module) 2111{ 2112 TargetSP target_sp(GetSP()); 2113 if (target_sp) 2114 return target_sp->GetImages().Remove(module.GetSP()); 2115 return false; 2116} 2117 2118 2119SBBroadcaster 2120SBTarget::GetBroadcaster () const 2121{ 2122 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2123 2124 TargetSP target_sp(GetSP()); 2125 SBBroadcaster broadcaster(target_sp.get(), false); 2126 2127 if (log) 2128 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)", 2129 target_sp.get(), broadcaster.get()); 2130 2131 return broadcaster; 2132} 2133 2134bool 2135SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) 2136{ 2137 Stream &strm = description.ref(); 2138 2139 TargetSP target_sp(GetSP()); 2140 if (target_sp) 2141 { 2142 target_sp->Dump (&strm, description_level); 2143 } 2144 else 2145 strm.PutCString ("No value"); 2146 2147 return true; 2148} 2149 2150lldb::SBSymbolContextList 2151SBTarget::FindFunctions (const char *name, uint32_t name_type_mask) 2152{ 2153 lldb::SBSymbolContextList sb_sc_list; 2154 if (name && name[0]) 2155 { 2156 TargetSP target_sp(GetSP()); 2157 if (target_sp) 2158 { 2159 const bool symbols_ok = true; 2160 const bool inlines_ok = true; 2161 const bool append = true; 2162 target_sp->GetImages().FindFunctions (ConstString(name), 2163 name_type_mask, 2164 symbols_ok, 2165 inlines_ok, 2166 append, 2167 *sb_sc_list); 2168 } 2169 } 2170 return sb_sc_list; 2171} 2172 2173lldb::SBType 2174SBTarget::FindFirstType (const char* typename_cstr) 2175{ 2176 TargetSP target_sp(GetSP()); 2177 if (typename_cstr && typename_cstr[0] && target_sp) 2178 { 2179 ConstString const_typename(typename_cstr); 2180 SymbolContext sc; 2181 const bool exact_match = false; 2182 2183 const ModuleList &module_list = target_sp->GetImages(); 2184 size_t count = module_list.GetSize(); 2185 for (size_t idx = 0; idx < count; idx++) 2186 { 2187 ModuleSP module_sp (module_list.GetModuleAtIndex(idx)); 2188 if (module_sp) 2189 { 2190 TypeSP type_sp (module_sp->FindFirstType(sc, const_typename, exact_match)); 2191 if (type_sp) 2192 return SBType(type_sp); 2193 } 2194 } 2195 2196 // Didn't find the type in the symbols; try the Objective-C runtime 2197 // if one is installed 2198 2199 ProcessSP process_sp(target_sp->GetProcessSP()); 2200 2201 if (process_sp) 2202 { 2203 ObjCLanguageRuntime *objc_language_runtime = process_sp->GetObjCLanguageRuntime(); 2204 2205 if (objc_language_runtime) 2206 { 2207 TypeVendor *objc_type_vendor = objc_language_runtime->GetTypeVendor(); 2208 2209 if (objc_type_vendor) 2210 { 2211 std::vector <ClangASTType> types; 2212 2213 if (objc_type_vendor->FindTypes(const_typename, true, 1, types) > 0) 2214 return SBType(types[0]); 2215 } 2216 } 2217 } 2218 2219 // No matches, search for basic typename matches 2220 ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 2221 if (clang_ast) 2222 return SBType (ClangASTContext::GetBasicType (clang_ast->getASTContext(), const_typename)); 2223 } 2224 return SBType(); 2225} 2226 2227SBType 2228SBTarget::GetBasicType(lldb::BasicType type) 2229{ 2230 TargetSP target_sp(GetSP()); 2231 if (target_sp) 2232 { 2233 ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 2234 if (clang_ast) 2235 return SBType (ClangASTContext::GetBasicType (clang_ast->getASTContext(), type)); 2236 } 2237 return SBType(); 2238} 2239 2240 2241lldb::SBTypeList 2242SBTarget::FindTypes (const char* typename_cstr) 2243{ 2244 SBTypeList sb_type_list; 2245 TargetSP target_sp(GetSP()); 2246 if (typename_cstr && typename_cstr[0] && target_sp) 2247 { 2248 ModuleList& images = target_sp->GetImages(); 2249 ConstString const_typename(typename_cstr); 2250 bool exact_match = false; 2251 SymbolContext sc; 2252 TypeList type_list; 2253 2254 uint32_t num_matches = images.FindTypes (sc, 2255 const_typename, 2256 exact_match, 2257 UINT32_MAX, 2258 type_list); 2259 2260 if (num_matches > 0) 2261 { 2262 for (size_t idx = 0; idx < num_matches; idx++) 2263 { 2264 TypeSP type_sp (type_list.GetTypeAtIndex(idx)); 2265 if (type_sp) 2266 sb_type_list.Append(SBType(type_sp)); 2267 } 2268 } 2269 2270 // Try the Objective-C runtime if one is installed 2271 2272 ProcessSP process_sp(target_sp->GetProcessSP()); 2273 2274 if (process_sp) 2275 { 2276 ObjCLanguageRuntime *objc_language_runtime = process_sp->GetObjCLanguageRuntime(); 2277 2278 if (objc_language_runtime) 2279 { 2280 TypeVendor *objc_type_vendor = objc_language_runtime->GetTypeVendor(); 2281 2282 if (objc_type_vendor) 2283 { 2284 std::vector <ClangASTType> types; 2285 2286 if (objc_type_vendor->FindTypes(const_typename, true, UINT32_MAX, types)) 2287 { 2288 for (ClangASTType &type : types) 2289 { 2290 sb_type_list.Append(SBType(type)); 2291 } 2292 } 2293 } 2294 } 2295 } 2296 2297 if (sb_type_list.GetSize() == 0) 2298 { 2299 // No matches, search for basic typename matches 2300 ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 2301 if (clang_ast) 2302 sb_type_list.Append (SBType (ClangASTContext::GetBasicType (clang_ast->getASTContext(), const_typename))); 2303 } 2304 } 2305 return sb_type_list; 2306} 2307 2308SBValueList 2309SBTarget::FindGlobalVariables (const char *name, uint32_t max_matches) 2310{ 2311 SBValueList sb_value_list; 2312 2313 TargetSP target_sp(GetSP()); 2314 if (name && target_sp) 2315 { 2316 VariableList variable_list; 2317 const bool append = true; 2318 const uint32_t match_count = target_sp->GetImages().FindGlobalVariables (ConstString (name), 2319 append, 2320 max_matches, 2321 variable_list); 2322 2323 if (match_count > 0) 2324 { 2325 ExecutionContextScope *exe_scope = target_sp->GetProcessSP().get(); 2326 if (exe_scope == NULL) 2327 exe_scope = target_sp.get(); 2328 for (uint32_t i=0; i<match_count; ++i) 2329 { 2330 lldb::ValueObjectSP valobj_sp (ValueObjectVariable::Create (exe_scope, variable_list.GetVariableAtIndex(i))); 2331 if (valobj_sp) 2332 sb_value_list.Append(SBValue(valobj_sp)); 2333 } 2334 } 2335 } 2336 2337 return sb_value_list; 2338} 2339 2340lldb::SBValue 2341SBTarget::FindFirstGlobalVariable (const char* name) 2342{ 2343 SBValueList sb_value_list(FindGlobalVariables(name, 1)); 2344 if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 2345 return sb_value_list.GetValueAtIndex(0); 2346 return SBValue(); 2347} 2348 2349SBSourceManager 2350SBTarget::GetSourceManager() 2351{ 2352 SBSourceManager source_manager (*this); 2353 return source_manager; 2354} 2355 2356lldb::SBInstructionList 2357SBTarget::ReadInstructions (lldb::SBAddress base_addr, uint32_t count) 2358{ 2359 return ReadInstructions (base_addr, count, NULL); 2360} 2361 2362lldb::SBInstructionList 2363SBTarget::ReadInstructions (lldb::SBAddress base_addr, uint32_t count, const char *flavor_string) 2364{ 2365 SBInstructionList sb_instructions; 2366 2367 TargetSP target_sp(GetSP()); 2368 if (target_sp) 2369 { 2370 Address *addr_ptr = base_addr.get(); 2371 2372 if (addr_ptr) 2373 { 2374 DataBufferHeap data (target_sp->GetArchitecture().GetMaximumOpcodeByteSize() * count, 0); 2375 bool prefer_file_cache = false; 2376 lldb_private::Error error; 2377 lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; 2378 const size_t bytes_read = target_sp->ReadMemory(*addr_ptr, 2379 prefer_file_cache, 2380 data.GetBytes(), 2381 data.GetByteSize(), 2382 error, 2383 &load_addr); 2384 const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; 2385 sb_instructions.SetDisassembler (Disassembler::DisassembleBytes (target_sp->GetArchitecture(), 2386 NULL, 2387 flavor_string, 2388 *addr_ptr, 2389 data.GetBytes(), 2390 bytes_read, 2391 count, 2392 data_from_file)); 2393 } 2394 } 2395 2396 return sb_instructions; 2397 2398} 2399 2400lldb::SBInstructionList 2401SBTarget::GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size) 2402{ 2403 return GetInstructionsWithFlavor (base_addr, NULL, buf, size); 2404} 2405 2406lldb::SBInstructionList 2407SBTarget::GetInstructionsWithFlavor (lldb::SBAddress base_addr, const char *flavor_string, const void *buf, size_t size) 2408{ 2409 SBInstructionList sb_instructions; 2410 2411 TargetSP target_sp(GetSP()); 2412 if (target_sp) 2413 { 2414 Address addr; 2415 2416 if (base_addr.get()) 2417 addr = *base_addr.get(); 2418 2419 const bool data_from_file = true; 2420 2421 sb_instructions.SetDisassembler (Disassembler::DisassembleBytes (target_sp->GetArchitecture(), 2422 NULL, 2423 flavor_string, 2424 addr, 2425 buf, 2426 size, 2427 UINT32_MAX, 2428 data_from_file)); 2429 } 2430 2431 return sb_instructions; 2432} 2433 2434lldb::SBInstructionList 2435SBTarget::GetInstructions (lldb::addr_t base_addr, const void *buf, size_t size) 2436{ 2437 return GetInstructionsWithFlavor (ResolveLoadAddress(base_addr), NULL, buf, size); 2438} 2439 2440lldb::SBInstructionList 2441SBTarget::GetInstructionsWithFlavor (lldb::addr_t base_addr, const char *flavor_string, const void *buf, size_t size) 2442{ 2443 return GetInstructionsWithFlavor (ResolveLoadAddress(base_addr), flavor_string, buf, size); 2444} 2445 2446SBError 2447SBTarget::SetSectionLoadAddress (lldb::SBSection section, 2448 lldb::addr_t section_base_addr) 2449{ 2450 SBError sb_error; 2451 TargetSP target_sp(GetSP()); 2452 if (target_sp) 2453 { 2454 if (!section.IsValid()) 2455 { 2456 sb_error.SetErrorStringWithFormat ("invalid section"); 2457 } 2458 else 2459 { 2460 SectionSP section_sp (section.GetSP()); 2461 if (section_sp) 2462 { 2463 if (section_sp->IsThreadSpecific()) 2464 { 2465 sb_error.SetErrorString ("thread specific sections are not yet supported"); 2466 } 2467 else 2468 { 2469 if (target_sp->GetSectionLoadList().SetSectionLoadAddress (section_sp, section_base_addr)) 2470 { 2471 // Flush info in the process (stack frames, etc) 2472 ProcessSP process_sp (target_sp->GetProcessSP()); 2473 if (process_sp) 2474 process_sp->Flush(); 2475 } 2476 } 2477 } 2478 } 2479 } 2480 else 2481 { 2482 sb_error.SetErrorString ("invalid target"); 2483 } 2484 return sb_error; 2485} 2486 2487SBError 2488SBTarget::ClearSectionLoadAddress (lldb::SBSection section) 2489{ 2490 SBError sb_error; 2491 2492 TargetSP target_sp(GetSP()); 2493 if (target_sp) 2494 { 2495 if (!section.IsValid()) 2496 { 2497 sb_error.SetErrorStringWithFormat ("invalid section"); 2498 } 2499 else 2500 { 2501 if (target_sp->GetSectionLoadList().SetSectionUnloaded (section.GetSP())) 2502 { 2503 // Flush info in the process (stack frames, etc) 2504 ProcessSP process_sp (target_sp->GetProcessSP()); 2505 if (process_sp) 2506 process_sp->Flush(); 2507 } 2508 } 2509 } 2510 else 2511 { 2512 sb_error.SetErrorStringWithFormat ("invalid target"); 2513 } 2514 return sb_error; 2515} 2516 2517SBError 2518SBTarget::SetModuleLoadAddress (lldb::SBModule module, int64_t slide_offset) 2519{ 2520 SBError sb_error; 2521 2522 TargetSP target_sp(GetSP()); 2523 if (target_sp) 2524 { 2525 ModuleSP module_sp (module.GetSP()); 2526 if (module_sp) 2527 { 2528 bool changed = false; 2529 if (module_sp->SetLoadAddress (*target_sp, slide_offset, changed)) 2530 { 2531 // The load was successful, make sure that at least some sections 2532 // changed before we notify that our module was loaded. 2533 if (changed) 2534 { 2535 ModuleList module_list; 2536 module_list.Append(module_sp); 2537 target_sp->ModulesDidLoad (module_list); 2538 // Flush info in the process (stack frames, etc) 2539 ProcessSP process_sp (target_sp->GetProcessSP()); 2540 if (process_sp) 2541 process_sp->Flush(); 2542 } 2543 } 2544 } 2545 else 2546 { 2547 sb_error.SetErrorStringWithFormat ("invalid module"); 2548 } 2549 2550 } 2551 else 2552 { 2553 sb_error.SetErrorStringWithFormat ("invalid target"); 2554 } 2555 return sb_error; 2556} 2557 2558SBError 2559SBTarget::ClearModuleLoadAddress (lldb::SBModule module) 2560{ 2561 SBError sb_error; 2562 2563 char path[PATH_MAX]; 2564 TargetSP target_sp(GetSP()); 2565 if (target_sp) 2566 { 2567 ModuleSP module_sp (module.GetSP()); 2568 if (module_sp) 2569 { 2570 ObjectFile *objfile = module_sp->GetObjectFile(); 2571 if (objfile) 2572 { 2573 SectionList *section_list = objfile->GetSectionList(); 2574 if (section_list) 2575 { 2576 bool changed = false; 2577 const size_t num_sections = section_list->GetSize(); 2578 for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx) 2579 { 2580 SectionSP section_sp (section_list->GetSectionAtIndex(sect_idx)); 2581 if (section_sp) 2582 changed |= target_sp->GetSectionLoadList().SetSectionUnloaded (section_sp) > 0; 2583 } 2584 if (changed) 2585 { 2586 // Flush info in the process (stack frames, etc) 2587 ProcessSP process_sp (target_sp->GetProcessSP()); 2588 if (process_sp) 2589 process_sp->Flush(); 2590 } 2591 } 2592 else 2593 { 2594 module_sp->GetFileSpec().GetPath (path, sizeof(path)); 2595 sb_error.SetErrorStringWithFormat ("no sections in object file '%s'", path); 2596 } 2597 } 2598 else 2599 { 2600 module_sp->GetFileSpec().GetPath (path, sizeof(path)); 2601 sb_error.SetErrorStringWithFormat ("no object file for module '%s'", path); 2602 } 2603 } 2604 else 2605 { 2606 sb_error.SetErrorStringWithFormat ("invalid module"); 2607 } 2608 } 2609 else 2610 { 2611 sb_error.SetErrorStringWithFormat ("invalid target"); 2612 } 2613 return sb_error; 2614} 2615 2616 2617lldb::SBSymbolContextList 2618SBTarget::FindSymbols (const char *name, lldb::SymbolType symbol_type) 2619{ 2620 SBSymbolContextList sb_sc_list; 2621 if (name && name[0]) 2622 { 2623 TargetSP target_sp(GetSP()); 2624 if (target_sp) 2625 { 2626 bool append = true; 2627 target_sp->GetImages().FindSymbolsWithNameAndType (ConstString(name), 2628 symbol_type, 2629 *sb_sc_list, 2630 append); 2631 } 2632 } 2633 return sb_sc_list; 2634 2635} 2636 2637 2638lldb::SBValue 2639SBTarget::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 2640{ 2641 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2642 Log * expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2643 SBValue expr_result; 2644 ExecutionResults exe_results = eExecutionSetupError; 2645 ValueObjectSP expr_value_sp; 2646 TargetSP target_sp(GetSP()); 2647 StackFrame *frame = NULL; 2648 if (target_sp) 2649 { 2650 if (expr == NULL || expr[0] == '\0') 2651 { 2652 if (log) 2653 log->Printf ("SBTarget::EvaluateExpression called with an empty expression"); 2654 return expr_result; 2655 } 2656 2657 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 2658 ExecutionContext exe_ctx (m_opaque_sp.get()); 2659 2660 if (log) 2661 log->Printf ("SBTarget()::EvaluateExpression (expr=\"%s\")...", expr); 2662 2663 frame = exe_ctx.GetFramePtr(); 2664 Target *target = exe_ctx.GetTargetPtr(); 2665 2666 if (target) 2667 { 2668#ifdef LLDB_CONFIGURATION_DEBUG 2669 StreamString frame_description; 2670 if (frame) 2671 frame->DumpUsingSettingsFormat (&frame_description); 2672 Host::SetCrashDescriptionWithFormat ("SBTarget::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 2673 expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 2674#endif 2675 exe_results = target->EvaluateExpression (expr, 2676 frame, 2677 expr_value_sp, 2678 options.ref()); 2679 2680 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 2681#ifdef LLDB_CONFIGURATION_DEBUG 2682 Host::SetCrashDescription (NULL); 2683#endif 2684 } 2685 else 2686 { 2687 if (log) 2688 log->Printf ("SBTarget::EvaluateExpression () => error: could not reconstruct frame object for this SBTarget."); 2689 } 2690 } 2691#ifndef LLDB_DISABLE_PYTHON 2692 if (expr_log) 2693 expr_log->Printf("** [SBTarget::EvaluateExpression] Expression result is %s, summary %s **", 2694 expr_result.GetValue(), 2695 expr_result.GetSummary()); 2696 2697 if (log) 2698 log->Printf ("SBTarget(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 2699 frame, 2700 expr, 2701 expr_value_sp.get(), 2702 exe_results); 2703#endif 2704 2705 return expr_result; 2706} 2707 2708 2709lldb::addr_t 2710SBTarget::GetStackRedZoneSize() 2711{ 2712 TargetSP target_sp(GetSP()); 2713 if (target_sp) 2714 { 2715 ABISP abi_sp; 2716 ProcessSP process_sp (target_sp->GetProcessSP()); 2717 if (process_sp) 2718 abi_sp = process_sp->GetABI(); 2719 else 2720 abi_sp = ABI::FindPlugin(target_sp->GetArchitecture()); 2721 if (abi_sp) 2722 return abi_sp->GetRedZoneSize(); 2723 } 2724 return 0; 2725} 2726 2727