Skip to content

Commit f66a426

Browse files
committed
[lldb] Expose SBPlatform::GetAllProcesses to the SB API (llvm#68378)
Add the ability to list all processes through the SB API. rdar://116188959 (cherry picked from commit 8f378ff)
1 parent 584f2cd commit f66a426

File tree

15 files changed

+246
-1
lines changed

15 files changed

+246
-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
@@ -121,6 +121,7 @@
121121
%include "lldb/API/SBPlatform.h"
122122
%include "lldb/API/SBProcess.h"
123123
%include "lldb/API/SBProcessInfo.h"
124+
%include "lldb/API/SBProcessInfoList.h"
124125
%include "lldb/API/SBQueue.h"
125126
%include "lldb/API/SBQueueItem.h"
126127
%include "lldb/API/SBReproducer.h"
@@ -177,6 +178,7 @@
177178
%include "./interface/SBModuleExtensions.i"
178179
%include "./interface/SBModuleSpecExtensions.i"
179180
%include "./interface/SBProcessExtensions.i"
181+
%include "./interface/SBProcessInfoListExtensions.i"
180182
%include "./interface/SBScriptObjectExtensions.i"
181183
%include "./interface/SBSectionExtensions.i"
182184
%include "./interface/SBStreamExtensions.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
@@ -85,6 +85,7 @@ class LLDB_API SBModuleSpec;
8585
class LLDB_API SBModuleSpecList;
8686
class LLDB_API SBProcess;
8787
class LLDB_API SBProcessInfo;
88+
class LLDB_API SBProcessInfoList;
8889
class LLDB_API SBQueue;
8990
class LLDB_API SBQueueItem;
9091
class LLDB_API SBScriptObject;

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: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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 SBPlatform;
23+
24+
class LLDB_API SBProcessInfoList {
25+
public:
26+
SBProcessInfoList();
27+
~SBProcessInfoList();
28+
29+
SBProcessInfoList(const lldb::SBProcessInfoList &rhs);
30+
31+
const lldb::SBProcessInfoList &operator=(const lldb::SBProcessInfoList &rhs);
32+
33+
uint32_t GetSize() const;
34+
35+
bool GetProcessInfoAtIndex(uint32_t idx, SBProcessInfo &info);
36+
37+
void Clear();
38+
39+
private:
40+
friend SBPlatform;
41+
42+
SBProcessInfoList(const lldb_private::ProcessInfoList &impl);
43+
std::unique_ptr<lldb_private::ProcessInfoList> m_opaque_up;
44+
};
45+
46+
} // namespace lldb
47+
48+
#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
@@ -401,6 +401,8 @@ class Platform : public PluginInterface {
401401
virtual uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info,
402402
ProcessInstanceInfoList &proc_infos);
403403

404+
ProcessInstanceInfoList GetAllProcesses();
405+
404406
virtual bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info);
405407

406408
// Set a breakpoint on all functions that can end up creating a thread for
@@ -875,7 +877,7 @@ class Platform : public PluginInterface {
875877
}
876878

877879
virtual CompilerType GetSiginfoType(const llvm::Triple &triple);
878-
880+
879881
virtual Args GetExtraStartupCommands();
880882

881883
protected:

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
@@ -66,6 +66,7 @@ add_lldb_library(liblldb SHARED ${option_framework}
6666
SBPlatform.cpp
6767
SBProcess.cpp
6868
SBProcessInfo.cpp
69+
SBProcessInfoList.cpp
6970
SBQueue.cpp
7071
SBQueueItem.cpp
7172
SBReproducer.cpp

lldb/source/API/SBPlatform.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "lldb/API/SBFileSpec.h"
1414
#include "lldb/API/SBLaunchInfo.h"
1515
#include "lldb/API/SBPlatform.h"
16+
#include "lldb/API/SBProcessInfoList.h"
1617
#include "lldb/API/SBTarget.h"
1718
#include "lldb/API/SBUnixSignals.h"
1819
#include "lldb/Host/File.h"
@@ -598,6 +599,20 @@ SBProcess SBPlatform::Attach(SBAttachInfo &attach_info,
598599
return {};
599600
}
600601

602+
SBProcessInfoList SBPlatform::GetAllProcesses(SBError &error) {
603+
if (PlatformSP platform_sp = GetSP()) {
604+
if (platform_sp->IsConnected()) {
605+
ProcessInstanceInfoList list = platform_sp->GetAllProcesses();
606+
return SBProcessInfoList(list);
607+
}
608+
error.SetErrorString("not connected");
609+
return {};
610+
}
611+
612+
error.SetErrorString("invalid platform");
613+
return {};
614+
}
615+
601616
SBError SBPlatform::Kill(const lldb::pid_t pid) {
602617
LLDB_INSTRUMENT_VA(this, pid);
603618
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
@@ -992,6 +992,14 @@ uint32_t Platform::FindProcesses(const ProcessInstanceInfoMatch &match_info,
992992
return match_count;
993993
}
994994

995+
ProcessInstanceInfoList Platform::GetAllProcesses() {
996+
ProcessInstanceInfoList processes;
997+
ProcessInstanceInfoMatch match;
998+
assert(match.MatchAllProcesses());
999+
FindProcesses(match, processes);
1000+
return processes;
1001+
}
1002+
9951003
Status Platform::LaunchProcess(ProcessLaunchInfo &launch_info) {
9961004
Status error;
9971005
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)