diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index 1da444113ea1f44d557d3ede56bffbf4cb2d6d55..ae006133509ba18acab7a459ae1d0ea56d50fa1e 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -68,6 +68,7 @@ int qtGhVersion = QT_VERSION; #include <ctype.h> #include <stdio.h> +#include <unistd.h> #ifdef Q_OS_WIN # include <windows.h> @@ -2484,6 +2485,7 @@ void qDumpObjectData440( int extraInt2, int extraInt3) { + //sleep(20); if (protocolVersion == 1) { QDumper d; d.protocolVersion = protocolVersion; diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index c8336c101c36b93f7b34a8fc5c15bbbe173c6836..8a5398f01fe1039f9d2e2fb3d89b4383ff2fd8fa 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -3586,121 +3586,121 @@ void GdbEngine::handleDumpCustomValue2(const GdbResultRecord &record, void GdbEngine::updateLocals() { -setTokenBarrier(); + setTokenBarrier(); -m_pendingRequests = 0; -PENDING_DEBUG("\nRESET PENDING"); -m_toolTipCache.clear(); -m_toolTipExpression.clear(); -qq->watchHandler()->reinitializeWatchers(); + m_pendingRequests = 0; + PENDING_DEBUG("\nRESET PENDING"); + m_toolTipCache.clear(); + m_toolTipExpression.clear(); + qq->watchHandler()->reinitializeWatchers(); -int level = currentFrame(); -// '2' is 'list with type and value' -QString cmd = QString("-stack-list-arguments 2 %1 %2").arg(level).arg(level); -sendSynchronizedCommand(cmd, StackListArguments); // stage 1/2 -// '2' is 'list with type and value' -sendSynchronizedCommand("-stack-list-locals 2", StackListLocals); // stage 2/2 + int level = currentFrame(); + // '2' is 'list with type and value' + QString cmd = QString("-stack-list-arguments 2 %1 %2").arg(level).arg(level); + sendSynchronizedCommand(cmd, StackListArguments); // stage 1/2 + // '2' is 'list with type and value' + sendSynchronizedCommand("-stack-list-locals 2", StackListLocals); // stage 2/2 } void GdbEngine::handleStackListArguments(const GdbResultRecord &record) { -// stage 1/2 - -// Linux: -// 12^done,stack-args= -// [frame={level="0",args=[ -// {name="argc",type="int",value="1"}, -// {name="argv",type="char **",value="(char **) 0x7..."}]}] -// Mac: -// 78^done,stack-args= -// {frame={level="0",args={ -// varobj= -// {exp="this",value="0x38a2fab0",name="var21",numchild="3", -// type="CurrentDocumentFind * const",typecode="PTR", -// dynamic_type="",in_scope="true",block_start_addr="0x3938e946", -// block_end_addr="0x3938eb2d"}, -// varobj= -// {exp="before",value="@0xbfffb9f8: {d = 0x3a7f2a70}", -// name="var22",numchild="1",type="const QString ...} }}} -// -// In both cases, iterating over the children of stack-args/frame/args -// is ok. -m_currentFunctionArgs.clear(); -if (record.resultClass == GdbResultDone) { - const GdbMi list = record.data.findChild("stack-args"); - const GdbMi frame = list.findChild("frame"); - const GdbMi args = frame.findChild("args"); - m_currentFunctionArgs = args.children(); -} else if (record.resultClass == GdbResultError) { - qDebug() << "FIXME: GdbEngine::handleStackListArguments: should not happen"; -} + // stage 1/2 + + // Linux: + // 12^done,stack-args= + // [frame={level="0",args=[ + // {name="argc",type="int",value="1"}, + // {name="argv",type="char **",value="(char **) 0x7..."}]}] + // Mac: + // 78^done,stack-args= + // {frame={level="0",args={ + // varobj= + // {exp="this",value="0x38a2fab0",name="var21",numchild="3", + // type="CurrentDocumentFind * const",typecode="PTR", + // dynamic_type="",in_scope="true",block_start_addr="0x3938e946", + // block_end_addr="0x3938eb2d"}, + // varobj= + // {exp="before",value="@0xbfffb9f8: {d = 0x3a7f2a70}", + // name="var22",numchild="1",type="const QString ...} }}} + // + // In both cases, iterating over the children of stack-args/frame/args + // is ok. + m_currentFunctionArgs.clear(); + if (record.resultClass == GdbResultDone) { + const GdbMi list = record.data.findChild("stack-args"); + const GdbMi frame = list.findChild("frame"); + const GdbMi args = frame.findChild("args"); + m_currentFunctionArgs = args.children(); + } else if (record.resultClass == GdbResultError) { + qDebug() << "FIXME: GdbEngine::handleStackListArguments: should not happen"; + } } void GdbEngine::handleStackListLocals(const GdbResultRecord &record) { -// stage 2/2 + // stage 2/2 -// There could be shadowed variables -QList<GdbMi> locals = record.data.findChild("locals").children(); -locals += m_currentFunctionArgs; + // There could be shadowed variables + QList<GdbMi> locals = record.data.findChild("locals").children(); + locals += m_currentFunctionArgs; -setLocals(locals); + setLocals(locals); } void GdbEngine::setLocals(const QList<GdbMi> &locals) { -//qDebug() << m_varToType; -QHash<QString, int> seen; - -foreach (const GdbMi &item, locals) { - // Local variables of inlined code are reported as - // 26^done,locals={varobj={exp="this",value="",name="var4",exp="this", - // numchild="1",type="const QtSharedPointer::Basic<CPlusPlus::..." - // We do not want these at all. Current hypotheses is that those - // "spurious" locals have _two_ "exp" field. Try to filter them: - #ifdef Q_OS_MAC - int numExps = 0; - foreach (const GdbMi &child, item.children()) - numExps += int(child.name() == "exp"); - if (numExps > 1) - continue; - QString name = item.findChild("exp").data(); - #else - QString name = item.findChild("name").data(); - #endif - int n = seen.value(name); - if (n) { - seen[name] = n + 1; - WatchData data; - data.iname = "local." + name + QString::number(n + 1); - data.name = name + QString(" <shadowed %1>").arg(n); - //data.setValue("<shadowed>"); - setWatchDataValue(data, item.findChild("value")); - data.setType("<shadowed>"); - data.setChildCount(0); - insertData(data); - } else { - seen[name] = 1; - WatchData data; - data.iname = "local." + name; - data.name = name; - data.exp = name; - data.framekey = m_currentFrame + data.name; - setWatchDataType(data, item.findChild("type")); - // set value only directly if it is simple enough, otherwise - // pass through the insertData() machinery - if (isIntOrFloatType(data.type) || isPointerType(data.type)) + //qDebug() << m_varToType; + QHash<QString, int> seen; + + foreach (const GdbMi &item, locals) { + // Local variables of inlined code are reported as + // 26^done,locals={varobj={exp="this",value="",name="var4",exp="this", + // numchild="1",type="const QtSharedPointer::Basic<CPlusPlus::..." + // We do not want these at all. Current hypotheses is that those + // "spurious" locals have _two_ "exp" field. Try to filter them: + #ifdef Q_OS_MAC + int numExps = 0; + foreach (const GdbMi &child, item.children()) + numExps += int(child.name() == "exp"); + if (numExps > 1) + continue; + QString name = item.findChild("exp").data(); + #else + QString name = item.findChild("name").data(); + #endif + int n = seen.value(name); + if (n) { + seen[name] = n + 1; + WatchData data; + data.iname = "local." + name + QString::number(n + 1); + data.name = name + QString(" <shadowed %1>").arg(n); + //data.setValue("<shadowed>"); setWatchDataValue(data, item.findChild("value")); - if (!qq->watchHandler()->isExpandedIName(data.iname)) - data.setChildrenUnneeded(); - if (isPointerType(data.type) || data.name == "this") - data.setChildCount(1); - if (0 && m_varToType.contains(data.framekey)) { - qDebug() << "RE-USING " << m_varToType.value(data.framekey); - data.setType(m_varToType.value(data.framekey)); + data.setType("<shadowed>"); + data.setChildCount(0); + insertData(data); + } else { + seen[name] = 1; + WatchData data; + data.iname = "local." + name; + data.name = name; + data.exp = name; + data.framekey = m_currentFrame + data.name; + setWatchDataType(data, item.findChild("type")); + // set value only directly if it is simple enough, otherwise + // pass through the insertData() machinery + if (isIntOrFloatType(data.type) || isPointerType(data.type)) + setWatchDataValue(data, item.findChild("value")); + if (!qq->watchHandler()->isExpandedIName(data.iname)) + data.setChildrenUnneeded(); + if (isPointerType(data.type) || data.name == "this") + data.setChildCount(1); + if (0 && m_varToType.contains(data.framekey)) { + qDebug() << "RE-USING " << m_varToType.value(data.framekey); + data.setType(m_varToType.value(data.framekey)); + } + insertData(data); } - insertData(data); - } } } diff --git a/src/plugins/debugger/procinterrupt.cpp b/src/plugins/debugger/procinterrupt.cpp index 08f7d39280584c9e0680e4a31e2ee63a27de3ef8..824ccac41f1b22034f13b8b9ecbf29dedd32f0a7 100644 --- a/src/plugins/debugger/procinterrupt.cpp +++ b/src/plugins/debugger/procinterrupt.cpp @@ -161,7 +161,7 @@ bool Debugger::Internal::interruptProcess(int pID) #else int procId = pID; if (procId != -1) { - if (kill(procId, 2) == 0) + if (kill(procId, SIGINT) == 0) return true; }