Jak mogę skonfigurować program Qt Creator i/lub gdb, aby podczas debugowania mojego programu przy użyciu bibliotek Qt debugger unikał wchodzenia do plików źródłowych Qt?Jak uniknąć wprowadzania plików źródłowych biblioteki podczas debugowania w Qt Creator przy użyciu gdb?
Odpowiedz
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.
nie będzie działać z kompilacją statyczną oczywiście (ma nazwę auto-SOlib-add). –
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.
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
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. –
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
Co sądzisz o propozycji Andy'ego do usunięcia/ukrycia plików źródłowych biblioteki? –
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). –
@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
ten sam problem dla cdb, jak sobie z tym poradzić? – raidsan