Domanda

Quindi voglio mettere un punto di interruzione in un messaggio API o Windows specifico. Non trovo alcun modo semplice per farlo senza scrivere codice in nessuna versione di Delphi. C'è un modo per farlo simile in quanto posso mettere un punto di interruzione nell'accesso alla memoria?

È stato utile?

Soluzione

Per fermarti a qualsiasi chiamata a una funzione API, trovalo nel implementation sezione di Windows.Pas (o dove viene dichiarata la funzione di interesse) e impostare un punto di interruzione. Ciò si occupa delle funzioni che usi con il collegamento dinamico del tempo di carico. Per il collegamento dinamico di runtime (LoadLibrary e GetProcAddress), avrai bisogno di una tecnica diversa. La variabile che ottiene il risultato di GetProcAddress Terrò l'indirizzo che vuoi rompere, ma non so come impostare un punto di interruzione a quell'indirizzo.

Fermarsi su un messaggio di finestra è più complicato poiché i messaggi possono essere recuperati in molti punti. Dovrai invece utilizzare i punti di interruzione condizionale.

Per catturare la maggior parte dei messaggi pubblicati, puoi inserire un punto di interruzione TApplication.HandleMessage sulla prima riga dopo la chiamata a PeekMessage. Imposta la condizione per essere Msg.Message = x. HandleMessage si prende cura dei messaggi pubblicati nella coda dei messaggi del thread principale per il principale Application.Run Loop dei messaggi e loop di messaggio modale del VCL. Altri dialoghi modali (come Windows.MessageBox) non lo userà, però.

Osservando spedito I messaggi sono più difficili perché il sistema operativo li invia direttamente alle procedure della finestra target. Dovrai impostare un punto di interruzione nella procedura di finestra di ogni lezione di finestra che ti interessa. Potresti ottenere la maggior parte delle lezioni di finestra VCL mettendo il punto di interruzione condizionale Classes.StdWndProc.

Tieni presente che i punti di interruzione condizionali possono essere molto lenti. Funzionano dal debugger mettendo un incondizionato Breakpoint lì, e quando il sistema operativo lo innesca, il debugger prende il sopravvento, controlla la condizione e quindi riprende l'esecuzione se il condizionale fallisce. Ciò può comportare un sacco di spese generali, passando tra il debugger e la tua applicazione; i programmi ricevono molti di messaggi, quindi se riesci a trovare un modo per evitare che il debugger interrompa il tuo programma per controllare tutti Di loro, fallo.

Se questo non è possibile per qualunque cosa tu stia cercando di eseguire il debug, allora ti consiglio di pubblicare una nuova domanda in cui descrivi il problema che stai davvero cercando di risolvere.

Altri suggerimenti

Dovrai andare in opzioni | Linker e controlla "Debug DCUS". Per impostazione predefinita, questo non è controllato, quindi il debugger non passa attraverso l'intero VCL quando stai cercando di lavorare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top