CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
422 lines
11 KiB
C++
422 lines
11 KiB
C++
/*
|
|
* See the dyninst/COPYRIGHT file for copyright information.
|
|
*
|
|
* We provide the Paradyn Tools (below described as "Paradyn")
|
|
* on an AS IS basis, and do not warrant its validity or performance.
|
|
* We reserve the right to update, modify, or discontinue this
|
|
* software at any time. We shall have no obligation to supply such
|
|
* updates or modifications or any other form of support to you.
|
|
*
|
|
* By your use of Paradyn, you understand and agree that we (or any
|
|
* other person or entity with proprietary rights in Paradyn) are
|
|
* under no obligation to provide either maintenance services,
|
|
* update services, notices of latent defects, or correction of
|
|
* defects for Paradyn.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "PCProcess.h"
|
|
#include "ProcessSet.h"
|
|
|
|
#include <list>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <map>
|
|
#include <set>
|
|
|
|
#if !defined(PLATFEATURES_H_)
|
|
#define PLATFEATURES_H_
|
|
|
|
class int_process;
|
|
class sysv_process;
|
|
class thread_db_process;
|
|
class linux_process;
|
|
class int_libraryTracking;
|
|
class int_LWPTracking;
|
|
class int_threadTracking;
|
|
class int_followFork;
|
|
class int_multiToolControl;
|
|
class int_signalMask;
|
|
class int_callStackUnwinding;
|
|
class int_remoteIO;
|
|
class int_memUsage;
|
|
class int_fileInfo;
|
|
|
|
//For sigset_t
|
|
#if !defined(_MSC_VER)
|
|
#include <signal.h>
|
|
#endif
|
|
|
|
namespace Dyninst {
|
|
namespace ProcControlAPI {
|
|
|
|
class PC_EXPORT LibraryTracking
|
|
{
|
|
friend class ::int_libraryTracking;
|
|
friend class ::int_process;
|
|
protected:
|
|
LibraryTracking(Process::ptr proc_);
|
|
~LibraryTracking();
|
|
Process::weak_ptr proc;
|
|
public:
|
|
static void setDefaultTrackLibraries(bool b);
|
|
static bool getDefaultTrackLibraries();
|
|
|
|
bool setTrackLibraries(bool b) const;
|
|
bool getTrackLibraries() const;
|
|
bool refreshLibraries();
|
|
};
|
|
|
|
class PC_EXPORT LibraryTrackingSet
|
|
{
|
|
friend class ProcessSet;
|
|
friend class PSetFeatures;
|
|
friend class ::int_process;
|
|
protected:
|
|
LibraryTrackingSet(ProcessSet::ptr ps_);
|
|
~LibraryTrackingSet();
|
|
ProcessSet::weak_ptr wps;
|
|
public:
|
|
bool setTrackLibraries(bool b) const;
|
|
bool refreshLibraries() const;
|
|
};
|
|
|
|
class PC_EXPORT LWPTracking
|
|
{
|
|
friend class ::linux_process;
|
|
friend class ::int_process;
|
|
friend class ::int_LWPTracking;
|
|
protected:
|
|
LWPTracking(Process::ptr proc_);
|
|
~LWPTracking();
|
|
Process::weak_ptr proc;
|
|
static bool default_track_lwps;
|
|
public:
|
|
static void setDefaultTrackLWPs(bool b);
|
|
static bool getDefaultTrackLWPs();
|
|
|
|
void setTrackLWPs(bool b) const;
|
|
bool getTrackLWPs() const;
|
|
bool refreshLWPs();
|
|
};
|
|
|
|
class PC_EXPORT LWPTrackingSet
|
|
{
|
|
friend class ProcessSet;
|
|
friend class PSetFeatures;
|
|
friend class ::int_process;
|
|
protected:
|
|
LWPTrackingSet(ProcessSet::ptr ps_);
|
|
~LWPTrackingSet();
|
|
ProcessSet::weak_ptr wps;
|
|
public:
|
|
bool setTrackLWPs(bool b) const;
|
|
bool refreshLWPs() const;
|
|
};
|
|
|
|
class PC_EXPORT ThreadTracking
|
|
{
|
|
friend class ::int_process;
|
|
friend class ::thread_db_process;
|
|
friend class ::int_threadTracking;
|
|
protected:
|
|
ThreadTracking(Process::ptr proc_);
|
|
~ThreadTracking();
|
|
Process::weak_ptr proc;
|
|
static bool default_track_threads;
|
|
public:
|
|
static void setDefaultTrackThreads(bool b);
|
|
static bool getDefaultTrackThreads();
|
|
|
|
bool setTrackThreads(bool b) const;
|
|
bool getTrackThreads() const;
|
|
bool refreshThreads();
|
|
};
|
|
|
|
class PC_EXPORT ThreadTrackingSet
|
|
{
|
|
friend class ProcessSet;
|
|
friend class PSetFeatures;
|
|
friend class ::int_process;
|
|
protected:
|
|
ThreadTrackingSet(ProcessSet::ptr ps_);
|
|
~ThreadTrackingSet();
|
|
ProcessSet::weak_ptr wps;
|
|
public:
|
|
bool setTrackThreads(bool b) const;
|
|
bool refreshThreads() const;
|
|
};
|
|
|
|
class PC_EXPORT FollowFork
|
|
{
|
|
friend class ::linux_process;
|
|
friend class ::int_process;
|
|
friend class ::int_followFork;
|
|
protected:
|
|
FollowFork(Process::ptr proc_);
|
|
~FollowFork();
|
|
Process::weak_ptr proc;
|
|
public:
|
|
|
|
typedef enum {
|
|
None, //Fork tracking not available on this platform.
|
|
ImmediateDetach, //Do not even attach to forked children.
|
|
DisableBreakpointsDetach, //Remove inherited breakpoints from children, then detach.
|
|
Follow //Default. Attach and full control of forked children.
|
|
} follow_t;
|
|
|
|
static void setDefaultFollowFork(follow_t f);
|
|
static follow_t getDefaultFollowFork();
|
|
|
|
bool setFollowFork(follow_t b) const;
|
|
follow_t getFollowFork() const;
|
|
protected:
|
|
static follow_t default_should_follow_fork;
|
|
};
|
|
|
|
class PC_EXPORT FollowForkSet
|
|
{
|
|
friend class ProcessSet;
|
|
friend class PSetFeatures;
|
|
protected:
|
|
FollowForkSet(ProcessSet::ptr ps_);
|
|
~FollowForkSet();
|
|
ProcessSet::weak_ptr wps;
|
|
public:
|
|
bool setFollowFork(FollowFork::follow_t f) const;
|
|
};
|
|
|
|
class PC_EXPORT CallStackCallback
|
|
{
|
|
private:
|
|
static const bool top_first_default_value = false;
|
|
public:
|
|
bool top_first;
|
|
CallStackCallback();
|
|
virtual bool beginStackWalk(Thread::ptr thr) = 0;
|
|
virtual bool addStackFrame(Thread::ptr thr, Dyninst::Address ra, Dyninst::Address sp, Dyninst::Address fp) = 0;
|
|
virtual void endStackWalk(Thread::ptr thr) = 0;
|
|
virtual ~CallStackCallback();
|
|
};
|
|
|
|
class PC_EXPORT CallStackUnwinding
|
|
{
|
|
friend class ::int_process;
|
|
friend class ::int_thread;
|
|
friend class ::int_callStackUnwinding;
|
|
private:
|
|
Thread::weak_ptr wt;
|
|
public:
|
|
CallStackUnwinding(Thread::ptr t);
|
|
virtual ~CallStackUnwinding();
|
|
bool walkStack(CallStackCallback *stk_cb) const;
|
|
};
|
|
|
|
class PC_EXPORT MemoryUsage
|
|
{
|
|
friend class ::int_process;
|
|
friend class ::int_memUsage;
|
|
private:
|
|
MemoryUsage(Process::ptr proc_);
|
|
~MemoryUsage();
|
|
Process::weak_ptr proc;
|
|
public:
|
|
bool sharedUsed(unsigned long &sused) const;
|
|
bool heapUsed(unsigned long &hused) const;
|
|
bool stackUsed(unsigned long &sused) const;
|
|
bool resident(unsigned long &resident) const;
|
|
};
|
|
|
|
class PC_EXPORT MemoryUsageSet
|
|
{
|
|
friend class ProcessSet;
|
|
friend class PSetFeatures;
|
|
protected:
|
|
MemoryUsageSet(ProcessSet::ptr ps_);
|
|
~MemoryUsageSet();
|
|
ProcessSet::weak_ptr wps;
|
|
typedef enum {
|
|
mus_shared = 0,
|
|
mus_heap,
|
|
mus_stack,
|
|
mus_resident
|
|
} mem_usage_t;
|
|
bool usedX(std::map<Process::const_ptr, unsigned long> &used, mem_usage_t mu) const;
|
|
public:
|
|
bool sharedUsed(std::map<Process::const_ptr, unsigned long> &used) const;
|
|
bool heapUsed(std::map<Process::const_ptr, unsigned long> &used) const;
|
|
bool stackUsed(std::map<Process::const_ptr, unsigned long> &used) const;
|
|
bool resident(std::map<Process::const_ptr, unsigned long> &res) const;
|
|
};
|
|
|
|
class PC_EXPORT CallStackUnwindingSet
|
|
{
|
|
private:
|
|
ThreadSet::weak_ptr wts;
|
|
public:
|
|
CallStackUnwindingSet(ThreadSet::ptr ts);
|
|
~CallStackUnwindingSet();
|
|
bool walkStack(CallStackCallback *stk_cb);
|
|
};
|
|
|
|
class PC_EXPORT MultiToolControl
|
|
{
|
|
friend class ::int_process;
|
|
friend class ::int_multiToolControl;
|
|
public:
|
|
typedef unsigned int priority_t;
|
|
private:
|
|
Process::weak_ptr proc;
|
|
protected:
|
|
MultiToolControl(Process::ptr p);
|
|
~MultiToolControl();
|
|
static std::string default_tool_name;
|
|
static priority_t default_tool_priority;
|
|
public:
|
|
static void setDefaultToolName(std::string name);
|
|
static void setDefaultToolPriority(priority_t p);
|
|
static std::string getDefaultToolName();
|
|
static priority_t getDefaultToolPriority();
|
|
|
|
//Tool name and priority cannot be changed after process creation.
|
|
//To set these values, use the static methods to set the default,
|
|
// values, then trigger your attach/create operation.
|
|
std::string getToolName() const;
|
|
priority_t getToolPriority() const;
|
|
};
|
|
|
|
#if defined(_MSC_VER)
|
|
typedef void* dyn_sigset_t;
|
|
#else
|
|
typedef sigset_t dyn_sigset_t;
|
|
#endif
|
|
|
|
//On posix system, the sigset referenced below is a pointer to a sigset_t
|
|
class PC_EXPORT SignalMask
|
|
{
|
|
friend class ::int_process;
|
|
friend class ::int_signalMask;
|
|
protected:
|
|
static dyn_sigset_t default_sigset;
|
|
static bool sigset_initialized;
|
|
private:
|
|
Process::weak_ptr proc;
|
|
SignalMask(Process::ptr proc_);
|
|
~SignalMask();
|
|
public:
|
|
static dyn_sigset_t getDefaultSigMask();
|
|
static void setDefaultSigMask(dyn_sigset_t s);
|
|
dyn_sigset_t getSigMask() const;
|
|
bool setSigMask(dyn_sigset_t s);
|
|
};
|
|
|
|
/**
|
|
* This struct is copied from the GLIBC sources for 'struct stat64'. It is
|
|
* recreated here because this header is supposed to compile without ifdefs
|
|
* across platforms that may not have 'struct stat64'
|
|
**/
|
|
extern "C" struct stat64_ret_t {
|
|
unsigned long long st_dev;
|
|
unsigned long long st_ino;
|
|
unsigned int st_mode;
|
|
unsigned int st_nlink;
|
|
unsigned int st_uid;
|
|
unsigned int st_gid;
|
|
unsigned long long st_rdev;
|
|
unsigned short __pad2;
|
|
long long st_size;
|
|
int st_blksize;
|
|
long long st_blocks;
|
|
int st_atime_;
|
|
unsigned int st_atime_nsec;
|
|
int st_mtime_;
|
|
unsigned int st_mtime_nsec;
|
|
int st_ctime_;
|
|
unsigned int st_ctime_nsec;
|
|
unsigned int __unused4;
|
|
unsigned int __unused5;
|
|
};
|
|
|
|
typedef stat64_ret_t *stat64_ptr;
|
|
typedef dyncompat::shared_ptr<int_fileInfo> int_fileInfo_ptr;
|
|
|
|
class RemoteIO;
|
|
class RemoteIOSet;
|
|
|
|
class FileInfo {
|
|
friend class ::int_remoteIO;
|
|
friend class RemoteIO;
|
|
friend class RemoteIOSet;
|
|
private:
|
|
mutable int_fileInfo_ptr info;
|
|
int_fileInfo_ptr getInfo() const;
|
|
public:
|
|
FileInfo(std::string fname);
|
|
FileInfo();
|
|
FileInfo(const FileInfo &fi);
|
|
~FileInfo();
|
|
|
|
std::string getFilename() const;
|
|
stat64_ptr getStatResults() const; //Filled in by getFileStatData
|
|
};
|
|
|
|
typedef std::multimap<Process::const_ptr, FileInfo> FileSet;
|
|
|
|
class PC_EXPORT RemoteIO
|
|
{
|
|
protected:
|
|
Process::weak_ptr proc;
|
|
public:
|
|
RemoteIO(Process::ptr proc);
|
|
virtual ~RemoteIO();
|
|
|
|
//Construct filesets based on filenames, without doing a getFileNames
|
|
// User is responsible for 'delete'ing the FileSet when done.
|
|
FileSet *getFileSet(std::string filename) const;
|
|
FileSet *getFileSet(const std::set<std::string> &filenames) const;
|
|
bool addToFileSet(std::string filename, FileSet *fs) const;
|
|
|
|
bool getFileNames(FileSet *result) const;
|
|
|
|
//Get data as per a stat system call, fill in the FileInfo objects
|
|
bool getFileStatData(FileSet *fset) const;
|
|
|
|
//These are whole file reads and produce EventAsyncFileRead callbacks
|
|
bool readFileContents(const FileSet *fset);
|
|
};
|
|
|
|
class PC_EXPORT RemoteIOSet
|
|
{
|
|
protected:
|
|
ProcessSet::weak_ptr pset;
|
|
public:
|
|
RemoteIOSet(ProcessSet::ptr procs_);
|
|
virtual ~RemoteIOSet();
|
|
|
|
FileSet *getFileSet(std::string filename);
|
|
FileSet *getFileSet(const std::set<std::string> &filenames);
|
|
bool addToFileSet(std::string filename, FileSet *fs);
|
|
|
|
bool getFileNames(FileSet *result);
|
|
bool getFileStatData(FileSet *fset);
|
|
bool readFileContents(const FileSet *fset);
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|