2009-09-19 2 views

Antwort

15

Sie müssen Auto-solib-Add auszuschalten. Von einer normalen gdb Eingabeaufforderung geben Sie ein:

(gdb) set auto-solib-add off 

In Qt Creator, unter Optionen-> Debugger-> Gdb Sie einen Gdb Startskript angeben. Erstellen Sie eine Datei mit dem Befehl "set auto-solib-add off" und stellen Sie dann Ihr Gdb-Startskript auf diese Datei ein.

+1

arbeitet natürlich nicht mit statischen Build (es ist im Namen Auto-SOlib-Add). –

1

Update nach Kommentar Klarstellung:

In gdb können Sie festlegen, welche source directories are searched - wenn sie sie nicht finden kann, wird es nicht in der Lage sein, in ihnen zu gehen.

Damit gdb die Quelldateien der qt-Bibliotheken eingibt, muss es wissen, wo sie sind - es ist wahrscheinlich, dass qt-creator gdb mitteilt, wo sie sich befinden, wenn es den Debugger startet. Schauen Sie sich qt-creator für das gdb-Startskript an - sie könnten dort angegeben werden.

Wenn sie nicht im Startskript angegeben sind und gdb die Quelldateien selbst findet, sollten Sie in der Lage sein, das gdb-Startskript zu ändern, um Verzeichnisse mit dem Befehl directory zu löschen (siehe obigen Link für Syntax usw.) .)

Sie können auch die gdb-Konsole anzeigen, indem Sie auf "Debug -> Ansichten -> Gdb" gehen, um Informationen über die derzeit verwendeten Quellverzeichnisse mit dem Befehl show directories in gdb zu erhalten und alle auszumachen manuell, wenn Sie dies von Fall zu Fall tun möchten.

+0

Hier ist, was ich denke, Piotr will: Sie haben einen Anruf wie foo (QVariant :: fromValue (MySuperClass (QString ("Hallo% 1"). Arg ("Andy")))). Beim Einstieg sollte der Debugger arg, den QString-Konstruktor und den fromValue-Aufruf überspringen und nur MySuperClass und foo eingeben. AFAIK, Qt Creator kann das nicht tun. Es gab einige Diskussionen über das Überspringen der sig/slot-Maschinerie beim Durchlaufen von Code, aber ich weiß nicht, ob sie es implementiert haben. – rpg

+1

Andy, was du beschreibst heißt STEP OUT und STEP OVER und war schon immer in so ziemlich jedem Debugger möglich. Ich möchte ** den Quellcode von Qt ** nicht manuell überschreiten. Ich möchte, dass der Debugger automatisch ** darüber blättert.rpg stimmt in seinem Kommentar und er beschreibt das Feature, nach dem ich gefragt habe. –

3

Die gewünschte Funktion (wie von RPG beschrieben) ist nicht verfügbar von GDB, und IMHO wäre schwierig zu verwenden, wenn es implementiert wäre.

Eine ähnliche, aber einfach zu bedienende Funktion wird für GDB vorgeschlagen. Gegeben:

foo((string("Hello") + string(" World!)).c_str()); 

der fstep würden alle Anrufe auf der aktuellen Zeile überspringen, mit Ausnahme der letzten (also das Überspringen String Bauer, operator+() und c_str(), und nur in foo Schritt-).

Dies wurde auch nicht implementiert, wird aber wahrscheinlich in ein paar Monaten (es ist sehr nützlich für C++ Debugging).

In der Zwischenzeit können Sie die Funktion angenähert durch einen temporären Haltepunkt setzen:

(gdb) list 
1  #include <string> 
2  #include <iostream> 
3  using namespace std; 
4 
5  void foo(const char *s) 
6  { 
7   cout << s << endl; 
8  } 
9 
10  int main() 
11  { 
12  foo((string("Hello") + string(" World!")).c_str()); 
13  return 0; 
14  } 
(gdb) b main 
Breakpoint 2 at 0x8048901: file t.cc, line 12. 
(gdb) run 

Breakpoint 1, main() at t.cc:12 
12  foo((string("Hello") + string(" World!")).c_str()); 
(gdb) tb foo 
Breakpoint 3 at 0x80488ca: file t.cc, line 7. 
(gdb) c 
foo (s=0x804a1f4 "Hello World!") at t.cc:7 
7   cout << s << endl; 
(gdb) q 
+1

Was halten Sie von Andys Vorschlag, die Quelldateien der Bibliothek einfach zu entfernen/verstecken? –

+1

Sie können es versuchen, aber ich denke nicht, dass es Ihnen gut tun würde: GDB wird immer noch in die Funktionen treten, die Sie nicht wollen, es wird nur die Quelle für sie nicht zeigen. Wahrscheinlich ist das schlimmer als das, womit Sie angefangen haben. Darüber hinaus, wenn Sie auf ELF-Plattform (z. B. Linux) sind, müssen Sie tatsächlich Bibliothek Header entfernen - Compiler bettet den vollständigen Pfad zu ihnen in Ihre ausführbare Datei (IOW, ändern GDB Startskript wird wahrscheinlich sinnlos erweisen). –

+0

@Employed: Es ist 2012 und fstep ist immer noch nicht Teil von GDB. Gibt es noch eine Alternative? (Oder ein Patch, den ich auf gdb-Quellen anwenden könnte) Dies ist in der Tat ein Muss für die C++ - Entwicklung. – nimrodm