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
7ad54e63
Commit
7ad54e63
authored
Feb 13, 2009
by
hjk
Browse files
Fixes: debugger: start symbol is WinMainCRTStartup, not _start
sometimes...
parent
f867061d
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/plugins/debugger/gdbengine.cpp
View file @
7ad54e63
...
...
@@ -230,6 +230,15 @@ static bool isLeavableFunction(const QString &funcName, const QString &fileName)
return
false
;
}
static
QString
startSymbolName
()
{
#ifdef Q_OS_WIN
return
"WinMainCRTStartup"
;
#else
return
"_start"
;
#endif
}
///////////////////////////////////////////////////////////////////////
//
...
...
@@ -251,6 +260,7 @@ GdbEngine::~GdbEngine()
void
GdbEngine
::
init
()
{
m_pendingRequests
=
0
;
m_waitingForBreakpointSynchronizationToContinue
=
false
;
m_gdbVersion
=
100
;
m_outputCodec
=
QTextCodec
::
codecForLocale
();
m_dataDumperState
=
DataDumperUninitialized
;
...
...
@@ -650,7 +660,7 @@ void GdbEngine::maybeHandleInferiorPidChanged(const QString &pid0)
}
if
(
pid
==
q
->
m_attachedPID
)
return
;
//
qDebug() << "FOUND PID " << pid;
qDebug
()
<<
"FOUND PID "
<<
pid
;
q
->
m_attachedPID
=
pid
;
qq
->
notifyInferiorPidChanged
(
pid
);
}
...
...
@@ -750,8 +760,10 @@ void GdbEngine::handleResultRecord(const GdbResultRecord &record)
--
m_pendingRequests
;
PENDING_DEBUG
(
" TYPE "
<<
cmd
.
type
<<
" DECREMENTS PENDING TO: "
<<
m_pendingRequests
<<
cmd
.
command
);
if
(
m_pendingRequests
<=
0
)
if
(
m_pendingRequests
<=
0
)
{
PENDING_DEBUG
(
" .... AND TRIGGERS MODEL UPDATE"
);
updateWatchModel2
();
}
}
else
{
PENDING_DEBUG
(
" UNKNOWN TYPE "
<<
cmd
.
type
<<
" LEAVES PENDING AT: "
<<
m_pendingRequests
<<
cmd
.
command
);
...
...
@@ -1065,8 +1077,10 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
QString
msg
=
data
.
findChild
(
"consolestreamoutput"
).
data
();
if
(
reason
.
isEmpty
())
{
GdbMi
frame
=
data
.
findChild
(
"frame"
);
if
(
frame
.
findChild
(
"func"
).
data
()
==
"_start"
)
{
if
(
frame
.
findChild
(
"func"
).
data
()
==
startSymbolName
())
{
//
// that's the "early stop"
//
frame
.
findChild
(
"func"
).
data
()
+
'%'
;
#if defined(Q_OS_WIN)
sendCommand
(
"info proc"
,
GdbInfoProc
);
...
...
@@ -1078,9 +1092,6 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
sendCommand
(
"info pid"
,
GdbInfoProc
,
QVariant
(),
true
);
#endif
sendCommand
(
"-file-list-exec-source-files"
,
GdbQuerySources
);
sendCommand
(
"sharedlibrary libc"
);
// for malloc
sendCommand
(
"sharedlibrary libdl"
);
// for dlopen
tryLoadCustomDumpers
();
// intentionally after tryLoadCustomDumpers(),
...
...
@@ -1098,11 +1109,12 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
sendCommand
(
"set auto-solib-add off"
);
sendCommand
(
"set stop-on-solib-events 0"
);
}
reloadModules
();
// this will "continue" if done
attemptBreakpointSynchronization
();
m_waitingForBreakpointSynchronizationToContinue
=
true
;
QTimer
::
singleShot
(
0
,
this
,
SLOT
(
attemptBreakpointSynchronization
()));
return
;
}
qDebug
()
<<
"EMPTY REASON FOR STOPPED"
;
// fall through
}
...
...
@@ -1231,7 +1243,7 @@ void GdbEngine::handleAsyncOutput2(const GdbMi &data)
//
// Breakpoints
//
//qDebug() << "BREAK ASYNC: " <<
output
.toString();
//qDebug() << "BREAK ASYNC: " <<
data
.toString();
//sendListBreakpoints();
//attemptBreakpointSynchronization();
//if (m_breakListOnStopNeeded)
...
...
@@ -1572,7 +1584,7 @@ bool GdbEngine::startDebugger()
if
(
!
q
->
m_processArgs
.
isEmpty
())
sendCommand
(
"-exec-arguments "
+
q
->
m_processArgs
.
join
(
" "
));
sendCommand
(
"set auto-solib-add off"
);
sendCommand
(
"x/2i
_
start
"
,
GdbStart
);
sendCommand
(
"x/2i
"
+
start
SymbolName
()
,
GdbStart
);
}
if
(
q
->
startMode
()
==
q
->
attachExternal
)
{
...
...
@@ -1597,8 +1609,6 @@ bool GdbEngine::startDebugger()
else
qq
->
breakHandler
()
->
setAllPending
();
//QTimer::singleShot(0, this, SLOT(attemptBreakpointSynchronization()));
return
true
;
}
...
...
@@ -1618,7 +1628,7 @@ void GdbEngine::handleStart(const GdbResultRecord &response)
// stdout:~"0x404540 <_start>:\txor %ebp,%ebp\n"
// stdout:~"0x404542 <_start+2>:\tmov %rdx,%r9\n"
QString
msg
=
response
.
data
.
findChild
(
"consolestreamoutput"
).
data
();
QRegExp
needle
(
"0x([0-9a-f]+) <
_
start
\\
+.*>:"
);
QRegExp
needle
(
"0x([0-9a-f]+) <
"
+
start
SymbolName
()
+
"
\\
+.*>:"
);
if
(
needle
.
indexIn
(
msg
)
!=
-
1
)
{
//qDebug() << "STREAM: " << msg << needle.cap(1);
sendCommand
(
"tbreak *0x"
+
needle
.
cap
(
1
));
...
...
@@ -2080,11 +2090,14 @@ void GdbEngine::handleBreakInsert1(const GdbResultRecord &record, int index)
void
GdbEngine
::
attemptBreakpointSynchronization
()
{
// Non-lethal check for nested calls
static
bool
inBreakpointSychronization
=
false
;
QTC_ASSERT
(
!
inBreakpointSychronization
,
/**/
);
inBreakpointSychronization
=
true
;
BreakHandler
*
handler
=
qq
->
breakHandler
();
//qDebug() << "BREAKPOINT SYNCHRONIZATION ";
foreach
(
BreakpointData
*
data
,
handler
->
takeRemovedBreakpoints
())
{
//qDebug() << " SYNCHRONIZATION REMOVING" << data;
QString
bpNumber
=
data
->
bpNumber
;
if
(
!
bpNumber
.
trimmed
().
isEmpty
())
sendCommand
(
"-break-delete "
+
bpNumber
,
BreakDelete
,
0
,
true
);
...
...
@@ -2150,10 +2163,13 @@ void GdbEngine::attemptBreakpointSynchronization()
}
}
if
(
!
updateNeeded
)
{
if
(
!
updateNeeded
&&
m_waitingForBreakpointSynchronizationToContinue
)
{
m_waitingForBreakpointSynchronizationToContinue
=
false
;
// we continue the execution
continueInferior
();
}
inBreakpointSychronization
=
false
;
}
...
...
@@ -3931,12 +3947,14 @@ void GdbEngine::tryLoadCustomDumpers()
if
(
QFileInfo
(
lib
).
isExecutable
())
{
//sendCommand("p dlopen");
QString
flag
=
QString
::
number
(
RTLD_NOW
);
sendSynchronizedCommand
(
"call (void)dlopen(
\"
"
+
lib
+
"
\"
, "
+
flag
+
")"
,
sendCommand
(
"sharedlibrary libc"
);
// for malloc
sendCommand
(
"sharedlibrary libdl"
);
// for dlopen
sendCommand
(
"call (void)dlopen(
\"
"
+
lib
+
"
\"
, "
+
flag
+
")"
,
WatchDumpCustomSetup
);
// some older systems like CentOS 4.6 prefer this:
send
Synchronized
Command
(
"call (void)__dlopen(
\"
"
+
lib
+
"
\"
, "
+
flag
+
")"
,
sendCommand
(
"call (void)__dlopen(
\"
"
+
lib
+
"
\"
, "
+
flag
+
")"
,
WatchDumpCustomSetup
);
send
Synchronized
Command
(
"sharedlibrary "
+
dotEscape
(
lib
));
sendCommand
(
"sharedlibrary "
+
dotEscape
(
lib
));
}
else
{
qDebug
()
<<
"DEBUG HELPER LIBRARY IS NOT USABLE: "
<<
lib
<<
QFileInfo
(
lib
).
isExecutable
();
...
...
@@ -3945,11 +3963,12 @@ void GdbEngine::tryLoadCustomDumpers()
#if defined(Q_OS_MAC)
QString
lib
=
q
->
m_buildDir
+
"/qtc-gdbmacros/libgdbmacros.dylib"
;
if
(
QFileInfo
(
lib
).
isExecutable
())
{
//sendCommand("p dlopen"); // FIXME: remove me
sendCommand
(
"sharedlibrary libc"
);
// for malloc
sendCommand
(
"sharedlibrary libdl"
);
// for dlopen
QString
flag
=
QString
::
number
(
RTLD_NOW
);
send
Synchronized
Command
(
"call (void)dlopen(
\"
"
+
lib
+
"
\"
, "
+
flag
+
")"
,
sendCommand
(
"call (void)dlopen(
\"
"
+
lib
+
"
\"
, "
+
flag
+
")"
,
WatchDumpCustomSetup
);
send
Synchronized
Command
(
"sharedlibrary "
+
dotEscape
(
lib
));
sendCommand
(
"sharedlibrary "
+
dotEscape
(
lib
));
}
else
{
qDebug
()
<<
"DEBUG HELPER LIBRARY IS NOT USABLE: "
<<
lib
<<
QFileInfo
(
lib
).
isExecutable
();
...
...
@@ -3958,11 +3977,12 @@ void GdbEngine::tryLoadCustomDumpers()
#if defined(Q_OS_WIN)
QString
lib
=
q
->
m_buildDir
+
"/qtc-gdbmacros/debug/gdbmacros.dll"
;
if
(
QFileInfo
(
lib
).
exists
())
{
sendCommand
(
"sharedlibrary .*"
);
// for LoadLibraryA
//sendCommand("handle SIGSEGV pass stop print");
//sendCommand("set unwindonsignal off");
send
Synchronized
Command
(
"call LoadLibraryA(
\"
"
+
lib
+
"
\"
)"
,
sendCommand
(
"call LoadLibraryA(
\"
"
+
lib
+
"
\"
)"
,
WatchDumpCustomSetup
);
send
Synchronized
Command
(
"sharedlibrary "
+
dotEscape
(
lib
));
sendCommand
(
"sharedlibrary "
+
dotEscape
(
lib
));
}
else
{
qDebug
()
<<
"DEBUG HELPER LIBRARY IS NOT USABLE: "
<<
lib
<<
QFileInfo
(
lib
).
isExecutable
();
...
...
@@ -3970,9 +3990,9 @@ void GdbEngine::tryLoadCustomDumpers()
#endif
// retreive list of dumpable classes
send
Synchronized
Command
(
"call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)"
,
sendCommand
(
"call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)"
,
GdbQueryDataDumper1
);
send
Synchronized
Command
(
"p (char*)qDumpOutBuffer"
,
GdbQueryDataDumper2
);
sendCommand
(
"p (char*)qDumpOutBuffer"
,
GdbQueryDataDumper2
);
}
...
...
src/plugins/debugger/gdbengine.h
View file @
7ad54e63
...
...
@@ -328,6 +328,8 @@ private:
QString
m_currentFrame
;
QMap
<
QString
,
QString
>
m_varToType
;
bool
m_waitingForBreakpointSynchronizationToContinue
;
DebuggerManager
*
q
;
IDebuggerManagerAccessForEngines
*
qq
;
};
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment