Index: lldb/trunk/lit/Reproducer/TestDump.test =================================================================== --- lldb/trunk/lit/Reproducer/TestDump.test +++ lldb/trunk/lit/Reproducer/TestDump.test @@ -18,4 +18,8 @@ # COMMANDS: target create # COMMANDS: command source +# RUN: %lldb -b -o 'reproducer dump -p gdb -f %t.repro' | FileCheck %s --check-prefix GDB +# GDB: send packet: $QStartNoAckMode#b0 +# GDB: read packet: $OK#9a + # RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix FILES Index: lldb/trunk/source/Commands/CommandObjectReproducer.cpp =================================================================== --- lldb/trunk/source/Commands/CommandObjectReproducer.cpp +++ lldb/trunk/source/Commands/CommandObjectReproducer.cpp @@ -10,6 +10,7 @@ #include "lldb/Host/OptionParser.h" #include "lldb/Utility/Reproducer.h" +#include "lldb/Utility/GDBRemote.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" @@ -310,9 +311,26 @@ return true; } case eReproducerProviderGDB: { - // FIXME: Dumping the GDB remote packets means moving the - // (de)serialization code out of the GDB-remote plugin. - result.AppendMessage("Dumping GDB remote packets isn't implemented yet."); + FileSpec gdb_file = loader->GetFile(); + auto error_or_file = MemoryBuffer::getFile(gdb_file.GetPath()); + if (auto err = error_or_file.getError()) { + SetError(result, errorCodeToError(err)); + return false; + } + + std::vector packets; + yaml::Input yin((*error_or_file)->getBuffer()); + yin >> packets; + + if (auto err = yin.error()) { + SetError(result, errorCodeToError(err)); + return false; + } + + for (GDBRemotePacket& packet : packets) { + packet.Dump(result.GetOutputStream()); + } + result.SetStatus(eReturnStatusSuccessFinishResult); return true; }