avanzata Visual Studio Test di kung-fu - funzioni dalla finestra immediata di chiamata durante il debug

StackOverflow https://stackoverflow.com/questions/3011703

Domanda

Vedo alcune questioni connesse sono state poste, ma sono troppo avanzato per me capire o privi di una guida passo-passo, dall'inizio alla fine (la maggior parte di loro finiscono per essere insider parlare dei propri risultati dell'esperimento ). OK qui è, dato questo semplice programma:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE * f;
    char buffer[100];

    memset(buffer, 0, 100);

    fun();

    f = fopen("main.cpp", "r");
    fread(buffer, 1, 99, f);
    printf(buffer);
    fclose(f);

    return 0;
}

Ciò che fa è fondamentalmente stampa stessa (si presuppone nome del file è main.cpp).

Domanda

Come posso farlo stampare un altro file, diciamo foobar.txt senza modificare il codice sorgente ? Ha qualcosa a che fare con la corsa attraverso VS di, passando attraverso le funzioni e dirottare il puntatore del file a destra prima fread() è chiamato. Non c'è bisogno di preoccuparsi di perdite di risorse chiamando fclose().

ho provato il semplice f = fopen("foobar.txt", "r") che ha dato

CXX0017: Error: symbol "fopen" not found

Tutte le idee?

Modifica

ho scoperto la soluzione accidentalmente debug Mozilla su Windows FAQ . Il comando corretto per mettere in Finestra Immediata è

f = {,,MSVCR100D}fopen("foo.txt", "r")

Tuttavia, in realtà non rispondere a questa domanda:

  • io ancora non capisco cosa sta succedendo qui.
  • Come trovare sistematicamente la parte {,,MSVCR100D} per ogni metodo? So che i cambiamenti di versione MSVCR da sistema a sistema. Come faccio a scoprirlo?
  • Qualcuno potrebbe spiegare la sintassi di parentesi graffa, in particolare, quali sono quei due virgole che fanno lì? Ci sono gemme più nascoste che utilizzano questa sintassi?
È stato utile?

Soluzione

La sintassi parentesi graffe è la VS Context operatore, che è in gran rotto - come elaborato al link (o almeno, quasi una gemma nascosta). Viene utilizzato ovunque le esigenze di valutazione di espressioni-motore VS per risolvere funzioni in fase di esecuzione, ad esempio la valutazione delle espressioni composte nella finestra di controllo, impostando punti di interruzione, o (come avete assistito) nelle finestre di comando / immediato.

Il terzo argomento è il binario che include l'implementazione della funzione che si desidera chiamare. Per una funzione CRT, come fopen, che di solito è pari a -

  

MSVCR [Versione VS] [D] .dll

(mi sembra di ricordare l'estensione era necessario - ma forse che ha cambiato in VS2010). Il 'D' indica la versione di debug dll. Il numero di versione VS viene decodificato come:. VS2005 -> 8, VS2008 -> 9, VS2010 -> 10

Da notare anche la valutazione-motore ha vari altri trucchi per guardare fuori per.

Altri suggerimenti

Per completare la risposta eccellente di Ofek, ecco un modo che ho trovato per trovare sistematicamente quale modulo una chiamata di funzione appartiene. (Cioè la parte MSVCR100D).

  • Passaggio attraverso il debugger alla ricerca di un'istanza della funzione che si desidera chiamare. (In questo caso, stavo cercando fopen);
  • Quando lo trovate, passo in esso premendo F11.
  • Fare clic destro e scegliere Mostra smontaggio
  • È possibile trovare l'indirizzo dell'istruzione attualmente in esecuzione. (Clicca intorno alle Opzioni di visualizzazione per attivarlo se non viene mostrato)
  • Aprire la finestra di debug Modules (Alt + Ctrl + U)
  • Guardare attraverso l'elenco dei moduli caricati con l'intervallo di indirizzi che copre l'indirizzo del istruzione corrente. Bam, hai trovato il nome del modulo per la funzione!

Credo che è possibile utilizzare questo metodo per trovare il nome del modulo per qualsiasi classe. Questo può essere utile quando ad esempio si rivede una grande base di codice e si vuole richiamare il metodo un po 'di classe arbitraria al volo nella finestra immediata. Probabilmente si può anche creare istanze di classi al volo chiamando il costruttore da soli.

Ora non era C ++ una lingua nativa? Ci sentiamo quasi come in un gestito, ambiente di scripting qui: P

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