Pergunta

O Aqui algo que eu sei é provavelmente possível, mas eu nunca consegui fazer
No VS2005 (C ++), durante a depuração, para ser capaz de chamar uma função a partir do código que eu estou depuração.
Este recurso é às vezes essencial quando a depuração estruturas de dados complexas que não podem ser exploradas facilmente usando apenas as capacidades normais de janela do relógio.
A janela de observação parecem permitir chamadas de escrita de função mas cada vez que eu tento isso dá-me um erro ou outro.

Error: symbol "func" not found
Error: argument list does not match function
Error: member function not present

Alguém já conseguir fazer esse trabalho corretamente? O que estou ausente aqui?

Editar:. claramente, a função chamada deve ser um símbolo que existe no escopo atual o depurador está em

Foi útil?

Solução

Ok, Aqui está o que eu encontrei
CXX0040 meios que
"The C expression evaluator does not support implicit conversions involving constructor calls." meios CXX0047 que "Overloaded functions can be called only if there is an exact parameter match or a match that does not require the construction of an object."

Assim combinado que significa que se eu quiser chamar uma função que nenhum dos argumentos devem ter uma conversão implícita e nenhum dos argumentos deve precisar de uma construção.
"Conversão implícita" neste contexto parecem incluir coisas triviais como converter 'String' para 'const String&'.
"Construção" parecem incluir trivial cópia-construção. assim passando por valor qualquer coisa que não é um tipo primitivo irá resultar em um erro.

Então, isso basicamente folhas funções que recebem apenas tipos primitivos ou ponteiros.
Acabo testado esta teoria com sucesso.

Então, se você quer ser capaz de chamar um método a partir da janela do relógio, adicionar uma sobrecarga que leva apenas ponteiros e primitivas e na janela do relógio passar os argumentos de forma adequada. Para passar um objeto que não é um passe primitivo seu endereço.

Outras dicas

A janela de observação é limitada pelo contexto no qual seu código atual é, por exemplo, quando o código entra em uma função e você tentar acessar uma outra função que é escondido do escopo de sua função atual, ele não vai funcionar.

Se você chamar uma função na janela do relógio, certifique-se de que é visível e acessível a partir do escopo atual.

Para meu conhecimento, você não pode executar código de janela de inspeção durante a depuração não gerenciado C ++. Isso funciona para C # (e, provavelmente, VB.NET e gerenciado C ++, mas eu não sou positivo sobre isso). Então, provavelmente ele permite isso porque ele funciona para alguns idiomas, mas não outros.

Nós encontramos isso funciona em uma maneira muito sucesso e perder. Algumas funções muito simples (incl. Funções de membro) trabalho, tipicamente simples getters de propriedade. Outras funções mais complexas não funcionam e dar um erro.

Eu nunca fui capaz de discernir as regras precisas ...

Eu não testei isso, mas eu sempre pensei que era o que a janela imediata foi para (código em execução)

Cameron

É a "imediata" janela que você quer. E você está limitado ao que é visível a partir de onde seu ponto de interrupção atual. As variáveis ??locais e funções em que classe (ou globals)

Na minha experiência, existem algumas deficiências com a janela imediata. Você não pode chamar funções de membro das suas classes se as classes vêm de uma DLL diferente, mas obter enganosa mensagens de erro. Se alguma coisa está na mesma DLL (por exemplo, vinculando estaticamente em todas as outras coisas), chamando membros é bastante confiável. Mas o material complexo pode ou não trabalho, como mencionado por outros.

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