Pergunta

Vejo algumas perguntas relacionadas foram feitas, mas elas são muito avançadas para eu entender ou sem um guia passo a passo do início ao fim (a maioria deles acaba sendo uma conversa insider sobre seus próprios resultados de experimento). Ok, aqui está, dado este programa simples:

#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;
}

O que faz é basicamente impresso (suponha que o nome do arquivo seja main.cpp).

Pergunta

Como posso imprimir outro arquivo, digamos foobar.txt sem modificar o código -fonte? Tem algo a ver com a execução do VS, passando pelas funções e sequestrando o ponteiro do arquivo antes de fread() é chamado. Não há necessidade de se preocupar em vazar recursos ligando fclose().

Eu tentei o simples f = fopen("foobar.txt", "r") o que deu

CXX0017: Error: symbol "fopen" not found

Alguma ideia?

Editar

Eu descobri a solução acidentalmente em Debugando Mozilla no Windows FAQ. O comando correto para colocar na janela imediata é

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

No entanto, ele realmente não responde a esta pergunta:

  • Ainda não entendo o que está acontecendo aqui.
  • Como descobrir sistematicamente o {,,MSVCR100D} parte para um determinado método? Eu sei que a versão MSVCR muda de sistema para sistema. Como posso descobrir isso?
  • Alguém poderia explicar a sintaxe encaracolada, especialmente o que esses dois vírgulas estão fazendo lá? Existem mais jóias escondidas usando esta sintaxe?
Foi útil?

Solução

A sintaxe de brocas encaracoladas é a vs Operador de contexto, que está principalmente quebrado - como elaborado no link (ou pelo menos, dificilmente uma jóia escondida). Ele é usado em qualquer lugar que o engenheiro de avaliação de expressão vs precise resolver funções em tempo de execução, por exemplo, avaliando expressões compostas na janela do relógio, definindo pontos de interrupção ou (como você testemunhou) nas janelas imediatas/de comando.

Seu terceiro argumento é o binário que inclui a implementação da função que você deseja ligar. Para uma função de CRT, como o FOPEN, isso geralmente equivale a -

Msvcr [vs versão] [d] .dll

(Parece que me lembro que a extensão foi necessária - mas talvez isso tenha mudado no VS2010). O 'D' indica a versão DLL de depuração. O número da versão VS é decodificado como: vs2005 -> 8, vs2008 -> 9, vs2010 -> 10.

Observe também que o motor de avaliação tem Vários outros Gotchas Para observar.

Outras dicas

Para complementar a excelente resposta do OFEK, eis uma maneira que eu encontrei para descobrir sistematicamente a que módulo uma chamada de função pertence. (ou seja MSVCR100D papel).

  • Passe pelo depurador procurando uma instância da função que você deseja ligar. (Nesse caso, eu estava procurando fopen);
  • Quando você o encontrar, entre ele pressionando F11.
  • Clique com o botão direito e escolha mostrar a desmontagem
  • Você pode encontrar o endereço da instrução atualmente em execução. (Clique em torno das opções de visualização para alterná -lo se não for mostrado)
  • Abra a janela de depuração dos módulos (alt+ctrl+u)
  • Veja a lista de módulos carregados com o intervalo de endereços que cobrem o endereço da instrução atual. BAM, você encontrou o nome do módulo para a função!

Eu acredito que você pode usar esse método para encontrar o nome do módulo para qualquer classe. Isso pode ser útil quando, por exemplo, você está revisando uma base de código grande e deseja invocar algum método de classe arbitrária em tempo real na janela imediata. Você provavelmente também pode criar instâncias de classes em tempo real, chamando você mesmo o construtor.

Agora não era o idioma nativo C ++? Quase nos sentimos em um ambiente de script gerenciado aqui: P

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top