2014-10-07 8 views
6

Sto eseguendo il debug di un componente di Windows e desidero visualizzare tutte le funzioni di una particolare dll chiamate (anche nell'esatto ordine sono chiamati). Posso farlo collegando il componente a windbg e impostando i breakpoint su tutte le funzioni esportate (bm *module_name!*) del dll in questione.Come impostare i punti di interruzione in windbg che non interrompe l'esecuzione del programma registra solo la funzione denominata

Funziona come previsto. Ogni volta che una funzione esportata di quella dll viene chiamata windbg, interrompe l'esecuzione e stampa sullo schermo le informazioni sul punto di interruzione che viene colpito. Dopo di che posso riprendere manualmente l'esecuzione premendo F5 o dando il comando go.

Il problema: Alcune funzioni della DLL devono tornare molto rapidamente (immediatamente) altrimenti il ​​componente si blocca. In tal caso, il punto di interruzione provoca l'arresto anomalo del componente. Posso rimuovere il punto di interruzione in questione ma poi non ci sarebbe alcun registro di essere colpito.

Mi sono guardato intorno e ho scoperto che posso eseguire un comando ogni volta che viene colpito un punto di interruzione. bm module_name!func_name ".printf \"func_name\n\";gc" Ma questo non è possibile per ogni funzione esportata. La dll ha circa 100 funzioni esportate.

Cosa posso fare per registrare (sullo schermo stesso) ogni funzione esportata che viene colpita (anche il numero di punto di interruzione dovrebbe essere fatto se non si può fare nient'altro). C'è un nome di variabile che posso usare nel comando printf che può stampare il nome della funzione (o il numero di breakpoint se non il nome della funzione)?

+0

Qual è il problema qui, si desidera un elenco delle funzioni di essere colpito e poi continuare, ma rimuovere i punti di interruzione o stai voler appena uscita la prima linea dello stack di chiamate? Potresti provare '.kframes = 1; bm * nome_modulo! *" Kb; gc "', questo imposterà lo stack di chiamate a 1, per ogni punto di interruzione verrà eseguito il dump della prima chiamata che sarà la funzione colpita ma tu ottenere un sacco di colpi anche se – EdChum

+0

'Manca l'espressione numerica da '= 1; bm * nome_modulo! *" kb; gc "'' – tMJ

+0

FTR: Non voglio rimuovere il punto di interruzione. – tMJ

risposta

5

Capito. Grazie a EdChum.

Il comando: bm *module_name!* ".frame;gc"

+0

come hai ottenuto intorno al limite di 32 punti di interruzione? "Hai tentato di abilitare XX punti di interruzione KD, che supera il limite attualmente supportato di 32 punti di interruzione per il debug del kernel di Windows. I punti di interruzione che superano questo limite vengono ignorati" – kevinf

+0

Fortunatamente/Sfortunatamente il componente che stavo eseguendo il debug non aveva tali limiti. E non ho più una macchina Windows per provare le cose. Penso che ti servirebbe meglio per fare una nuova domanda. In bocca al lupo! – tMJ

+0

Sto supponendo che sia un'applicazione in modalità utente, forse non ci sono limiti di questo tipo. – kevinf