mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-15 12:50:38 +00:00

Summary: This adds the jModulesInfo packet, which is the equivalent of qModulesInfo, but it enables us to query multiple modules at once. This makes a significant speed improvement in case the application has many (over a hundred) modules, and the communication link has a non-negligible latency. This functionality is accessed by ProcessGdbRemote::PrefetchModuleSpecs(), which does the caching. GetModuleSpecs() is modified to first consult the cache before asking the remote stub. PrefetchModuleSpecs is currently only called from POSIX-DYLD dynamic loader plugin, after it reads the list of modules from the inferior memory, but other uses are possible. This decreases the attach time to an android application by about 40%. Reviewers: clayborg Subscribers: tberghammer, lldb-commits, danalbert Differential Revision: https://reviews.llvm.org/D24236 llvm-svn: 280919
164 lines
5.6 KiB
C++
164 lines
5.6 KiB
C++
//===-- GDBRemoteCommunicationServerCommon.h --------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_GDBRemoteCommunicationServerCommon_h_
|
|
#define liblldb_GDBRemoteCommunicationServerCommon_h_
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
#include <string>
|
|
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/lldb-private-forward.h"
|
|
|
|
#include "GDBRemoteCommunicationServer.h"
|
|
#include "GDBRemoteCommunicationServerCommon.h"
|
|
|
|
class StringExtractorGDBRemote;
|
|
|
|
namespace lldb_private {
|
|
namespace process_gdb_remote {
|
|
|
|
class ProcessGDBRemote;
|
|
|
|
class GDBRemoteCommunicationServerCommon : public GDBRemoteCommunicationServer {
|
|
public:
|
|
GDBRemoteCommunicationServerCommon(const char *comm_name,
|
|
const char *listener_name);
|
|
|
|
~GDBRemoteCommunicationServerCommon() override;
|
|
|
|
protected:
|
|
ProcessLaunchInfo m_process_launch_info;
|
|
Error m_process_launch_error;
|
|
ProcessInstanceInfoList m_proc_infos;
|
|
uint32_t m_proc_infos_index;
|
|
bool m_thread_suffix_supported;
|
|
bool m_list_threads_in_stop_reply;
|
|
|
|
PacketResult Handle_A(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qHostInfo(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qProcessInfoPID(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qfProcessInfo(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qsProcessInfo(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qUserName(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qGroupName(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qSpeedTest(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_Open(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_Close(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_pRead(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_pWrite(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_Size(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_Mode(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_Exists(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_symlink(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_unlink(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_Stat(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_vFile_MD5(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qEcho(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qModuleInfo(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_jModulesInfo(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qPlatform_shell(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qPlatform_mkdir(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qPlatform_chmod(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qSupported(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QThreadSuffixSupported(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QListThreadsInStopReply(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QSetDetachOnError(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QStartNoAckMode(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QSetSTDIN(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QSetSTDOUT(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QSetSTDERR(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_qLaunchSuccess(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QEnvironment(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QEnvironmentHexEncoded(StringExtractorGDBRemote &packet);
|
|
|
|
PacketResult Handle_QLaunchArch(StringExtractorGDBRemote &packet);
|
|
|
|
static void CreateProcessInfoResponse(const ProcessInstanceInfo &proc_info,
|
|
StreamString &response);
|
|
|
|
static void CreateProcessInfoResponse_DebugServerStyle(
|
|
const ProcessInstanceInfo &proc_info, StreamString &response);
|
|
|
|
template <typename T>
|
|
void RegisterMemberFunctionHandler(
|
|
StringExtractorGDBRemote::ServerPacketType packet_type,
|
|
PacketResult (T::*handler)(StringExtractorGDBRemote &packet)) {
|
|
RegisterPacketHandler(packet_type,
|
|
[this, handler](StringExtractorGDBRemote packet,
|
|
Error &error, bool &interrupt,
|
|
bool &quit) {
|
|
return (static_cast<T *>(this)->*handler)(packet);
|
|
});
|
|
}
|
|
|
|
//------------------------------------------------------------------
|
|
/// Launch a process with the current launch settings.
|
|
///
|
|
/// This method supports running an lldb-gdbserver or similar
|
|
/// server in a situation where the startup code has been provided
|
|
/// with all the information for a child process to be launched.
|
|
///
|
|
/// @return
|
|
/// An Error object indicating the success or failure of the
|
|
/// launch.
|
|
//------------------------------------------------------------------
|
|
virtual Error LaunchProcess() = 0;
|
|
|
|
virtual FileSpec FindModuleFile(const std::string &module_path,
|
|
const ArchSpec &arch);
|
|
|
|
private:
|
|
ModuleSpec GetModuleInfo(const std::string &module_path,
|
|
const std::string &triple);
|
|
};
|
|
|
|
} // namespace process_gdb_remote
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_GDBRemoteCommunicationServerCommon_h_
|