summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Target/Process.h2
-rw-r--r--lldb/source/Target/Process.cpp15
-rw-r--r--lldb/tools/debugserver/source/DNB.cpp8
-rw-r--r--lldb/tools/debugserver/source/DNB.h2
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachProcess.cpp21
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachProcess.h2
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachTask.cpp20
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachTask.h3
-rw-r--r--lldb/tools/debugserver/source/RNBRemote.cpp8
9 files changed, 41 insertions, 40 deletions
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h
index 0f2870eee47..d9a087ca6b6 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -3461,7 +3461,7 @@ protected:
std::string m_stdout_data;
std::string m_stderr_data;
Mutex m_profile_data_comm_mutex;
- std::string m_profile_data;
+ std::vector<std::string> m_profile_data;
MemoryCache m_memory_cache;
AllocatedMemoryCache m_allocated_memory_cache;
bool m_should_detach; /// Should we detach if the process object goes away with an explicit call to Kill or Detach?
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index ee44a8c5029..ca13fad86f5 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -4009,7 +4009,7 @@ void
Process::BroadcastAsyncProfileData(const char *s, size_t len)
{
Mutex::Locker locker (m_profile_data_comm_mutex);
- m_profile_data.append (s, len);
+ m_profile_data.push_back(s);
BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState()));
}
@@ -4017,7 +4017,10 @@ size_t
Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error)
{
Mutex::Locker locker(m_profile_data_comm_mutex);
- size_t bytes_available = m_profile_data.size();
+ if (m_profile_data.empty())
+ return 0;
+
+ size_t bytes_available = m_profile_data.front().size();
if (bytes_available > 0)
{
LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
@@ -4025,14 +4028,14 @@ Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error)
log->Printf ("Process::GetProfileData (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
if (bytes_available > buf_size)
{
- memcpy(buf, m_profile_data.c_str(), buf_size);
- m_profile_data.erase(0, buf_size);
+ memcpy(buf, m_profile_data.front().data(), buf_size);
+ m_profile_data.front().erase(0, buf_size);
bytes_available = buf_size;
}
else
{
- memcpy(buf, m_profile_data.c_str(), bytes_available);
- m_profile_data.clear();
+ memcpy(buf, m_profile_data.front().data(), bytes_available);
+ m_profile_data.erase(m_profile_data.begin());
}
}
return bytes_available;
diff --git a/lldb/tools/debugserver/source/DNB.cpp b/lldb/tools/debugserver/source/DNB.cpp
index 90df012a3e0..c0e2fcec5a6 100644
--- a/lldb/tools/debugserver/source/DNB.cpp
+++ b/lldb/tools/debugserver/source/DNB.cpp
@@ -1217,14 +1217,14 @@ DNBProcessMemoryRegionInfo (nub_process_t pid, nub_addr_t addr, DNBRegionInfo *r
return -1;
}
-const char *
-DNBProcessGetProfileDataAsCString (nub_process_t pid)
+std::string
+DNBProcessGetProfileData (nub_process_t pid)
{
MachProcessSP procSP;
if (GetProcessSP (pid, procSP))
- return procSP->Task().GetProfileDataAsCString();
+ return procSP->Task().GetProfileData();
- return NULL;
+ return std::string("");
}
nub_bool_t
diff --git a/lldb/tools/debugserver/source/DNB.h b/lldb/tools/debugserver/source/DNB.h
index 332dd1872b0..f6b458a65a7 100644
--- a/lldb/tools/debugserver/source/DNB.h
+++ b/lldb/tools/debugserver/source/DNB.h
@@ -67,7 +67,7 @@ nub_size_t DNBProcessMemoryWrite (nub_process_t pid, nub_addr_t addr, nub
nub_addr_t DNBProcessMemoryAllocate (nub_process_t pid, nub_size_t size, uint32_t permissions) DNB_EXPORT;
nub_bool_t DNBProcessMemoryDeallocate (nub_process_t pid, nub_addr_t addr) DNB_EXPORT;
int DNBProcessMemoryRegionInfo (nub_process_t pid, nub_addr_t addr, DNBRegionInfo *region_info) DNB_EXPORT;
-const char * DNBProcessGetProfileDataAsCString (nub_process_t pid) DNB_EXPORT; // Process owns the returned string. Do not free.
+std::string DNBProcessGetProfileData (nub_process_t pid) DNB_EXPORT;
nub_bool_t DNBProcessSetAsyncEnableProfiling (nub_process_t pid, nub_bool_t enable, uint64_t interval_usec) DNB_EXPORT;
//----------------------------------------------------------------------
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp
index 0a3648467d4..f17bf444f7f 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp
@@ -1347,7 +1347,7 @@ MachProcess::SignalAsyncProfileData (const char *info)
{
DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (%s) ...", __FUNCTION__, info);
PTHREAD_MUTEX_LOCKER (locker, m_profile_data_mutex);
- m_profile_data.append(info);
+ m_profile_data.push_back(info);
m_events.SetEvents(eEventProfileDataAvailable);
// Wait for the event bit to reset if a reset ACK is requested
@@ -1360,19 +1360,22 @@ MachProcess::GetAsyncProfileData (char *buf, size_t buf_size)
{
DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (&%p[%llu]) ...", __FUNCTION__, buf, (uint64_t)buf_size);
PTHREAD_MUTEX_LOCKER (locker, m_profile_data_mutex);
- size_t bytes_available = m_profile_data.size();
+ if (m_profile_data.empty())
+ return 0;
+
+ size_t bytes_available = m_profile_data.front().size();
if (bytes_available > 0)
{
if (bytes_available > buf_size)
{
- memcpy(buf, m_profile_data.data(), buf_size);
- m_profile_data.erase(0, buf_size);
+ memcpy(buf, m_profile_data.front().data(), buf_size);
+ m_profile_data.front().erase(0, buf_size);
bytes_available = buf_size;
}
else
{
- memcpy(buf, m_profile_data.data(), bytes_available);
- m_profile_data.clear();
+ memcpy(buf, m_profile_data.front().data(), bytes_available);
+ m_profile_data.erase(m_profile_data.begin());
}
}
return bytes_available;
@@ -1390,10 +1393,10 @@ MachProcess::ProfileThread(void *arg)
nub_state_t state = proc->GetState();
if (state == eStateRunning)
{
- const char *data = proc->Task().GetProfileDataAsCString();
- if (data)
+ std::string data = proc->Task().GetProfileData();
+ if (!data.empty())
{
- proc->SignalAsyncProfileData(data);
+ proc->SignalAsyncProfileData(data.c_str());
}
}
else if ((state == eStateUnloaded) || (state == eStateDetached) || (state == eStateUnloaded))
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.h b/lldb/tools/debugserver/source/MacOSX/MachProcess.h
index fabcc468832..478fc99f86f 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.h
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.h
@@ -282,7 +282,7 @@ private:
uint64_t m_profile_interval_usec; // If enable, the profiling interval in microseconds
pthread_t m_profile_thread; // Thread ID for the thread that profiles the inferior
PThreadMutex m_profile_data_mutex; // Multithreaded protection for profile info data
- std::string m_profile_data; // Profile data, must be protected by m_profile_data_mutex
+ std::vector<std::string> m_profile_data; // Profile data, must be protected by m_profile_data_mutex
DNBThreadResumeActions m_thread_actions; // The thread actions for the current MachProcess::Resume() call
MachException::Message::collection
diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp
index 836cd3ff0e4..39e509171d5 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp
@@ -54,7 +54,6 @@ MachTask::MachTask(MachProcess *process) :
m_exception_port (MACH_PORT_NULL)
{
memset(&m_exc_port_info, 0, sizeof(m_exc_port_info));
-
}
//----------------------------------------------------------------------
@@ -277,19 +276,20 @@ static void update_used_time(task_t task, int &num_threads, uint64_t **threads_i
kr = mach_vm_deallocate(mach_task_self(), (mach_vm_address_t)(uintptr_t)threads, tcnt * sizeof(*threads));
}
-const char *
-MachTask::GetProfileDataAsCString ()
+std::string
+MachTask::GetProfileData ()
{
+ std::string result;
task_t task = TaskPort();
if (task == TASK_NULL)
- return NULL;
+ return result;
struct task_basic_info task_info;
DNBError err;
err = BasicInfo(task, &task_info);
if (!err.Success())
- return NULL;
+ return result;
uint64_t elapsed_usec = 0;
uint64_t task_used_usec = 0;
@@ -347,19 +347,15 @@ MachTask::GetProfileDataAsCString ()
profile_data_stream << "vprvt:" << vprvt << ';';
profile_data_stream << "vsize:" << vsize << ';';
profile_data_stream << "dirty:" << dirty_size << ';';
- profile_data_stream << "$";
+ profile_data_stream << "end;";
- m_profile_data = profile_data_stream.str();
- }
- else
- {
- m_profile_data.clear();
+ result = profile_data_stream.str();
}
free(threads_id);
free(threads_used_usec);
- return m_profile_data.c_str();
+ return result;
}
diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.h b/lldb/tools/debugserver/source/MacOSX/MachTask.h
index b289065b512..52169715407 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachTask.h
+++ b/lldb/tools/debugserver/source/MacOSX/MachTask.h
@@ -66,7 +66,7 @@ public:
nub_size_t ReadMemory (nub_addr_t addr, nub_size_t size, void *buf);
nub_size_t WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf);
int GetMemoryRegionInfo (nub_addr_t addr, DNBRegionInfo *region_info);
- const char * GetProfileDataAsCString ();
+ std::string GetProfileData ();
nub_addr_t AllocateMemory (nub_size_t size, uint32_t permissions);
nub_bool_t DeallocateMemory (nub_addr_t addr);
@@ -123,7 +123,6 @@ protected:
typedef std::map <mach_vm_address_t, size_t> allocation_collection;
allocation_collection m_allocations;
- std::string m_profile_data;
private:
MachTask(const MachTask&); // Outlaw
diff --git a/lldb/tools/debugserver/source/RNBRemote.cpp b/lldb/tools/debugserver/source/RNBRemote.cpp
index f852b6875c9..4ba0ce08dbd 100644
--- a/lldb/tools/debugserver/source/RNBRemote.cpp
+++ b/lldb/tools/debugserver/source/RNBRemote.cpp
@@ -234,7 +234,7 @@ RNBRemote::SendAsyncProfileData ()
if (m_ctx.HasValidProcessID())
{
nub_process_t pid = m_ctx.ProcessID();
- char buf[256];
+ char buf[1024];
nub_size_t count;
do
{
@@ -3467,10 +3467,10 @@ RNBRemote::HandlePacket_GetProfileData (const char *p)
if (pid == INVALID_NUB_PROCESS)
return SendPacket ("OK");
- const char *data = DNBProcessGetProfileDataAsCString(pid);
- if (data)
+ std::string data = DNBProcessGetProfileData(pid);
+ if (!data.empty())
{
- return SendPacket (data);
+ return SendPacket (data.c_str());
}
else
{
OpenPOWER on IntegriCloud