Skip to content

Commit 8f378ff

Browse files
authored
[lldb] Expose SBPlatform::GetAllProcesses to the SB API (#68378)
Add the ability to list all processes through the SB API. rdar://116188959
1 parent 70368ea commit 8f378ff

File tree

15 files changed

+244
-1
lines changed

15 files changed

+244
-1
lines changed

lldb/bindings/headers.swig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include "lldb/API/SBPlatform.h"
4747
#include "lldb/API/SBProcess.h"
4848
#include "lldb/API/SBProcessInfo.h"
49+
#include "lldb/API/SBProcessInfoList.h"
4950
#include "lldb/API/SBQueue.h"
5051
#include "lldb/API/SBQueueItem.h"
5152
#include "lldb/API/SBReproducer.h"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
%extend lldb::SBProcessInfoList {
2+
#ifdef SWIGPYTHON
3+
%pythoncode%{
4+
def __len__(self):
5+
'''Return the number of process info in a lldb.SBProcessInfoListExtensions object.'''
6+
return self.GetSize()
7+
8+
def __iter__(self):
9+
'''Iterate over all the process info in a lldb.SBProcessInfoListExtensions object.'''
10+
return lldb_iter(self, 'GetSize', 'GetProcessInfoAtIndex')
11+
%}
12+
#endif
13+
}

lldb/bindings/interfaces.swig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
%include "lldb/API/SBPlatform.h"
123123
%include "lldb/API/SBProcess.h"
124124
%include "lldb/API/SBProcessInfo.h"
125+
%include "lldb/API/SBProcessInfoList.h"
125126
%include "lldb/API/SBQueue.h"
126127
%include "lldb/API/SBQueueItem.h"
127128
%include "lldb/API/SBReproducer.h"
@@ -184,6 +185,7 @@
184185
%include "./interface/SBModuleSpecExtensions.i"
185186
%include "./interface/SBModuleSpecListExtensions.i"
186187
%include "./interface/SBProcessExtensions.i"
188+
%include "./interface/SBProcessInfoListExtensions.i"
187189
%include "./interface/SBQueueItemExtensions.i"
188190
%include "./interface/SBScriptObjectExtensions.i"
189191
%include "./interface/SBSectionExtensions.i"

lldb/include/lldb/API/LLDB.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "lldb/API/SBPlatform.h"
5050
#include "lldb/API/SBProcess.h"
5151
#include "lldb/API/SBProcessInfo.h"
52+
#include "lldb/API/SBProcessInfoList.h"
5253
#include "lldb/API/SBQueue.h"
5354
#include "lldb/API/SBQueueItem.h"
5455
#include "lldb/API/SBReproducer.h"

lldb/include/lldb/API/SBDefines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class LLDB_API SBPlatformConnectOptions;
9090
class LLDB_API SBPlatformShellCommand;
9191
class LLDB_API SBProcess;
9292
class LLDB_API SBProcessInfo;
93+
class LLDB_API SBProcessInfoList;
9394
class LLDB_API SBQueue;
9495
class LLDB_API SBQueueItem;
9596
class LLDB_API SBReplayOptions;

lldb/include/lldb/API/SBPlatform.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111

1212
#include "lldb/API/SBDefines.h"
1313
#include "lldb/API/SBProcess.h"
14+
#include "lldb/API/SBProcessInfoList.h"
1415

1516
#include <functional>
1617

1718
struct PlatformConnectOptions;
1819
struct PlatformShellCommand;
20+
class ProcessInstanceInfoMatch;
1921

2022
namespace lldb {
2123

@@ -154,6 +156,8 @@ class LLDB_API SBPlatform {
154156
SBProcess Attach(SBAttachInfo &attach_info, const SBDebugger &debugger,
155157
SBTarget &target, SBError &error);
156158

159+
SBProcessInfoList GetAllProcesses(SBError &error);
160+
157161
SBError Kill(const lldb::pid_t pid);
158162

159163
SBError

lldb/include/lldb/API/SBProcessInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class LLDB_API SBProcessInfo {
5555

5656
private:
5757
friend class SBProcess;
58+
friend class SBProcessInfoList;
5859

5960
lldb_private::ProcessInstanceInfo &ref();
6061

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//===-- SBProcessInfoList.h -------------------------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLDB_API_SBPROCESSINSTANCEINFOLIST_H
10+
#define LLDB_API_SBPROCESSINSTANCEINFOLIST_H
11+
12+
#include "lldb/API/SBDefines.h"
13+
14+
#include <memory>
15+
16+
namespace lldb_private {
17+
class ProcessInfoList;
18+
} // namespace lldb_private
19+
20+
namespace lldb {
21+
22+
class LLDB_API SBProcessInfoList {
23+
public:
24+
SBProcessInfoList();
25+
~SBProcessInfoList();
26+
27+
SBProcessInfoList(const lldb::SBProcessInfoList &rhs);
28+
29+
const lldb::SBProcessInfoList &operator=(const lldb::SBProcessInfoList &rhs);
30+
31+
uint32_t GetSize() const;
32+
33+
bool GetProcessInfoAtIndex(uint32_t idx, SBProcessInfo &info);
34+
35+
void Clear();
36+
37+
private:
38+
friend SBPlatform;
39+
40+
SBProcessInfoList(const lldb_private::ProcessInfoList &impl);
41+
std::unique_ptr<lldb_private::ProcessInfoList> m_opaque_up;
42+
};
43+
44+
} // namespace lldb
45+
46+
#endif // LLDB_API_SBPROCESSINSTANCEINFOLIST_H

lldb/include/lldb/Target/Platform.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ class Platform : public PluginInterface {
407407
virtual uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info,
408408
ProcessInstanceInfoList &proc_infos);
409409

410+
ProcessInstanceInfoList GetAllProcesses();
411+
410412
virtual bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info);
411413

412414
// Set a breakpoint on all functions that can end up creating a thread for
@@ -883,7 +885,7 @@ class Platform : public PluginInterface {
883885
}
884886

885887
virtual CompilerType GetSiginfoType(const llvm::Triple &triple);
886-
888+
887889
virtual Args GetExtraStartupCommands();
888890

889891
typedef std::function<Status(const ModuleSpec &module_spec,

lldb/include/lldb/Utility/ProcessInfo.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,26 @@ class ProcessInstanceInfo : public ProcessInfo {
187187

188188
typedef std::vector<ProcessInstanceInfo> ProcessInstanceInfoList;
189189

190+
class ProcessInfoList {
191+
public:
192+
ProcessInfoList(const ProcessInstanceInfoList &list) : m_list(list) {}
193+
194+
uint32_t GetSize() const { return m_list.size(); }
195+
196+
bool GetProcessInfoAtIndex(uint32_t idx, ProcessInstanceInfo &info) {
197+
if (idx < m_list.size()) {
198+
info = m_list[idx];
199+
return true;
200+
}
201+
return false;
202+
}
203+
204+
void Clear() { return m_list.clear(); }
205+
206+
private:
207+
ProcessInstanceInfoList m_list;
208+
};
209+
190210
// ProcessInstanceInfoMatch
191211
//
192212
// A class to help matching one ProcessInstanceInfo to another.

lldb/source/API/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ add_lldb_library(liblldb SHARED ${option_framework}
6161
SBPlatform.cpp
6262
SBProcess.cpp
6363
SBProcessInfo.cpp
64+
SBProcessInfoList.cpp
6465
SBQueue.cpp
6566
SBQueueItem.cpp
6667
SBReproducer.cpp

lldb/source/API/SBPlatform.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "lldb/API/SBLaunchInfo.h"
1515
#include "lldb/API/SBModuleSpec.h"
1616
#include "lldb/API/SBPlatform.h"
17+
#include "lldb/API/SBProcessInfoList.h"
1718
#include "lldb/API/SBTarget.h"
1819
#include "lldb/API/SBUnixSignals.h"
1920
#include "lldb/Host/File.h"
@@ -599,6 +600,20 @@ SBProcess SBPlatform::Attach(SBAttachInfo &attach_info,
599600
return {};
600601
}
601602

603+
SBProcessInfoList SBPlatform::GetAllProcesses(SBError &error) {
604+
if (PlatformSP platform_sp = GetSP()) {
605+
if (platform_sp->IsConnected()) {
606+
ProcessInstanceInfoList list = platform_sp->GetAllProcesses();
607+
return SBProcessInfoList(list);
608+
}
609+
error.SetErrorString("not connected");
610+
return {};
611+
}
612+
613+
error.SetErrorString("invalid platform");
614+
return {};
615+
}
616+
602617
SBError SBPlatform::Kill(const lldb::pid_t pid) {
603618
LLDB_INSTRUMENT_VA(this, pid);
604619
return ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {

lldb/source/API/SBProcessInfoList.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//===-- SBProcessInfoList.cpp ---------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "lldb/API/SBProcessInfoList.h"
10+
#include "lldb/API/SBProcessInfo.h"
11+
#include "lldb/Utility/Instrumentation.h"
12+
#include "lldb/Utility/ProcessInfo.h"
13+
14+
#include "Utils.h"
15+
16+
using namespace lldb;
17+
using namespace lldb_private;
18+
19+
SBProcessInfoList::SBProcessInfoList() = default;
20+
21+
SBProcessInfoList::~SBProcessInfoList() = default;
22+
23+
SBProcessInfoList::SBProcessInfoList(const ProcessInfoList &impl)
24+
: m_opaque_up(std::make_unique<ProcessInfoList>(impl)) {
25+
LLDB_INSTRUMENT_VA(this, impl);
26+
}
27+
28+
SBProcessInfoList::SBProcessInfoList(const lldb::SBProcessInfoList &rhs) {
29+
30+
LLDB_INSTRUMENT_VA(this, rhs);
31+
32+
m_opaque_up = clone(rhs.m_opaque_up);
33+
}
34+
35+
const lldb::SBProcessInfoList &
36+
SBProcessInfoList::operator=(const lldb::SBProcessInfoList &rhs) {
37+
38+
LLDB_INSTRUMENT_VA(this, rhs);
39+
40+
if (this != &rhs)
41+
m_opaque_up = clone(rhs.m_opaque_up);
42+
return *this;
43+
}
44+
45+
uint32_t SBProcessInfoList::GetSize() const {
46+
LLDB_INSTRUMENT_VA(this);
47+
48+
if (m_opaque_up)
49+
return m_opaque_up->GetSize();
50+
51+
return 0;
52+
}
53+
54+
void SBProcessInfoList::Clear() {
55+
LLDB_INSTRUMENT_VA(this);
56+
57+
if (m_opaque_up)
58+
m_opaque_up->Clear();
59+
}
60+
61+
bool SBProcessInfoList::GetProcessInfoAtIndex(uint32_t idx,
62+
SBProcessInfo &info) {
63+
LLDB_INSTRUMENT_VA(this, idx, info);
64+
65+
if (m_opaque_up) {
66+
lldb_private::ProcessInstanceInfo process_instance_info;
67+
if (m_opaque_up->GetProcessInfoAtIndex(idx, process_instance_info)) {
68+
info.SetProcessInfo(process_instance_info);
69+
return true;
70+
}
71+
}
72+
73+
return false;
74+
}

lldb/source/Target/Platform.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,14 @@ uint32_t Platform::FindProcesses(const ProcessInstanceInfoMatch &match_info,
989989
return match_count;
990990
}
991991

992+
ProcessInstanceInfoList Platform::GetAllProcesses() {
993+
ProcessInstanceInfoList processes;
994+
ProcessInstanceInfoMatch match;
995+
assert(match.MatchAllProcesses());
996+
FindProcesses(match, processes);
997+
return processes;
998+
}
999+
9921000
Status Platform::LaunchProcess(ProcessLaunchInfo &launch_info) {
9931001
Status error;
9941002
Log *log = GetLog(LLDBLog::Platform);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import lldb
2+
from lldbsuite.test.lldbtest import *
3+
from lldbsuite.test.decorators import *
4+
from lldbsuite.test.gdbclientutils import *
5+
from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
6+
7+
8+
class TestPlatformListProcesses(GDBRemoteTestBase):
9+
@skipIfRemote
10+
@skipIfWindows
11+
def test_get_all_processes(self):
12+
"""Test listing processes"""
13+
14+
class MyPlatformResponder(MockGDBServerResponder):
15+
def __init__(self):
16+
MockGDBServerResponder.__init__(self)
17+
self.done = False
18+
19+
def qfProcessInfo(self, packet):
20+
return "pid:95117;name:666f6f;"
21+
22+
def qsProcessInfo(self):
23+
if not self.done:
24+
self.done = True
25+
return "pid:95126;name:666f6f;"
26+
return "E10"
27+
28+
self.server.responder = MyPlatformResponder()
29+
30+
error = lldb.SBError()
31+
platform = lldb.SBPlatform("remote-linux")
32+
self.dbg.SetSelectedPlatform(platform)
33+
34+
error = platform.ConnectRemote(
35+
lldb.SBPlatformConnectOptions(self.server.get_connect_url())
36+
)
37+
self.assertSuccess(error)
38+
self.assertTrue(platform.IsConnected())
39+
40+
processes = platform.GetAllProcesses(error)
41+
self.assertSuccess(error)
42+
self.assertEqual(processes.GetSize(), 2)
43+
self.assertEqual(len(processes), 2)
44+
45+
process_info = lldb.SBProcessInfo()
46+
processes.GetProcessInfoAtIndex(0, process_info)
47+
self.assertEqual(process_info.GetProcessID(), 95117)
48+
self.assertEqual(process_info.GetName(), "foo")
49+
50+
processes.GetProcessInfoAtIndex(1, process_info)
51+
self.assertEqual(process_info.GetProcessID(), 95126)
52+
self.assertEqual(process_info.GetName(), "foo")
53+
54+
platform.DisconnectRemote()

0 commit comments

Comments
 (0)