forked from qt-creator/qt-creator
lldb: introduce dialog to start engine remotely
This commit is contained in:
@@ -58,45 +58,140 @@
|
||||
namespace Debugger {
|
||||
namespace Internal {
|
||||
|
||||
SshIODevice::SshIODevice(Core::SshRemoteProcessRunner::Ptr r)
|
||||
: runner(r)
|
||||
, buckethead(0)
|
||||
{
|
||||
setOpenMode(QIODevice::ReadWrite | QIODevice::Unbuffered);
|
||||
connect (runner.data(), SIGNAL(processStarted()),
|
||||
this, SLOT(processStarted()));
|
||||
connect(runner.data(), SIGNAL(processOutputAvailable(const QByteArray &)),
|
||||
this, SLOT(outputAvailable(const QByteArray &)));
|
||||
connect(runner.data(), SIGNAL(processErrorOutputAvailable(const QByteArray &)),
|
||||
this, SLOT(errorOutputAvailable(const QByteArray &)));
|
||||
}
|
||||
qint64 SshIODevice::bytesAvailable () const
|
||||
{
|
||||
qint64 r = QIODevice::bytesAvailable();
|
||||
foreach (const QByteArray &bucket, buckets)
|
||||
r += bucket.size();
|
||||
r-= buckethead;
|
||||
return r;
|
||||
}
|
||||
qint64 SshIODevice::writeData (const char * data, qint64 maxSize)
|
||||
{
|
||||
if (proc == 0) {
|
||||
startupbuffer += QByteArray::fromRawData(data, maxSize);
|
||||
return maxSize;
|
||||
}
|
||||
proc->sendInput(QByteArray::fromRawData(data, maxSize));
|
||||
return maxSize;
|
||||
}
|
||||
qint64 SshIODevice::readData (char * data, qint64 maxSize)
|
||||
{
|
||||
if (proc == 0)
|
||||
return 0;
|
||||
qint64 size = maxSize;
|
||||
while (size > 0) {
|
||||
if (!buckets.size()) {
|
||||
return maxSize - size;
|
||||
}
|
||||
QByteArray &bucket = buckets.head();
|
||||
if ((size + buckethead) >= bucket.size()) {
|
||||
int d = bucket.size() - buckethead;
|
||||
memcpy(data, bucket.data() + buckethead, d);
|
||||
data += d;
|
||||
size -= d;
|
||||
buckets.dequeue();
|
||||
buckethead = 0;
|
||||
} else {
|
||||
memcpy(data, bucket.data() + buckethead, size);
|
||||
data += size;
|
||||
buckethead += size;
|
||||
size = 0;
|
||||
}
|
||||
}
|
||||
return maxSize - size;
|
||||
}
|
||||
|
||||
void SshIODevice::processStarted()
|
||||
{
|
||||
proc = runner->process();
|
||||
proc->sendInput(startupbuffer);
|
||||
}
|
||||
|
||||
void SshIODevice::outputAvailable(const QByteArray &output)
|
||||
{
|
||||
buckets.enqueue(output);
|
||||
emit readyRead();
|
||||
}
|
||||
|
||||
void SshIODevice::errorOutputAvailable(const QByteArray &output)
|
||||
{
|
||||
fprintf(stderr, "%s", output.data());
|
||||
}
|
||||
|
||||
|
||||
LldbEngineHost::LldbEngineHost(const DebuggerStartParameters &startParameters)
|
||||
:IPCEngineHost(startParameters)
|
||||
{
|
||||
showMessage(QLatin1String("setting up coms"));
|
||||
|
||||
m_guestProcess = new QProcess(this);
|
||||
if (startParameters.startMode == StartRemoteEngine)
|
||||
{
|
||||
m_guestProcess = 0;
|
||||
Core::SshRemoteProcessRunner::Ptr runner =
|
||||
Core::SshRemoteProcessRunner::create(startParameters.connParams);
|
||||
connect (runner.data(), SIGNAL(connectionError(Core::SshError)),
|
||||
this, SLOT(sshConnectionError(Core::SshError)));
|
||||
runner->run(startParameters.serverStartScript.toUtf8());
|
||||
setGuestDevice(new SshIODevice(runner));
|
||||
} else {
|
||||
m_guestProcess = new QProcess(this);
|
||||
|
||||
connect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
|
||||
this, SLOT(finished(int, QProcess::ExitStatus)));
|
||||
connect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
|
||||
this, SLOT(finished(int, QProcess::ExitStatus)));
|
||||
|
||||
connect(m_guestProcess, SIGNAL(readyReadStandardError()), this,
|
||||
SLOT(stderrReady()));
|
||||
connect(m_guestProcess, SIGNAL(readyReadStandardError()), this,
|
||||
SLOT(stderrReady()));
|
||||
|
||||
|
||||
QString a = Core::ICore::instance()->resourcePath() + QLatin1String("/qtcreator-lldb");
|
||||
if(getenv("QTC_LLDB_GUEST") != 0)
|
||||
a = QString::fromLocal8Bit(getenv("QTC_LLDB_GUEST"));
|
||||
QString a = Core::ICore::instance()->resourcePath() + QLatin1String("/qtcreator-lldb");
|
||||
if(getenv("QTC_LLDB_GUEST") != 0)
|
||||
a = QString::fromLocal8Bit(getenv("QTC_LLDB_GUEST"));
|
||||
|
||||
showStatusMessage(QString(QLatin1String("starting %1")).arg(a));
|
||||
showStatusMessage(QString(QLatin1String("starting %1")).arg(a));
|
||||
|
||||
m_guestProcess->start(a, QStringList());
|
||||
m_guestProcess->setReadChannel(QProcess::StandardOutput);
|
||||
m_guestProcess->start(a, QStringList(), QIODevice::ReadWrite | QIODevice::Unbuffered);
|
||||
m_guestProcess->setReadChannel(QProcess::StandardOutput);
|
||||
|
||||
if (!m_guestProcess->waitForStarted()) {
|
||||
showStatusMessage(tr("qtcreator-lldb failed to start %1").arg(m_guestProcess->error()));
|
||||
notifyEngineSpontaneousShutdown();
|
||||
return;
|
||||
if (!m_guestProcess->waitForStarted()) {
|
||||
showStatusMessage(tr("qtcreator-lldb failed to start %1").arg(m_guestProcess->error()));
|
||||
notifyEngineSpontaneousShutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
setGuestDevice(m_guestProcess);
|
||||
}
|
||||
|
||||
setGuestDevice(m_guestProcess);
|
||||
}
|
||||
|
||||
LldbEngineHost::~LldbEngineHost()
|
||||
{
|
||||
showMessage(QLatin1String("tear down qtcreator-lldb"));
|
||||
disconnect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
|
||||
this, SLOT(finished (int, QProcess::ExitStatus)));
|
||||
m_guestProcess->terminate();
|
||||
m_guestProcess->kill();
|
||||
|
||||
if (m_guestProcess) {
|
||||
disconnect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
|
||||
this, SLOT(finished (int, QProcess::ExitStatus)));
|
||||
|
||||
|
||||
m_guestProcess->terminate();
|
||||
m_guestProcess->kill();
|
||||
}
|
||||
if (m_ssh.data() && m_ssh->process().data()) {
|
||||
// TODO: openssh doesn't do that
|
||||
|
||||
m_ssh->process()->kill();
|
||||
}
|
||||
}
|
||||
|
||||
void LldbEngineHost::nuke()
|
||||
@@ -108,6 +203,10 @@ void LldbEngineHost::nuke()
|
||||
m_guestProcess->kill();
|
||||
notifyEngineSpontaneousShutdown();
|
||||
}
|
||||
void LldbEngineHost::sshConnectionError(Core::SshError e)
|
||||
{
|
||||
showStatusMessage(tr("ssh connection error: %1").arg(e));
|
||||
}
|
||||
|
||||
void LldbEngineHost::finished(int, QProcess::ExitStatus status)
|
||||
{
|
||||
@@ -128,3 +227,4 @@ DebuggerEngine *createLldbEngine(const DebuggerStartParameters &startParameters)
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Debugger
|
||||
|
||||
|
||||
Reference in New Issue
Block a user