187 |
187 |
188 bool Launcher::startServer(QString *errorMessage) |
188 bool Launcher::startServer(QString *errorMessage) |
189 { |
189 { |
190 errorMessage->clear(); |
190 errorMessage->clear(); |
191 if (d->m_verbose) { |
191 if (d->m_verbose) { |
192 const QString msg = QString::fromLatin1("Port=%1 Executable=%2 Package=%3 Remote Package=%4 Install file=%5") |
192 const QString msg = QString::fromLatin1("Port=%1 Executable=%2 Arguments=%3 Package=%4 Remote Package=%5 Install file=%6") |
193 .arg(d->m_trkServerName, d->m_fileName, d->m_copyState.sourceFileName, d->m_copyState.destinationFileName, d->m_installFileName); |
193 .arg(d->m_trkServerName, d->m_fileName, |
|
194 d->m_commandLineArgs.join(QString(QLatin1Char(' '))), |
|
195 d->m_copyState.sourceFileName, d->m_copyState.destinationFileName, d->m_installFileName); |
194 logMessage(msg); |
196 logMessage(msg); |
195 } |
197 } |
196 if (d->m_startupActions & ActionCopy) { |
198 if (d->m_startupActions & ActionCopy) { |
197 if (d->m_copyState.sourceFileName.isEmpty()) { |
199 if (d->m_copyState.sourceFileName.isEmpty()) { |
198 qWarning("No local filename given for copying package."); |
200 qWarning("No local filename given for copying package."); |
294 { |
296 { |
295 Q_UNUSED(result) |
297 Q_UNUSED(result) |
296 disconnectTrk(); |
298 disconnectTrk(); |
297 } |
299 } |
298 |
300 |
|
301 QString Launcher::msgStopped(uint pid, uint tid, uint address, const QString &why) |
|
302 { |
|
303 return QString::fromLatin1("Process %1, thread %2 stopped at 0x%3: %4"). |
|
304 arg(pid).arg(tid).arg(address, 0, 16). |
|
305 arg(why.isEmpty() ? QString::fromLatin1("<Unknown reason>") : why); |
|
306 } |
|
307 |
|
308 bool Launcher::parseNotifyStopped(const QByteArray &dataBA, |
|
309 uint *pid, uint *tid, uint *address, |
|
310 QString *why /* = 0 */) |
|
311 { |
|
312 if (why) |
|
313 why->clear(); |
|
314 *address = *pid = *tid = 0; |
|
315 if (dataBA.size() < 12) |
|
316 return false; |
|
317 const char *data = dataBA.data(); |
|
318 *address = extractInt(data); |
|
319 *pid = extractInt(data + 4); |
|
320 *tid = extractInt(data + 8); |
|
321 if (why && dataBA.size() >= 14) { |
|
322 const unsigned short len = extractShort(data + 12); |
|
323 if (len > 0) |
|
324 *why = QString::fromLatin1(data + 14, len); |
|
325 } |
|
326 return true; |
|
327 } |
|
328 |
299 void Launcher::handleResult(const TrkResult &result) |
329 void Launcher::handleResult(const TrkResult &result) |
300 { |
330 { |
301 QByteArray prefix = "READ BUF: "; |
331 QByteArray prefix = "READ BUF: "; |
302 QByteArray str = result.toString().toUtf8(); |
332 QByteArray str = result.toString().toUtf8(); |
303 if (result.isDebugOutput) { // handle application output |
333 if (result.isDebugOutput) { // handle application output |
313 //logMessage(prefix << "TOKEN: " << result.token); |
343 //logMessage(prefix << "TOKEN: " << result.token); |
314 logMessage(prefix + "ERROR: " + errorMessage(result.data.at(0))); |
344 logMessage(prefix + "ERROR: " + errorMessage(result.data.at(0))); |
315 break; |
345 break; |
316 } |
346 } |
317 case TrkNotifyStopped: { // Notified Stopped |
347 case TrkNotifyStopped: { // Notified Stopped |
318 logMessage(prefix + "NOTE: STOPPED " + str); |
|
319 // 90 01 78 6a 40 40 00 00 07 23 00 00 07 24 00 00 |
|
320 QString reason; |
348 QString reason; |
321 if (result.data.size() >= 14) { |
349 uint pc; |
322 uint pc = extractInt(result.data.mid(0,4).constData()); |
350 uint pid; |
323 uint pid = extractInt(result.data.mid(4,4).constData()); |
351 uint tid; |
324 uint tid = extractInt(result.data.mid(8,4).constData()); |
352 parseNotifyStopped(result.data, &pid, &tid, &pc, &reason); |
325 ushort len = extractShort(result.data.mid(12,2).constData()); |
353 logMessage(prefix + msgStopped(pid, tid, pc, reason)); |
326 if(len > 0) |
354 emit(processStopped(pc, pid, tid, reason)); |
327 reason = result.data.mid(14, len); |
|
328 emit(stopped(pc, pid, tid, reason)); |
|
329 } else { |
|
330 emit(stopped(0, 0, 0, reason)); |
|
331 } |
|
332 //const char *data = result.data.data(); |
|
333 // uint addr = extractInt(data); //code address: 4 bytes; code base address for the library |
|
334 // uint pid = extractInt(data + 4); // ProcessID: 4 bytes; |
|
335 // uint tid = extractInt(data + 8); // ThreadID: 4 bytes |
|
336 //logMessage(prefix << " ADDR: " << addr << " PID: " << pid << " TID: " << tid); |
|
337 d->m_device->sendTrkAck(result.token); |
355 d->m_device->sendTrkAck(result.token); |
338 break; |
356 break; |
339 } |
357 } |
340 case TrkNotifyException: { // Notify Exception (obsolete) |
358 case TrkNotifyException: { // Notify Exception (obsolete) |
341 logMessage(prefix + "NOTE: EXCEPTION " + str); |
359 logMessage(prefix + "NOTE: EXCEPTION " + str); |
679 } else { |
697 } else { |
680 disconnectTrk(); |
698 disconnectTrk(); |
681 } |
699 } |
682 } |
700 } |
683 |
701 |
684 void Launcher::startInferiorIfNeeded() |
702 QByteArray Launcher::startProcessMessage(const QString &executable, |
685 { |
703 const QStringList &arguments) |
686 emit startingApplication(); |
704 { |
687 if (d->m_session.pid != 0) { |
|
688 logMessage("Process already 'started'"); |
|
689 return; |
|
690 } |
|
691 // It's not started yet |
705 // It's not started yet |
692 QByteArray ba; |
706 QByteArray ba; |
693 appendShort(&ba, 0, TargetByteOrder); // create new process |
707 appendShort(&ba, 0, TargetByteOrder); // create new process |
694 appendByte(&ba, 0); // options - currently unused |
708 appendByte(&ba, 0); // options - currently unused |
695 |
709 if(arguments.isEmpty()) { |
696 if(d->m_commandLineArgs.isEmpty()) { |
710 appendString(&ba, executable.toLocal8Bit(), TargetByteOrder); |
697 appendString(&ba, d->m_fileName.toLocal8Bit(), TargetByteOrder); |
711 return ba; |
698 } else { |
712 } |
699 QByteArray ba2; |
713 // Append full command line as one string (leading length information). |
700 ba2.append(d->m_fileName.toLocal8Bit()); |
714 QByteArray commandLineBa; |
701 ba2.append('\0'); |
715 commandLineBa.append(executable.toLocal8Bit()); |
702 ba2.append(d->m_commandLineArgs.toLocal8Bit()); |
716 commandLineBa.append('\0'); |
703 appendString(&ba, ba2, TargetByteOrder); |
717 commandLineBa.append(arguments.join(QString(QLatin1Char(' '))).toLocal8Bit()); |
704 } |
718 appendString(&ba, commandLineBa, TargetByteOrder); |
705 d->m_device->sendTrkMessage(TrkCreateItem, TrkCallback(this, &Launcher::handleCreateProcess), ba); // Create Item |
719 return ba; |
706 } |
720 } |
707 |
721 |
708 void Launcher::resume(uint pid, uint tid) |
722 void Launcher::startInferiorIfNeeded() |
|
723 { |
|
724 emit startingApplication(); |
|
725 if (d->m_session.pid != 0) { |
|
726 logMessage("Process already 'started'"); |
|
727 return; |
|
728 } |
|
729 d->m_device->sendTrkMessage(TrkCreateItem, TrkCallback(this, &Launcher::handleCreateProcess), |
|
730 startProcessMessage(d->m_fileName, d->m_commandLineArgs)); // Create Item |
|
731 } |
|
732 |
|
733 void Launcher::resumeProcess(uint pid, uint tid) |
709 { |
734 { |
710 QByteArray ba; |
735 QByteArray ba; |
711 appendInt(&ba, pid, BigEndian); |
736 appendInt(&ba, pid, BigEndian); |
712 appendInt(&ba, tid, BigEndian); |
737 appendInt(&ba, tid, BigEndian); |
713 d->m_device->sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE"); |
738 d->m_device->sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE"); |