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.

È stato utile?

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.

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