1 #ifndef ROSE_BinaryAnalysis_Debugger_Gdb_H
2 #define ROSE_BinaryAnalysis_Debugger_Gdb_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_DEBUGGER_GDB
6 #include <Rose/BinaryAnalysis/Debugger/Base.h>
7 #include <Rose/BinaryAnalysis/Debugger/GdbResponse.h>
10 #include <boost/asio.hpp>
11 #include <boost/filesystem.hpp>
12 #include <boost/process.hpp>
14 #include <condition_variable>
20 namespace BinaryAnalysis {
24 class Gdb:
public Base {
36 boost::filesystem::path gdbName =
"gdb-multiarch";
41 boost::filesystem::path executable;
59 std::condition_variable cond_;
61 std::list<Value> items_;
62 bool isClosed_ =
false;
66 void append(
const Value &item) {
67 const std::lock_guard<std::mutex> lock(mutex_);
68 items_.push_back(item);
74 const std::lock_guard<std::mutex> lock(mutex_);
82 const std::lock_guard<std::mutex> lock(mutex_);
90 const std::lock_guard<std::mutex> lock(mutex_);
94 Value item = items_.front();
102 std::unique_lock<std::mutex> lock(mutex_);
103 while (items_.empty() && !isClosed_)
105 if (items_.empty()) {
108 Value item = items_.front();
116 std::lock_guard<std::mutex> lock(mutex_);
124 bool hasEndMarker =
false;
126 struct ResultRecord {
130 std::list<Yaml::Node> results;
133 std::list<ResultRecord> resultRecord;
141 std::thread gdbThread_;
142 Fifo<std::string> gdbOutput_;
143 boost::asio::io_service ios_;
144 boost::process::async_pipe gdbOutputPipe_;
145 boost::process::opstream gdbInput_;
146 boost::asio::streambuf gdbOutputBuffer_;
147 std::vector<std::pair<std::string, RegisterDescriptor>> registers_;
148 std::list<GdbResponse> responses_;
150 std::map<rose_addr_t,
unsigned > gdbBreakPoints_;
151 std::future<int> exitCodeFuture_;
166 static Ptr instance();
171 static Ptr instance(
const Specimen&);
180 virtual void attach(
const Specimen&);
192 const std::list<GdbResponse>& sendCommand(
const std::string&);
198 std::list<GdbResponse> readRequiredResponses();
204 std::list<GdbResponse> readOptionalResponses();
209 const std::list<GdbResponse>& responses()
const;
212 void resetResponses();
217 const std::vector<std::pair<std::string, RegisterDescriptor>>& registerNames()
const;
223 virtual bool isAttached()
override;
224 virtual void detach()
override;
225 virtual void terminate()
override;
226 virtual std::vector<ThreadId> threadIds()
override;
229 virtual void clearBreakPoints()
override;
230 virtual void singleStep(ThreadId)
override;
231 virtual void runToBreakPoint(ThreadId)
override;
234 virtual void writeRegister(ThreadId, RegisterDescriptor, uint64_t value)
override;
235 virtual size_t readMemory(rose_addr_t va,
size_t nBytes, uint8_t *buffer)
override;
236 virtual std::vector<uint8_t> readMemory(rose_addr_t va,
size_t nBytes)
override;
238 virtual size_t writeMemory(rose_addr_t va,
size_t nBytes,
const uint8_t *bytes)
override;
239 virtual bool isTerminated()
override;
240 virtual std::string howTerminated()
override;
247 std::list<GdbResponse> readResponseSet(
bool required);
254 RegisterDescriptor findRegister(RegisterDescriptor)
const;
257 bool gdbHandlesBreakPoints()
const;
ROSE_DLL_API void clear()
Empties the memory pool of all nodes.
Error messages that indicate an abnormal situation from which the program was able to at least partia...
Main namespace for the ROSE library.
const char * ResultClass(int64_t)
Convert Rose::BinaryAnalysis::Debugger::Gdb::Response::ResultRecord::ResultClass enum constant to a s...
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.