2009-09-19 13 views

Odpowiedz

15

trzeba wyłączyć auto-solib-add. Od normalnego wierszu gdb wpisz:

(gdb) set auto-solib-add off 

w Qt Creator, pod Opcje-> Debugger-> GDB można określić skryptu uruchamiania GDB. Utwórz plik za pomocą polecenia "set auto-solib-add off", a następnie ustaw skrypt uruchamiania Gdb na ten plik.

+1

nie będzie działać z kompilacją statyczną oczywiście (ma nazwę auto-SOlib-add). –

1

Aktualizacja po komentarzu wyjaśnienia:

W gdb można określić, które source directories are searched - jeśli nie mogą ich znaleźć, to nie będzie mógł pójść do nich.

Aby gdb mógł wprowadzać pliki źródłowe bibliotek qt musi wiedzieć, gdzie są - prawdopodobnie qt-creator mówi gdb, gdzie są, gdy uruchamia debugger. Rozejrzyj się wokół qt-creator dla skryptu startowego gdb - mogą tam być określone.

Jeśli nie są określone w skrypcie startowym i to gdb znajduje pliki źródłowe na swoim, powinieneś być w stanie zmodyfikować skrypt startowy gdb, aby wyczyścić dowolne katalogi komendą directory (zobacz powyższy link dla składni itp. .)

Możesz również być w stanie wyświetlić konsolę gdb, przechodząc do "Debuguj -> Widoki -> Gdb", aby uzyskać informacje o katalogach źródłowych, których aktualnie używasz z poleceniem show directories w gdb, i usuwając wszelkie off ręcznie, jeśli chcesz to zrobić indywidualnie dla każdego przypadku.

+0

Oto, co moim zdaniem Piotr chce: masz połączenie typu foo (QVariant :: fromValue (MySuperClass (QString ("hi% 1"). Arg ("Andy")))). Po wkroczeniu do debuggera należy pominąć arg, konstruktor QString, wywołanie fromValue i wprowadzić tylko MySuperClass i foo. AFAIK, Qt Creator nie może tego zrobić. Było trochę dyskusji o przeskakiwaniu maszyny sig/slot podczas przechodzenia przez kod, ale nie wiem, czy ją zaimplementowali. – rpg

+1

Andy, to co opisujesz nazywa się STEP OUT i STEP OVER i zawsze było możliwe w prawie każdym debugerze. Nie chcę ** ręcznie ** wychodzić/nad kodem źródłowym Qt. Chcę, aby debugger przejrzał go ** automatycznie **.rpg ma rację w swoim komentarzu i opisuje funkcję, o którą pytałem. –

3

Funkcja, którą chcesz (zgodnie z opisem w rpg) nie jest dostępna od GDB, a IMHO byłoby trudne w użyciu, gdyby zostało zaimplementowane.

Podobna, ale łatwiejsza w użyciu funkcja fstep jest proponowana dla GDB. Biorąc pod uwagę:

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

na fstep byłoby pominąć wszystkie połączenia na bieżącej linii, z wyjątkiem ostatniego (w ten sposób omijając konstruktorów smyczkowe, operator+() i c_str() i intensywniejszej tylko do foo).

Nie zostało to również zaimplementowane, ale prawdopodobnie nastąpi za kilka miesięcy (jest to bardzo przydatne przy debugowaniu C++).

W tym czasie, można zbliżyć się do funkcji poprzez ustawienie tymczasowego przerwania:

(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

Co sądzisz o propozycji Andy'ego do usunięcia/ukrycia plików źródłowych biblioteki? –

+1

Możesz go wypróbować, ale nie sądzę, żeby ci to pomogło: GDB nadal będzie wchodził w funkcje, których nie chcesz, po prostu nie pokaże ich źródła. Prawdopodobnie jest to gorsze od tego, od czego zacząłeś. Ponadto, jeśli korzystasz z platformy ELF (na przykład Linux), musisz usunąć nagłówki bibliotek - kompilator umieści w nich pełną ścieżkę do pliku wykonywalnego (IOW, modyfikując skrypt startowy GDB prawdopodobnie okaże się bezowocny). –

+0

@Employed: It's 2012 i fstep nadal nie jest częścią GDB. Czy jest jakaś inna alternatywa? (Lub łatka, którą mógłbym zastosować do źródeł gdb) Jest to konieczne dla rozwoju C++. – nimrodm

Powiązane problemy