diff options
Diffstat (limited to 'lldb')
-rw-r--r-- | lldb/include/lldb/Target/Process.h | 2 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 15 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/DNB.cpp | 8 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/DNB.h | 2 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachProcess.cpp | 21 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachProcess.h | 2 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachTask.cpp | 20 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachTask.h | 3 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/RNBRemote.cpp | 8 |
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 { |