[Lldb-commits] [lldb] [lldb][AIX] get host info for AIX (PR #134354)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 22 01:55:18 PDT 2025
================
@@ -7,17 +7,135 @@
//===----------------------------------------------------------------------===//
#include "lldb/Host/Host.h"
+#include "lldb/Host/posix/Support.h"
+#include "lldb/Utility/LLDBLog.h"
+#include "lldb/Utility/Log.h"
+#include "lldb/Utility/ProcessInfo.h"
#include "lldb/Utility/Status.h"
+#include "llvm/BinaryFormat/XCOFF.h"
+#include <sys/proc.h>
+#include <sys/procfs.h>
+using namespace llvm;
+using namespace lldb;
using namespace lldb_private;
+namespace {
+enum class ProcessState {
+ Unknown,
+ Dead,
+ DiskSleep,
+ Idle,
+ Paging,
+ Parked,
+ Running,
+ Sleeping,
+ TracedOrStopped,
+ Zombie,
+};
+}
+
+ProcessInstanceInfo::timespec convert(pr_timestruc64_t t) {
+ ProcessInstanceInfo::timespec ts;
+ ts.tv_sec = t.tv_sec;
+ ts.tv_usec = t.tv_nsec / 1000; // nanos to micros
+ return ts;
+}
+
+static bool GetStatusInfo(::pid_t pid, ProcessInstanceInfo &processInfo,
+ ProcessState &State) {
+ struct pstatus pstatusData;
+ auto BufferOrError = getProcFile(pid, "status");
+ if (!BufferOrError)
+ return false;
+
+ std::unique_ptr<llvm::MemoryBuffer> StatusBuffer = std::move(*BufferOrError);
+ // Ensure there's enough data for psinfoData
+ if (StatusBuffer->getBufferSize() < sizeof(pstatusData))
+ return false;
+
+ std::memcpy(&pstatusData, StatusBuffer->getBufferStart(),
+ sizeof(pstatusData));
+ switch (pstatusData.pr_stat) {
+ case SIDL:
+ State = ProcessState::Idle;
+ break;
+ case SACTIVE:
+ State = ProcessState::Running;
+ break;
+ case SSTOP:
+ State = ProcessState::TracedOrStopped;
+ break;
+ case SZOMB:
+ State = ProcessState::Zombie;
+ break;
+ default:
+ State = ProcessState::Unknown;
+ break;
+ }
+ processInfo.SetIsZombie(State == ProcessState::Zombie);
+ processInfo.SetUserTime(convert(pstatusData.pr_utime));
+ processInfo.SetSystemTime(convert(pstatusData.pr_stime));
+ processInfo.SetCumulativeUserTime(convert(pstatusData.pr_cutime));
+ processInfo.SetCumulativeSystemTime(convert(pstatusData.pr_cstime));
+ return true;
+}
+
+static bool GetExePathAndIds(::pid_t pid, ProcessInstanceInfo &process_info) {
+ struct psinfo psinfoData;
+ auto BufferOrError = getProcFile(pid, "psinfo");
+ if (!BufferOrError)
+ return false;
+
+ std::unique_ptr<llvm::MemoryBuffer> PsinfoBuffer = std::move(*BufferOrError);
+ // Ensure there's enough data for psinfoData
+ if (PsinfoBuffer->getBufferSize() < sizeof(psinfoData))
+ return false;
+
+ std::memcpy(&psinfoData, PsinfoBuffer->getBufferStart(), sizeof(psinfoData));
+ llvm::StringRef PathRef(&(psinfoData.pr_psargs[0]));
----------------
labath wrote:
Is this guaranteed to be null-terminated (at least on linux, these kinds of fields do not get null-terminated when they're truncated). If it isn't, you may want to do something like `StringRef(psinfoData.pr_psargs, strnlen(psinfoData.pr_psargs, sizeof(psinfoData.pr_psargs))`
https://github.com/llvm/llvm-project/pull/134354
More information about the lldb-commits
mailing list