Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Tobias Hunger
qt-creator
Commits
1db44c05
Commit
1db44c05
authored
Oct 13, 2009
by
dt
Browse files
Merge branch '1.3' of git@scm.dev.nokia.troll.no:creator/mainline into 1.3
parents
ceaa92ec
b9cd3378
Changes
24
Hide whitespace changes
Inline
Side-by-side
share/qtcreator/gdbmacros/gdbmacros.cpp
View file @
1db44c05
...
...
@@ -1618,9 +1618,11 @@ static void qDumpQList(QDumper &d)
const
QListData
&
ldata
=
*
reinterpret_cast
<
const
QListData
*>
(
d
.
data
);
const
QListData
::
Data
*
pdata
=
*
reinterpret_cast
<
const
QListData
::
Data
*
const
*>
(
d
.
data
);
int
nn
=
ldata
.
size
();
const
int
nn
=
ldata
.
size
();
if
(
nn
<
0
)
return
;
const
bool
innerTypeIsPointer
=
isPointerType
(
d
.
innerType
);
const
int
n
=
qMin
(
nn
,
1000
);
if
(
nn
>
0
)
{
if
(
ldata
.
d
->
begin
<
0
)
return
;
...
...
@@ -1631,18 +1633,19 @@ static void qDumpQList(QDumper &d)
return
;
#endif
qCheckAccess
(
ldata
.
d
->
array
);
//qCheckAccess(ldata.d->array[0]);
//qCheckAccess(ldata.d->array[nn - 1]);
// Additional checks on pointer arrays
if
(
innerTypeIsPointer
)
for
(
int
i
=
0
;
i
!=
n
;
++
i
)
if
(
const
void
*
p
=
ldata
.
d
->
array
+
i
+
pdata
->
begin
)
qCheckAccess
(
deref
(
p
));
}
qCheckAccess
(
pdata
);
int
n
=
nn
;
d
.
putItemCount
(
"value"
,
n
);
d
.
putItem
(
"valueeditable"
,
"false"
);
d
.
putItem
(
"numchild"
,
n
);
if
(
d
.
dumpChildren
)
{
unsigned
innerSize
=
d
.
extraInt
[
0
];
bool
innerTypeIsPointer
=
isPointerType
(
d
.
innerType
);
const
unsigned
innerSize
=
d
.
extraInt
[
0
];
QByteArray
strippedInnerType
=
stripPointerType
(
d
.
innerType
);
// The exact condition here is:
...
...
@@ -1653,8 +1656,6 @@ static void qDumpQList(QDumper &d)
bool
isInternal
=
innerSize
<=
int
(
sizeof
(
void
*
))
&&
isMovableType
(
d
.
innerType
);
d
.
putItem
(
"internal"
,
(
int
)
isInternal
);
if
(
n
>
1000
)
n
=
1000
;
d
.
beginChildren
(
n
?
d
.
innerType
:
0
);
for
(
int
i
=
0
;
i
!=
n
;
++
i
)
{
d
.
beginHash
();
...
...
@@ -2917,23 +2918,21 @@ static void qDumpQVector(QDumper &d)
int
nn
=
v
->
size
;
if
(
nn
<
0
)
return
;
if
(
nn
>
0
)
{
//qCheckAccess(&vec.front());
//qCheckAccess(&vec.back());
}
const
bool
innerIsPointerType
=
isPointerType
(
d
.
innerType
);
const
unsigned
innersize
=
d
.
extraInt
[
0
];
const
int
n
=
qMin
(
nn
,
1000
);
// Check pointers
if
(
innerIsPointerType
&&
nn
>
0
)
for
(
int
i
=
0
;
i
!=
n
;
++
i
)
if
(
const
void
*
p
=
addOffset
(
v
,
i
*
innersize
+
typeddatasize
))
qCheckAccess
(
deref
(
p
));
int
n
=
nn
;
d
.
putItemCount
(
"value"
,
n
);
d
.
putItem
(
"valueeditable"
,
"false"
);
d
.
putItem
(
"numchild"
,
n
);
if
(
d
.
dumpChildren
)
{
QByteArray
strippedInnerType
=
stripPointerType
(
d
.
innerType
);
const
char
*
stripped
=
isPointerType
(
d
.
innerType
)
?
strippedInnerType
.
data
()
:
0
;
if
(
n
>
1000
)
n
=
1000
;
const
char
*
stripped
=
innerIsPointerType
?
strippedInnerType
.
data
()
:
0
;
d
.
beginChildren
(
d
.
innerType
);
for
(
int
i
=
0
;
i
!=
n
;
++
i
)
{
d
.
beginHash
();
...
...
src/plugins/cpptools/cppfindreferences.cpp
View file @
1db44c05
...
...
@@ -166,12 +166,32 @@ protected:
return
false
;
}
bool
checkScope
(
Symbol
*
symbol
,
Symbol
*
otherSymbol
)
const
{
if
(
!
(
symbol
&&
otherSymbol
))
return
false
;
else
if
(
symbol
->
scope
()
==
otherSymbol
->
scope
())
return
true
;
else
if
(
symbol
->
name
()
&&
otherSymbol
->
name
())
{
if
(
!
symbol
->
name
()
->
isEqualTo
(
otherSymbol
->
name
()))
return
false
;
}
else
if
(
symbol
->
name
()
!=
otherSymbol
->
name
())
{
return
false
;
}
return
checkScope
(
symbol
->
enclosingSymbol
(),
otherSymbol
->
enclosingSymbol
());
}
bool
isDeclSymbol
(
Symbol
*
symbol
)
const
{
if
(
!
symbol
)
if
(
!
symbol
)
{
return
false
;
else
if
(
symbol
==
_declSymbol
)
{
}
else
if
(
symbol
==
_declSymbol
)
{
return
true
;
}
else
if
(
symbol
->
line
()
==
_declSymbol
->
line
()
&&
symbol
->
column
()
==
_declSymbol
->
column
())
{
...
...
@@ -180,11 +200,11 @@ protected:
}
else
if
(
symbol
->
isForwardClassDeclaration
()
&&
(
_declSymbol
->
isClass
()
||
_declSymbol
->
isForwardClassDeclaration
()))
{
return
true
;
return
checkScope
(
symbol
,
_declSymbol
)
;
}
else
if
(
_declSymbol
->
isForwardClassDeclaration
()
&&
(
symbol
->
isClass
()
||
symbol
->
isForwardClassDeclaration
()))
{
return
true
;
return
checkScope
(
symbol
,
_declSymbol
)
;
}
return
false
;
...
...
@@ -349,6 +369,20 @@ protected:
return
false
;
}
virtual
bool
visit
(
EnumeratorAST
*
ast
)
{
Identifier
*
id
=
identifier
(
ast
->
identifier_token
);
if
(
id
==
_id
)
{
LookupContext
context
=
currentContext
(
ast
);
const
QList
<
Symbol
*>
candidates
=
context
.
resolve
(
control
()
->
nameId
(
id
));
reportResult
(
ast
->
identifier_token
,
candidates
);
}
accept
(
ast
->
expression
);
return
false
;
}
virtual
bool
visit
(
SimpleNameAST
*
ast
)
{
Identifier
*
id
=
identifier
(
ast
->
identifier_token
);
...
...
src/plugins/cpptools/cppmodelmanager.cpp
View file @
1db44c05
...
...
@@ -727,7 +727,7 @@ QByteArray CppModelManager::internalDefinedMacros() const
return
macros
;
}
void
CppModelManager
::
setIncludesInPaths
(
const
QMap
<
QString
,
QStringList
>
includesInPaths
)
void
CppModelManager
::
setIncludesInPaths
(
const
QMap
<
QString
,
QStringList
>
&
includesInPaths
)
{
QMutexLocker
locker
(
&
mutex
);
QMapIterator
<
QString
,
QStringList
>
i
(
includesInPaths
);
...
...
@@ -1182,7 +1182,7 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
future
.
waitForResume
();
if
(
future
.
isCanceled
())
b
re
ak
;
re
turn
;
const
QString
path
=
paths
.
takeFirst
();
...
...
src/plugins/cpptools/cppmodelmanager.h
View file @
1db44c05
...
...
@@ -163,7 +163,7 @@ private:
QStringList
internalFrameworkPaths
()
const
;
QByteArray
internalDefinedMacros
()
const
;
void
setIncludesInPaths
(
const
QMap
<
QString
,
QStringList
>
includesInPaths
);
void
setIncludesInPaths
(
const
QMap
<
QString
,
QStringList
>
&
includesInPaths
);
static
void
updateIncludesInPaths
(
QFutureInterface
<
void
>
&
future
,
CppModelManager
*
manager
,
...
...
src/plugins/debugger/cdb/cdbdebugengine.cpp
View file @
1db44c05
...
...
@@ -37,6 +37,7 @@
#include
"cdbassembler.h"
#include
"cdboptionspage.h"
#include
"cdboptions.h"
#include
"cdbexceptionutils.h"
#include
"debuggeragents.h"
#include
"debuggeractions.h"
...
...
@@ -305,12 +306,14 @@ CdbDebugEnginePrivate::CdbDebugEnginePrivate(DebuggerManager *manager,
m_dumper
(
new
CdbDumperHelper
(
manager
,
&
m_cif
)),
m_currentThreadId
(
-
1
),
m_eventThreadId
(
-
1
),
m_interrupted
(
false
),
m_interruptArticifialThreadId
(
-
1
),
m_interrupted
(
false
),
m_watchTimer
(
-
1
),
m_debugEventCallBack
(
engine
),
m_engine
(
engine
),
m_currentStackTrace
(
0
),
m_firstActivatedFrame
(
true
),
m_inferiorStartupComplete
(
false
),
m_mode
(
AttachCore
)
{
}
...
...
@@ -447,7 +450,7 @@ void CdbDebugEnginePrivate::clearForRun()
qDebug
()
<<
Q_FUNC_INFO
;
m_breakEventMode
=
BreakEventHandle
;
m_eventThreadId
=
-
1
;
m_eventThreadId
=
m_interruptArticifialThreadId
=
-
1
;
m_interrupted
=
false
;
cleanStackTrace
();
}
...
...
@@ -619,6 +622,8 @@ void CdbDebugEnginePrivate::checkVersion()
void
CdbDebugEngine
::
startDebugger
(
const
QSharedPointer
<
DebuggerStartParameters
>
&
sp
)
{
if
(
debugCDBExecution
)
qDebug
()
<<
"startDebugger"
<<
*
sp
;
setState
(
AdapterStarting
,
Q_FUNC_INFO
,
__LINE__
);
m_d
->
checkVersion
();
if
(
m_d
->
m_hDebuggeeProcess
)
{
...
...
@@ -627,6 +632,7 @@ void CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters>
emit
startFailed
();
}
m_d
->
clearDisplay
();
m_d
->
m_inferiorStartupComplete
=
false
;
setState
(
AdapterStarted
,
Q_FUNC_INFO
,
__LINE__
);
setState
(
InferiorPreparing
,
Q_FUNC_INFO
,
__LINE__
);
...
...
@@ -699,10 +705,11 @@ bool CdbDebugEngine::startAttachDebugger(qint64 pid, DebuggerStartMode sm, QStri
{
// Need to attrach invasively, otherwise, no notification signals
// for for CreateProcess/ExitProcess occur.
const
ULONG
flags
=
DEBUG_ATTACH_INVASIVE_RESUME_PROCESS
;
// As of version 6.11, the initial breakpoint suppression has no effect (see notifyException).
const
ULONG
flags
=
DEBUG_ATTACH_INVASIVE_RESUME_PROCESS
|
DEBUG_ATTACH_INVASIVE_NO_INITIAL_BREAK
;
const
HRESULT
hr
=
m_d
->
m_cif
.
debugClient
->
AttachProcess
(
NULL
,
pid
,
flags
);
if
(
debugCDB
)
qDebug
()
<<
"Attaching to "
<<
pid
<<
" returns "
<<
hr
<<
executionStatusString
(
m_d
->
m_cif
.
debugControl
);
qDebug
()
<<
"Attaching to "
<<
pid
<<
"
using flags"
<<
flags
<<
"
returns "
<<
hr
<<
executionStatusString
(
m_d
->
m_cif
.
debugControl
);
if
(
FAILED
(
hr
))
{
*
errorMessage
=
tr
(
"Attaching to a process failed for process id %1: %2"
).
arg
(
pid
).
arg
(
msgDebugEngineComResult
(
hr
));
return
false
;
...
...
@@ -771,7 +778,7 @@ bool CdbDebugEngine::startDebuggerWithExecutable(DebuggerStartMode sm, QString *
}
void
CdbDebugEnginePrivate
::
processCreatedAttached
(
ULONG64
processHandle
,
ULONG64
initialThreadHandle
)
{
{
m_engine
->
setState
(
InferiorRunningRequested
,
Q_FUNC_INFO
,
__LINE__
);
setDebuggeeHandles
(
reinterpret_cast
<
HANDLE
>
(
processHandle
),
reinterpret_cast
<
HANDLE
>
(
initialThreadHandle
));
ULONG
currentThreadId
;
...
...
@@ -782,8 +789,11 @@ void CdbDebugEnginePrivate::processCreatedAttached(ULONG64 processHandle, ULONG6
}
// Clear any saved breakpoints and set initial breakpoints
m_engine
->
executeDebuggerCommand
(
QLatin1String
(
"bc"
));
if
(
manager
()
->
breakHandler
()
->
hasPendingBreakpoints
())
if
(
manager
()
->
breakHandler
()
->
hasPendingBreakpoints
())
{
if
(
debugCDBExecution
)
qDebug
()
<<
"processCreatedAttached: Syncing breakpoints"
;
m_engine
->
attemptBreakpointSynchronization
();
}
// Attaching to crashed: This handshake (signalling an event) is required for
// the exception to be delivered to the debugger
if
(
m_mode
==
AttachCrashedExternal
)
{
...
...
@@ -796,8 +806,8 @@ void CdbDebugEnginePrivate::processCreatedAttached(ULONG64 processHandle, ULONG6
}
}
m_engine
->
setState
(
InferiorRunning
,
Q_FUNC_INFO
,
__LINE__
);
if
(
debugCDB
)
qDebug
()
<<
Q_FUNC_INFO
<<
'\n'
<<
executionStatusString
(
m_cif
.
debugControl
);
if
(
debugCDB
Execution
)
qDebug
()
<<
"<processCreatedAttached"
<<
executionStatusString
(
m_cif
.
debugControl
);
}
void
CdbDebugEngine
::
processTerminated
(
unsigned
long
exitCode
)
...
...
@@ -1018,8 +1028,8 @@ static inline QString msgStepFailed(unsigned long executionStatus, int threadId,
// its reverse equivalents in the case of single threads.
bool
CdbDebugEngine
::
step
(
unsigned
long
executionStatus
)
{
if
(
debugCDB
)
qDebug
()
<<
Q_FUNC_INFO
<<
executionStatus
<<
"curr "
<<
m_d
->
m_currentThreadId
<<
" evt "
<<
m_d
->
m_eventThreadId
;
if
(
debugCDB
Execution
)
qDebug
()
<<
">step"
<<
executionStatus
<<
"curr "
<<
m_d
->
m_currentThreadId
<<
" evt "
<<
m_d
->
m_eventThreadId
;
// State of reverse stepping as of 10/2009 (Debugging tools 6.11@404):
// The constants exist, but invoking the calls leads to E_NOINTERFACE.
...
...
@@ -1029,6 +1039,12 @@ bool CdbDebugEngine::step(unsigned long executionStatus)
return
false
;
}
// Do not step the artifical thread created to interrupt the debuggee.
if
(
m_d
->
m_interrupted
&&
m_d
->
m_currentThreadId
==
m_d
->
m_interruptArticifialThreadId
)
{
warning
(
tr
(
"Thread %1 cannot be stepped."
).
arg
(
m_d
->
m_currentThreadId
));
return
false
;
}
// SetExecutionStatus() continues the thread that triggered the
// stop event (~# p). This can be confusing if the user is looking
// at the stack trace of another thread and wants to step that one. If that
...
...
@@ -1067,6 +1083,8 @@ bool CdbDebugEngine::step(unsigned long executionStatus)
}
else
{
setState
(
InferiorStopped
,
Q_FUNC_INFO
,
__LINE__
);
}
if
(
debugCDBExecution
)
qDebug
()
<<
"<step samethread"
<<
sameThread
<<
"succeeded"
<<
success
;
return
success
;
}
...
...
@@ -1092,8 +1110,8 @@ void CdbDebugEngine::nextIExec()
void
CdbDebugEngine
::
stepOutExec
()
{
if
(
debugCDB
)
qDebug
()
<<
Q_FUNC_INFO
;
if
(
debugCDB
Execution
)
qDebug
()
<<
"stepOutExec"
;
// emulate gdb 'exec-finish' (exec until return of current function)
// by running up to address of the above stack frame (mostly works).
const
StackHandler
*
sh
=
manager
()
->
stackHandler
();
...
...
@@ -1142,8 +1160,8 @@ void CdbDebugEngine::continueInferior()
// Continue process without notifications
bool
CdbDebugEnginePrivate
::
continueInferiorProcess
(
QString
*
errorMessagePtr
/* = 0 */
)
{
if
(
debugCDB
)
qDebug
()
<<
Q_FUNC_INFO
;
if
(
debugCDB
Execution
)
qDebug
()
<<
"continueInferiorProcess"
;
const
HRESULT
hr
=
m_cif
.
debugControl
->
SetExecutionStatus
(
DEBUG_STATUS_GO
);
if
(
FAILED
(
hr
))
{
const
QString
errorMessage
=
msgComFailed
(
"SetExecutionStatus"
,
hr
);
...
...
@@ -1198,11 +1216,12 @@ bool CdbDebugEnginePrivate::continueInferior(QString *errorMessage)
bool
CdbDebugEnginePrivate
::
interruptInterferiorProcess
(
QString
*
errorMessage
)
{
// Interrupt the interferior process without notifications
if
(
debugCDB
)
{
if
(
debugCDB
Execution
)
{
ULONG
executionStatus
;
getExecutionStatus
(
m_cif
.
debugControl
,
&
executionStatus
,
errorMessage
);
qDebug
()
<<
Q_FUNC_INFO
<<
"
\n
ex="
<<
executionStatus
;
qDebug
()
<<
"interruptInterferiorProcess
ex="
<<
executionStatus
;
}
if
(
DebugBreakProcess
(
m_hDebuggeeProcess
))
{
...
...
@@ -1218,6 +1237,7 @@ bool CdbDebugEnginePrivate::interruptInterferiorProcess(QString *errorMessage)
arg(getInterruptTimeOutSecs(m_cif.debugControl)).arg(msgComFailed("SetInterrupt", hr));
return false;
}
m_interrupted = true;
#endif
return
true
;
}
...
...
@@ -1646,10 +1666,27 @@ void CdbDebugEngine::warning(const QString &w)
qWarning
(
"%s
\n
"
,
qPrintable
(
w
));
}
void
CdbDebugEnginePrivate
::
notify
Crashed
(
)
void
CdbDebugEnginePrivate
::
notify
Exception
(
long
code
,
bool
fatal
)
{
if
(
debugCDBExecution
)
qDebug
()
<<
"notifyException code"
<<
code
<<
" fatal="
<<
fatal
;
// Suppress the initial breakpoint that occurs when
// attaching (If a breakpoint is encountered before startup
// is complete).
switch
(
code
)
{
case
winExceptionStartupCompleteTrap
:
m_inferiorStartupComplete
=
true
;
break
;
case
EXCEPTION_BREAKPOINT
:
if
(
!
m_inferiorStartupComplete
&&
m_breakEventMode
==
BreakEventHandle
)
{
manager
()
->
showDebuggerOutput
(
LogMisc
,
CdbDebugEngine
::
tr
(
"Ignoring initial breakpoint..."
));
m_breakEventMode
=
BreakEventIgnoreOnce
;
}
break
;
}
// Cannot go over crash point to execute calls.
m_dumper
->
disable
();
if
(
fatal
)
m_dumper
->
disable
();
}
static
int
threadIndexById
(
const
ThreadsHandler
*
threadsHandler
,
int
id
)
...
...
@@ -1664,10 +1701,10 @@ static int threadIndexById(const ThreadsHandler *threadsHandler, int id)
void
CdbDebugEnginePrivate
::
handleDebugEvent
()
{
if
(
debugCDB
)
qDebug
()
<<
Q_FUNC_INFO
<<
'\n'
<<
m_hDebuggeeProcess
<<
m_breakEventMode
<<
executionStatusString
(
m_cif
.
debugControl
)
;
if
(
debugCDB
Execution
)
qDebug
()
<<
"handleDebugEvent mode "
<<
m_breakEventMode
<<
executionStatusString
(
m_cif
.
debugControl
)
<<
" interrupt"
<<
m_interrupted
<<
" startupcomplete"
<<
m_inferiorStartupComplete
;
// restore mode and do special handling
const
HandleBreakEventMode
mode
=
m_breakEventMode
;
m_breakEventMode
=
BreakEventHandle
;
...
...
@@ -1679,9 +1716,27 @@ void CdbDebugEnginePrivate::handleDebugEvent()
if
(
m_engine
->
state
()
!=
InferiorStopping
)
m_engine
->
setState
(
InferiorStopping
,
Q_FUNC_INFO
,
__LINE__
);
m_engine
->
setState
(
InferiorStopped
,
Q_FUNC_INFO
,
__LINE__
);
m_eventThreadId
=
m_currentThreadId
=
updateThreadList
();
manager
()
->
showDebuggerOutput
(
LogMisc
,
CdbDebugEngine
::
tr
(
"Stopped, current thread: %1"
).
arg
(
m_currentThreadId
));
m_eventThreadId
=
updateThreadList
();
m_interruptArticifialThreadId
=
m_interrupted
?
m_eventThreadId
:
-
1
;
// Get thread to stop and its index. If avoidable, do not use
// the artifical thread that is created when interrupting,
// use the oldest thread 0 instead.
ThreadsHandler
*
threadsHandler
=
manager
()
->
threadsHandler
();
m_currentThreadId
=
m_interrupted
?
0
:
m_eventThreadId
;
int
currentThreadIndex
=
-
1
;
m_currentThreadId
=
-
1
;
if
(
m_interrupted
)
{
m_currentThreadId
=
0
;
currentThreadIndex
=
threadIndexById
(
threadsHandler
,
m_currentThreadId
);
}
if
(
!
m_interrupted
||
currentThreadIndex
==
-
1
)
{
m_currentThreadId
=
m_eventThreadId
;
currentThreadIndex
=
threadIndexById
(
threadsHandler
,
m_currentThreadId
);
}
const
QString
msg
=
m_interrupted
?
CdbDebugEngine
::
tr
(
"Interrupted in thread %1, current thread: %2"
).
arg
(
m_interruptArticifialThreadId
).
arg
(
m_currentThreadId
)
:
CdbDebugEngine
::
tr
(
"Stopped, current thread: %1"
).
arg
(
m_currentThreadId
);
manager
()
->
showDebuggerOutput
(
LogMisc
,
msg
);
const
int
threadIndex
=
threadIndexById
(
threadsHandler
,
m_currentThreadId
);
if
(
threadIndex
!=
-
1
)
threadsHandler
->
setCurrentThread
(
threadIndex
);
...
...
@@ -1690,8 +1745,10 @@ void CdbDebugEnginePrivate::handleDebugEvent()
break
;
case
BreakEventIgnoreOnce
:
m_engine
->
startWatchTimer
();
m_interrupted
=
false
;
break
;
case
BreakEventSyncBreakPoints
:
{
m_interrupted
=
false
;
// Temp stop to sync breakpoints
QString
errorMessage
;
attemptBreakpointSynchronization
(
&
errorMessage
);
...
...
@@ -1764,9 +1821,12 @@ static inline unsigned long dumperThreadId(const QList<StackFrame> &frames,
return
CdbDumperHelper
::
InvalidDumperCallThread
;
const
int
waitCheckDepth
=
qMin
(
frames
.
size
(),
5
);
static
const
QString
waitForPrefix
=
QLatin1String
(
CdbStackTraceContext
::
winFuncWaitForPrefix
);
for
(
int
f
=
0
;
f
<
waitCheckDepth
;
f
++
)
if
(
frames
.
at
(
f
).
function
.
startsWith
(
waitForPrefix
))
static
const
QString
msgWaitForPrefix
=
QLatin1String
(
CdbStackTraceContext
::
winFuncMsgWaitForPrefix
);
for
(
int
f
=
0
;
f
<
waitCheckDepth
;
f
++
)
{
const
QString
&
function
=
frames
.
at
(
f
).
function
;
if
(
function
.
startsWith
(
waitForPrefix
)
||
function
.
startsWith
(
msgWaitForPrefix
))
return
CdbDumperHelper
::
InvalidDumperCallThread
;
}
return
currentThread
;
}
...
...
@@ -1812,7 +1872,7 @@ void CdbDebugEnginePrivate::updateStackTrace()
}
// Set up dumper with a thread (or invalid)
const
unsigned
long
dumperThread
=
dumperThreadId
(
stackFrames
,
m_currentThreadId
);
if
(
debugCDB
)
if
(
debugCDB
Execution
)
qDebug
()
<<
"updateStackTrace() current: "
<<
m_currentThreadId
<<
" dumper="
<<
dumperThread
;
m_dumper
->
setDumperCallThread
(
dumperThread
);
// Display frames
...
...
@@ -1824,6 +1884,10 @@ void CdbDebugEnginePrivate::updateStackTrace()
if
(
m_dumper
->
isEnabled
()
&&
m_dumper
->
state
()
!=
CdbDumperHelper
::
Initialized
)
QApplication
::
processEvents
(
QEventLoop
::
ExcludeUserInputEvents
);
m_engine
->
activateFrame
(
current
);
}
else
{
// Clean out variables
manager
()
->
watchHandler
()
->
beginCycle
();
manager
()
->
watchHandler
()
->
endCycle
();
}
manager
()
->
watchHandler
()
->
updateWatchers
();
}
...
...
src/plugins/debugger/cdb/cdbdebugengine_p.h
View file @
1db44c05
...
...
@@ -135,7 +135,7 @@ struct CdbDebugEnginePrivate
bool
executeContinueCommand
(
const
QString
&
command
);
bool
attemptBreakpointSynchronization
(
QString
*
errorMessage
);
void
notify
Crashed
(
);
void
notify
Exception
(
long
code
,
bool
fatal
);
enum
EndInferiorAction
{
DetachInferior
,
TerminateInferior
};
bool
endInferior
(
EndInferiorAction
a
,
QString
*
errorMessage
);
...
...
@@ -157,9 +157,10 @@ struct CdbDebugEnginePrivate
const
QSharedPointer
<
CdbOptions
>
m_options
;
HANDLE
m_hDebuggeeProcess
;
HANDLE
m_hDebuggeeThread
;
bool
m_interrupted
;
bool
m_interrupted
;
int
m_currentThreadId
;
int
m_eventThreadId
;
int
m_interruptArticifialThreadId
;
HandleBreakEventMode
m_breakEventMode
;
int
m_watchTimer
;
...
...
@@ -175,6 +176,7 @@ struct CdbDebugEnginePrivate
EditorToolTipCache
m_editorToolTipCache
;
bool
m_firstActivatedFrame
;
bool
m_inferiorStartupComplete
;
DebuggerStartMode
m_mode
;
Utils
::
ConsoleProcess
m_consoleStubProc
;
...
...
@@ -192,6 +194,7 @@ QString msgDebugEngineComResult(HRESULT hr);
QString
msgComFailed
(
const
char
*
func
,
HRESULT
hr
);
enum
{
debugCDB
=
0
};
enum
{
debugCDBExecution
=
0
};
enum
{
debugCDBWatchHandling
=
0
};
}
// namespace Internal
...
...
src/plugins/debugger/cdb/cdbdebugeventcallback.cpp
View file @
1db44c05
...
...
@@ -35,6 +35,7 @@
#include
<QtCore/QDebug>
#include
<QtCore/QTextStream>
#include
<QtCore/QCoreApplication>
namespace
Debugger
{
namespace
Internal
{
...
...
@@ -249,8 +250,7 @@ STDMETHODIMP CdbDebugEventCallback::Exception(
qDebug
()
<<
Q_FUNC_INFO
<<
"
\n
ex="
<<
Exception
->
ExceptionCode
<<
" fatal="
<<
fatal
<<
msg
;
m_pEngine
->
manager
()
->
showApplicationOutput
(
msg
);
m_pEngine
->
manager
()
->
showDebuggerOutput
(
LogMisc
,
msg
);
if
(
fatal
)
m_pEngine
->
m_d
->
notifyCrashed
();
m_pEngine
->
m_d
->
notifyException
(
Exception
->
ExceptionCode
,
fatal
);
return
S_OK
;
}
...
...
@@ -373,8 +373,11 @@ STDMETHODIMP CdbDebugEventCallback::SystemError(
}
// -----------ExceptionLoggerEventCallback
CdbExceptionLoggerEventCallback
::
CdbExceptionLoggerEventCallback
(
int
logChannel
,
DebuggerManager
*
manager
)
:
CdbExceptionLoggerEventCallback
::
CdbExceptionLoggerEventCallback
(
int
logChannel
,
bool
skipNonFatalExceptions
,
DebuggerManager
*
manager
)
:
m_logChannel
(
logChannel
),
m_skipNonFatalExceptions
(
skipNonFatalExceptions
),
m_manager
(
manager
)
{
}
...
...
@@ -391,15 +394,18 @@ STDMETHODIMP CdbExceptionLoggerEventCallback::Exception(
__in
ULONG
/* FirstChance */
)
{
m_exceptionCodes
.
push_back
(
Exception
->
ExceptionCode
);
m_exceptionMessages
.
push_back
(
QString
());
{
QTextStream
str
(
&
m_exceptionMessages
.
back
());
formatException
(
Exception
,
str
);
const
bool
recordException
=
!
m_skipNonFatalExceptions
||
isFatalException
(
Exception
->
ExceptionCode
);
QString
message
;
formatException
(
Exception
,
QTextStream
(
&
message
));
if
(
recordException
)
{
m_exceptionCodes
.
push_back
(
Exception
->
ExceptionCode
);
m_exceptionMessages
.
push_back
(
message
);
}
if
(
debugCDB
)
qDebug
()
<<
Q_FUNC_INFO
<<
'\n'
<<
m_exceptionMessages
.
back
();
m_manager
->
showDebuggerOutput
(
m_logChannel
,
m_exceptionMessages
.
back
());
qDebug
()
<<
Q_FUNC_INFO
<<
'\n'
<<
message
;
m_manager
->
showDebuggerOutput
(
m_logChannel
,
message
);
if
(
recordException
)
QCoreApplication
::
processEvents
(
QEventLoop
::
ExcludeUserInputEvents
);
return
S_OK
;
}
...
...
src/plugins/debugger/cdb/cdbdebugeventcallback.h
View file @
1db44c05
...
...
@@ -242,7 +242,9 @@ private:
class
CdbExceptionLoggerEventCallback
:
public
CdbDebugEventCallbackBase
{
public:
CdbExceptionLoggerEventCallback
(
int
logChannel
,
DebuggerManager
*
access
);
CdbExceptionLoggerEventCallback
(
int
logChannel
,
bool
skipNonFatalExceptions
,
DebuggerManager
*
access
);
STDMETHOD
(
GetInterestMask
)(
THIS_
...
...
@@ -261,6 +263,7 @@ public:
private:
const
int
m_logChannel
;
const
bool
m_skipNonFatalExceptions
;
DebuggerManager
*
m_manager
;
QList
<
ULONG
>
m_exceptionCodes
;
QStringList
m_exceptionMessages
;
...
...
src/plugins/debugger/cdb/cdbdumperhelper.cpp
View file @
1db44c05
...
...
@@ -144,13 +144,14 @@ static bool createDebuggeeAscIIString(CdbComInterfaces *cif,
// make sense for Qt apps.
static
bool
debuggeeLoadLibrary
(
DebuggerManager
*
manager
,
CdbComInterfaces
*
cif
,
unsigned
long
threadId
,
const
QString
&
moduleName
,
QString
*
errorMessage
)
{
if
(
loadDebug
>
1
)
qDebug
()
<<
Q_FUNC_INFO
<<
moduleName
;
// Try to ignore the breakpoints
CdbExceptionLoggerEventCallback
exLogger
(
LogWarning
,
manager
);
// Try to ignore the breakpoints
, skip stray startup-complete trap exceptions
CdbExceptionLoggerEventCallback
exLogger
(
LogWarning
,
true
,
manager
);
EventCallbackRedirector
eventRedir
(
cif
->
debugClient
,
&
exLogger
);
// Make a call to LoadLibraryA. First, reserve memory in debugger
// and copy name over.
...
...
@@ -178,7 +179,9 @@ static bool debuggeeLoadLibrary(DebuggerManager *manager,
if
(
!
CdbDebugEnginePrivate
::
executeDebuggerCommand
(
cif
->
debugControl
,
callCmd
,
errorMessage
))
return
false
;
// Execute current thread. This will hit a breakpoint.
if
(
!
CdbDebugEnginePrivate
::
executeDebuggerCommand