2012-03-06 14 views
6

Che cosa sta succedendo che causa una build di debug per essere così molto più lento attaccato al debugger rispetto al distaccato? Sono entrambi gli stessi exe in esecuzione.Perché è in esecuzione un collegamento al debugger così lento?

Edit: La maggior parte delle risposte si concentrano su punti di interruzione. Sto ancora correndo come fango senza punti di interruzione, OutputDebugString, o qualsiasi cosa nella finestra dell'orologio. Per quanto riguarda il debug CRT, i controlli dello stack di runtime e l'heap di debug?

+1

Sei fuori di memoria e cestinare il disco? – kenny

+0

No. ----------- – David

risposta

8

Se non è OutputDebugString o pile e pile di punti di interruzione che rallentano tutto giù, provare questi:

  • di Windows di debug mucchio - il processo ottiene il mucchio di debug se è in esecuzione sotto un debugger, nessuna domanda posta. Per disabilitare questo quando si esegue il debugger di Visual Studio, visitare la pagina di debug delle proprietà del progetto e aggiungere _NO_DEBUG_HEAP=1 all'ambiente.

    (Il debug di heap di Windows è una cosa separata dal mucchio CRT di debug. La vostra build di rilascio otterrà il debug di heap di Windows anche se funziona in un debugger.)

  • il programma carica un sacco di DLL che avere simboli Quando viene caricata una DLL, Visual Studio tenta di trovare i simboli per esso. Se ci sono simboli disponibili, questo può richiedere tempo. Non c'è molto che puoi fare a questo proposito tranne per riorganizzare il tuo programma in modo che carichi DLL meno spesso.

  • Verificare eventuali chiamate a IsDebuggerPresent - questo può introdurre differenze arbitrarie tra l'esecuzione nel debugger e al di fuori di esso.

(Come suggerimento usa e getta finale - Vorrei anche essere sospettoso che le eccezioni (sia C++ o strutturati) potrebbe essere un po 'più complesso quando il processo è in fase di debug Quindi, se i programmi getta un sacco, forse. potrebbe essere un po 'più lento durante il debug.)

+0

Eccellente articolo su _NO_DEBUG_HEAP = 1 http://preshing.com/20110717/the-windows-heap-is-slow-when-granged-from-the-debugger/ – watbywbarif

1

Hai un sacco di registrazione tramite OutputDebugString? L'output prodotto da OutputDebugString viene ricevuto da un debugger, ma ignorato quando non è in esecuzione in un debugger.

+0

Nessuno in questo progetto, ma quello era un grosso problema di prestazioni nel mio ultimo. – David

1

ci sono un paio di motivi per cui in esecuzione con il debugger può essere significativamente più lento rispetto distaccato. Le cause più probabili sono

  • numero eccessivo di punti di rottura
  • punti di interruzione che hanno condizionali costosi
  • troppi punti in tracce

La prima cosa da provare è disabilitando tutti i punti di rottura e vedere come che effetti perf

+0

La disattivazione dei punti di interruzione ha fatto la differenza, ma l'allegato è ancora ~ 3 volte più lento di non collegato. – David

3

Se il debugger utilizza i watchpoint software, internamente esegue il codice e controlla questi punti e le modifiche nel valore variabile es.

Il debugger [VS] può supportare solo 4 punti di interruzione dati hardware. Se si utilizzano le espressioni (a + b), il debugger utilizza la modalità di emulazione.

Inoltre, il caricamento delle informazioni di debug per le librerie è più lento e contribuisce al tempo di esecuzione percepito (tempo di risposta).

Reference

+0

Puoi collegare la tua fonte? Mi piacerebbe leggere il resto di tutto ciò che è scritto lì. grazie – David

+0

http://www.highprogrammer.com/alan/windev/visualstudio.html – perreal

+0

Non ci credo! Il single-stepping del codice si comporterebbe così male che il debugger sarebbe inutile. Sei sicuro? Un singolo stepping significa che per ogni istruzione viene generata una trappola che il kernel del sistema operativo deve gestire. Il codice funzionerebbe come se fosse su un PC IBM 4,77 Mhz del 1981. :) Non ho mai visto da nessuna parte vicino a prestazioni così cattive da VS Debugger. Penserei/spero che i breakpoint del software siano implementati in modo sano, con l'ovvio metodo di sostituire l'istruzione breakpointed con un'istruzione di tipo trap break point (come int $ 3 su x86). – Kaz

Problemi correlati