debug remoto in VB6
-
21-08-2019 - |
Domanda
E 'possibile eseguire il debug remoto un processo avviato VB6 fuori?
L'applicazione è un'applicazione VB6 con un bel po 'di risorse dll / ocx. Sto tentando di installare una distribuzione ClickOnce, utilizzando COM Registration-Free, della app VB6, ma sono stato sempre errori quando si esegue.
La mia comprensione del modo in cui VB6 reindirizza registerations COM probabilmente vuol dire che questo non è possibile, ma ho pensato che qualcuno potrebbe avere una migliore idea.
Soluzione
Credo che durante il debug in VB6, non allegare a un binario di corsa, ma invece interpreta il codice all'interno del suo proprio processo. Questo è il motivo per cui le API Win32 Task Manager e mostrano VB6.exe come applicazione in esecuzione durante il debug.
Inoltre, come si dice, a volte VB6 cortocircuiti chiama a librerie COM in modo da intercettare queste chiamate non è sempre possibile.
Probabilmente stai andando ad avere per ricorrere alla registrazione intelligente (cioè registrare i valori delle variabili attorno ai punti in cui gli errori si stanno ottenendo si verificano nella speranza di localizzare la riga di codice che si verifica su, e / o lo stato di variabili rilevanti.)
In bocca al lupo
Altri suggerimenti
Per sostenere la risposta di Darryl suggerendo Windbg - ecco una 2006 post sul blog da un ragazzo di Microsoft sull'utilizzo di Windbg con VB6 e 2.004 post sul blog da un altro Microsoft ragazzo con una breve introduzione al Windbg.
EDIT: Giusto per rendere del tutto chiaro. Windbg è un debugger autonoma gratuitamente da Microsoft. Compilare l'EXE, DLL VB6 e OCX in codice nativo con i simboli (creare file PDB) e si sarà in grado di eseguire il debug dell'applicazione ClickOnce.
estratto chiave dal blog:
Se si dispone di un accesso limitato al computer server, allora è possibile utilizzare il Strutture di debug remoto di WinDbg. Allegare una copia del WinDbg al processo nel solito modo e poi trasformarlo in un server di debug (Check out .server nella guida in WinDbg). È quindi possibile connettersi ad esso a distanza dal menu File di WinDbg. Sarà proprio come essere tranne che per l'assenza di rumore da parte dei tifosi sale server. quando il debug di un remoto, la vostra copia di WinDbg è solo un terminale molto intelligente in modo che tutti le estensioni, i simboli e così via devono essere sul server remoto. È possibile impostare questa funzione allo stesso modo esatto per qualsiasi DLL, VB6 o .NET.
I simboli per il componente non verranno caricati fino a quando il componente non e quindi bisogna far funzionare il server almeno così a lungo. Puoi mettere una pausa nei primi mesi nel codice VB se si desidera interrompere il debugger a quel punto ma se lo fate, ricordate che si fermerà lì ogni volta attraverso il codice. Supponiamo che si lascia correre e poi rompere in. Se si elencano i simboli caricati per il modulo con "x MyModule! *" poi si vedrà tutte le funzioni insieme con un sacco di simboli bundle in là per voi. VB aggiunge interfacce e simboli abbastanza spudoratamente ma in genere non hanno bisogno di preoccuparsi di quelli. Uno cosa che probabilmente sembrare strano è che tutto il metodo / sintassi della classe con il C ++ convenzione contro la doppia colon al posto del poco amichevole punto. WinDbg non capisce che VB è diverso e viene trattata proprio come qualsiasi DLL con i simboli.
Da qui, è possibile impostare i punti di interruzione nel modo consueto (bp ecc) e passo tramite il codice. È inoltre possibile aprire moduli di codice sorgente di VB e set punti di interruzione in loro con F9 anche se le estensioni di file non sono in VB il tipo di file di origine discesa. Facendo un passo attraverso il codice sta rivelando ma potrebbe essere un po 'allarmante, se non avete visto il codice che VB genera per voi prima. Sarete passando attraverso l'assemblatore e c'è un sacco di COM goo in là. HRESULT vengono controllati molto. Si avrà probabilmente bisogno di fare riferimento alla fonte spesso di capire dove si è visto che richiede un po 'di pratica per essere in grado di sapere qual è il il codice sorgente sembrava. Le varianti sono particolarmente impegnativo, perché VB fa un sacco di lavoro per voi lì e quello che sembra un semplice equazione può portare a una grande quantità di codice. codice ottimizzato è ancora più difficile perché l'ordine di esecuzione è spesso molto diverso da quello che ci si potrebbe aspettare ed è più difficile del solito per vedere i dati.
I dati non è facile da ottenere in questo modo. Quando si guarda a variabili locali (Dv è il comando) allora si può vedere che le variabili sono semplicemente elencate come eclissata che significa che la memoria utilizzata per qualcosa il resto pure all'interno del ciclo di vita di funzione o che il nome non è unico in questo contesto. Enumerazioni mostrano proprio come numeri interi o lunghi e oggetti mostrano come puntatori. In realtà, sono sempre stati esattamente questo, ma VB IDE nasconde che da voi. stringhe VB sono COM BSTRs (e di conseguenza Unicode) sotto le coperte e campi di bytesono davvero char array. Potreste essere sorpresi di scoprire che le stringhe VB sono Unicode come sembra VB non avere il supporto per qualsiasi cosa, ma ANSI. Questo è perché il rubino forma motore era solo ANSI. Il runtime converte il stringhe Unicode a ANSI per le chiamate API di Ruby e anche se ci sono modi a passare Unicode se si vuole.
Non si ha intenzione di essere in grado di arrivare alla Err, App o oggetti Stampante dal momento che si avrebbe bisogno di passare attraverso un sacco di interno e completamente strutture non documentate per arrivare a loro. Anche se si potrebbe arrivare, che sarebbe solo dati grezzi senza le funzioni di accesso che si utilizzare in VB. Se avete bisogno di guardare in qualunque di questi campi, la soluzione migliore è quello di incorporare il codice di debug nel codice sorgente di copiare i loro valori da qualche parte che si può arrivare a.
Si può intervenire per il runtime VB, se si vuole, ma che probabilmente non sarà molto rivelando se si sta cercando di eseguire il debug dell'applicazione. Se fate, si noterà che internals di VB sono molto influenzati COM. Il influenza era in realtà a due vie dal momento che alcune idee COM venuti da VB in origine.
È possibile visualizzare le eccezioni quando si esegue il codice. riferimento null eccezioni (cioè dereferenziazione un puntatore nullo) non sono infrequenti o nulla di cui preoccuparsi. Essi verranno visualizzati come prima occasione C000005 eccezioni con uno 0 o quasi 0 indirizzo. Il runtime a volte fare che se ci sono oggetti impostati a nulla, ma che è sicuro perché il solo valori possibili sono null o un valore valido. Si vedrà anche eccezioni se il codice fa le ricerche in collezioni e il valore è non c'è. Poiché le eccezioni sono ora così costosi, probabilmente si vuole evitare di fare che, se è possibile. Un discorso a parte che si vuole comunemente vedere è c000008f. Se si guarda il numero fino allora troverete che è un risultato inesatto eccezione virgola mobile. E 'utilizzato in un significato diverso qui - dal momento che non generiamo vero punto floating eccezioni risultato inesatte, possono tranquillamente essere gettati per indicare VB errori del tipo intercettabile normale.
Debug si blocca e crash di componenti VB è fatto molto in allo stesso modo come con qualsiasi altro componente non gestito, ma è solo un po ' difficile a causa delle compilazioni sopra descritti. Se dovete provare debug di codice VB in questo modo, vi consiglio vivamente che si avvia su un'applicazione "Ciao mondo" e il tuo lavoro su. Tutte le cose che potrebbe VB una lingua facile da codificare in renderlo un linguaggio terribile debug.
Hai provato windbg ? Basta fare in modo di avere file PDB per il progetto.