22
22
#include < cassert>
23
23
#include < cstring>
24
24
#include < fstream>
25
+ #include < lldb/API/LLDB.h>
25
26
26
27
#include " oi/DrgnUtils.h"
27
28
#include " oi/OIParser.h"
@@ -106,7 +107,8 @@ static bool isExecutableAddr(
106
107
return it != end (exeAddrs) && addr >= it->first ;
107
108
}
108
109
109
- SymbolService::SymbolService (pid_t pid) : target{pid} {
110
+ SymbolService::SymbolService (pid_t pid, Backend back)
111
+ : target{pid}, backend{back} {
110
112
// Update target processes memory map
111
113
LoadExecutableAddressRange (pid, executableAddrs);
112
114
if (!loadModules ()) {
@@ -115,8 +117,8 @@ SymbolService::SymbolService(pid_t pid) : target{pid} {
115
117
}
116
118
}
117
119
118
- SymbolService::SymbolService (fs::path executablePath)
119
- : target{std::move (executablePath)} {
120
+ SymbolService::SymbolService (fs::path executablePath, Backend back )
121
+ : target{std::move (executablePath)}, backend{back} {
120
122
if (!loadModules ()) {
121
123
throw std::runtime_error (" Failed to load modules for executable " +
122
124
executablePath.string ());
@@ -131,6 +133,15 @@ SymbolService::~SymbolService() {
131
133
if (prog != nullptr ) {
132
134
drgn_program_destroy (prog);
133
135
}
136
+
137
+ if (lldbTarget) {
138
+ lldbDebugger.DeleteTarget (lldbTarget);
139
+ }
140
+
141
+ if (lldbDebugger) {
142
+ lldb::SBDebugger::Destroy (lldbDebugger);
143
+ lldb::SBDebugger::Terminate ();
144
+ }
134
145
}
135
146
136
147
struct ModParams {
@@ -432,7 +443,12 @@ std::optional<std::string> SymbolService::locateBuildID() {
432
443
433
444
struct drgn_program * SymbolService::getDrgnProgram () {
434
445
if (hardDisableDrgn) {
435
- LOG (ERROR) << " drgn is disabled, refusing to initialize" ;
446
+ LOG (ERROR) << " drgn/LLDB is disabled, refusing to initialize" ;
447
+ return nullptr ;
448
+ }
449
+
450
+ if (backend != Backend::DRGN) {
451
+ LOG (ERROR) << " drgn is not the selected backend, refusing to initialize" ;
436
452
return nullptr ;
437
453
}
438
454
@@ -484,6 +500,53 @@ struct drgn_program* SymbolService::getDrgnProgram() {
484
500
return prog;
485
501
}
486
502
503
+ lldb::SBTarget SymbolService::getLLDBTarget () {
504
+ if (hardDisableDrgn) {
505
+ LOG (ERROR) << " drgn/LLDB is disabled, refusing to initialize" ;
506
+ return lldb::SBTarget ();
507
+ }
508
+
509
+ if (backend != Backend::LLDB) {
510
+ LOG (ERROR) << " LLDB is not the selected backend, refusing to initialize" ;
511
+ return lldb::SBTarget ();
512
+ }
513
+
514
+ bool success = false ;
515
+
516
+ lldb::SBDebugger::Initialize ();
517
+ lldbDebugger = lldb::SBDebugger::Create (false );
518
+ BOOST_SCOPE_EXIT_ALL (&) {
519
+ if (!success) {
520
+ lldb::SBDebugger::Destroy (lldbDebugger);
521
+ lldb::SBDebugger::Terminate ();
522
+ }
523
+ };
524
+
525
+ switch (target.index ()) {
526
+ case 0 : {
527
+ auto pid = std::get<pid_t >(target);
528
+ lldbTarget = lldbDebugger.FindTargetWithProcessID (pid);
529
+ if (!lldbTarget) {
530
+ LOG (ERROR) << " Failed to find target with PID " << pid;
531
+ return lldb::SBTarget ();
532
+ }
533
+ break ;
534
+ }
535
+ case 1 : {
536
+ auto path = std::get<fs::path>(target);
537
+ lldbTarget = lldbDebugger.CreateTarget (path.c_str ());
538
+ if (!lldbTarget) {
539
+ LOG (ERROR) << " Failed to create target from " << path;
540
+ return lldb::SBTarget ();
541
+ }
542
+ break ;
543
+ }
544
+ }
545
+
546
+ success = true ;
547
+ return lldbTarget;
548
+ }
549
+
487
550
/*
488
551
* Although 'parseFormalParam' has an all-encompassing sounding name, its sole
489
552
* task is to extract the location information for this parameter if any exist.
0 commit comments