2009-09-19 13 views

risposta

15

È necessario disattivare l'auto-solib-add. Da un prompt di gdb normale è necessario digitare:

(gdb) set auto-solib-add off 

In Qt Creator, sotto Opzioni-> Debugger-> Gdb è possibile specificare uno script di avvio Gdb. Crea un file con il comando "set auto-solib-add off" e poi imposta lo script di avvio Gdb su quel file.

+1

non funzionerà con build statici, ovviamente (è nel nome auto-SOlib-add). –

1

aggiornamento dopo il commento precisazione:

In gdb è possibile specificare quali source directories are searched - se non li possa trovare, non sarà in grado di andare in loro.

Per fare in modo che gdb inserisca i file sorgente delle librerie qt deve sapere dove si trovano - è probabile che qt-creator stia dicendo a gdb dove si trovano quando avvia il debugger. Guardate intorno a qt-creator per lo script di avvio di gdb - potrebbero essere specificati lì.

Se non vengono specificati nello script di avvio ed è gdb trovare i file di origine su di essa la propria si dovrebbe essere in grado di modificare lo script di avvio gdb per cancellare tutte le directory con il comando directory (vedi il link qui sopra per la sintassi ecc .)

si può anche essere in grado di visualizzare la console gdb andando a "Debug -> Viste -> gdb" per ottenere informazioni su quali fonti le directory si sta utilizzando con il comando show directories in gdb, e deselezionando qualsiasi off manualmente se si desidera eseguire questa operazione caso per caso.

+0

Ecco cosa penso Piotr vuole: hai una chiamata come foo (QVariant :: fromValue (MySuperClass (QString ("hi% 1"). Arg ("Andy")))). Quando si entra, il debugger dovrebbe saltare arg, il costruttore QString, la chiamata fromValue e inserire solo MySuperClass e foo. AFAIK, Qt Creator non può farlo. C'è stata una discussione su come saltare il macchinario sig/slot quando si passa attraverso il codice, ma non so se l'hanno implementato. – rpg

+1

Andy, quello che stai descrivendo si chiama STEP OUT e STEP OVER ed è sempre stato possibile in quasi tutti i debugger. Non voglio ** manualmente ** uscire/sopra il codice sorgente di Qt. Voglio che il debugger lo scavalchi ** automaticamente **.rpg ha ragione nel suo commento e descrive la funzione che stavo chiedendo. –

3

La funzione desiderata (come descritto da rpg) non è disponibile da GDB e IMHO sarebbe difficile da utilizzare se fosse implementata.

Una funzione simile, ma più semplice da usare, fstep viene proposta per GDB. Dato:

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

il fstep saltato tutte le chiamate sulla linea corrente, tranne l'ultimo (saltando quindi costruttori stringa, operator+() e c_str(), e passo solo in foo).

Anche questo non è stato implementato, ma probabilmente sarà tra un paio di mesi (è molto utile per il debug di C++).

Nel frattempo, si può approssimare la funzione impostando un punto di interruzione temporanea:

(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

Cosa ne pensi della proposta di Andy di rimuovere/nascondere i file sorgente della libreria? –

+1

Puoi provarlo, ma non penso che ti farebbe del bene: GDB continuerà comunque a svolgere le funzioni che non desideri, semplicemente non mostrerà la fonte per loro. Probabilmente è peggio di quello che hai iniziato. Inoltre, se si è su una piattaforma ELF (ad esempio Linux), è necessario rimuovere effettivamente le intestazioni delle librerie - il compilatore incorpora il percorso completo nel file eseguibile (IOW, lo script di avvio GDB potrebbe rivelarsi inutile). –

+0

@Employed: è 2012 e fstep non fa ancora parte di GDB. C'è qualche altra alternativa? (O una patch che potrei applicare ai sorgenti di gdb) Questo è davvero un must per lo sviluppo del C++. – nimrodm

Problemi correlati