Xcode Debugger: ver o valor da variável


107

Meu código em um UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Como posso ver os valores de delegate.myDataou indexPath.rowno Debugger? delegate.myDatadeve ser uma matriz e indexPath.rowum int. Só consigo ver endereços de memória dos objetos delegatee, indexPathmas onde estão myDatae row?

texto alternativo

Respostas:


142

Verifique isto como visualizar o conteúdo da variável NSDictionary no depurador Xcode?

Eu também uso

po variableName
print variableName

no console.

No seu caso é possível executar

print [myData objectAtIndex:indexPath.row]  

ou

po [myData objectAtIndex:indexPath.row]

Obrigado! Eu tento muito: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Mas sempre eu recebeu a mensagem "Não há nenhum membro com nome de linha." Isso funciona: "print indexPath" e "po indexPath". Portanto, tentei usar "[]" em vez de ".": "Po [indexPath row]" -> "Não é possível imprimir a descrição de um objeto NIL." "po [indexPath getRow]" -> "O destino não responde a este seletor de mensagem." :-(
Manni

4
try print (int) [indexPath row]
Andriy

po [myData objectAtIndex: (int) [indexPath row]]
Andriy

@VanDuTran Tenho certeza de que o equivalente a po objno swift é po print(obj).
Chris,

Isso também era perfeito para localizar os valores das propriedades calculadas. Obrigado!
Paula Hasstenteufel

25

Eu concordo com outros participantes que o Xcode como um ambiente de desenvolvimento deve incluir uma maneira fácil de depurar variáveis. Bem, boas notícias, existe uma!

Depois de pesquisar e não encontrar uma resposta / tutorial simples sobre como depurar variáveis ​​no Xcode, fui explorar com o próprio Xcode e achei esta descoberta (pelo menos para mim) muito útil.

Como depurar facilmente suas variáveis ​​no Xcode 4.6.3

Na tela principal do Xcode, certifique-se de ver a área de depuração inferior clicando no botão do canto superior direito mostrado na imagem.

Botão da área de depuração

Área de depuração no Xcode 4.6.3

Agora defina um Breakpoint - a linha em seu código onde você deseja que seu programa pause, clicando na borda de sua área de código.

Breakpoint

Agora, na área de depuração, procure estes botões e clique no do meio. Você notará que sua área agora está dividida em duas.

Dividir área de depuração

Deve ser assim

Agora execute seu aplicativo.

Quando o primeiro Breakpoint for alcançado durante a execução do seu programa, você verá do lado esquerdo todas as suas variáveis ​​disponíveis naquele breakpoint.

Campo de Pesquisa

Você pode expandir as setas para a esquerda na variável para obter mais detalhes. E ainda use o campo de pesquisa para isolar a variável desejada e vê-la mudar em tempo real conforme você "entra" no escopo do Breakpoint.

Entrar

No lado direito da sua área de depuração, você pode enviar para imprimir as variáveis ​​conforme desejar, clicando com o botão direito do mouse sobre a variável desejada.

Menu Contextual

Como você pode ver, esse menu contextual está cheio de opções de depuração muito interessantes. Como o Watch que já foi sugerido com comandos digitados ou mesmo Editar Valor ... que altera o valor de tempo de execução de sua variável!


21

Você também pode:

  1. Defina um ponto de interrupção para pausar a execução.
  2. O objeto deve estar dentro do escopo de execução
  3. Mova o ponteiro do mouse sobre o objeto ou variável
  4. Uma dica de ferramenta amarela aparecerá
  5. Mova o mouse sobre a dica de ferramenta
  6. Clique sobre as duas pequenas setas apontando para cima e para baixo
  7. Um menu de contexto irá aparecer
  8. Selecione "Imprimir Descrição", irá executar uma [descrição do objeto]
  9. A descrição aparecerá na saída do console

IMHO um pouco escondido e pesado ...


Em meu xcode "Descrição de impressão" não está funcionando, então como posso ativá-lo?
Kirtikumar A.

@kirtiavaiya o aplicativo deve estar em pausa e sua variável precisa estar dentro do escopo atual para ser impressa. Além disso, você não pode imprimir "self.variable" diretamente, mas pode usar a solução Andriy para imprimir _ <nome da variável>. Por exemplo: para self.btnHello escreva no console "po _btnHello" (isso só funciona se você não alterou o nome do método getter)
LightMan

@LightMan sim, é como você disse, mas também não está funcionando
Kirtikumar A.

10

Sua confusão origina-se do fato de que as propriedades declaradas não são (necessariamente nomeadas o mesmo que) (instância) variáveis.

A expressão

indexPath.row

é equivalente a

[indexPath row]

e a atribuição

delegate.myData = [myData objectAtIndex:indexPath.row];

é equivalente a

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

assumindo nomenclatura padrão para propriedades sintetizadas.

Além disso, delegateé provavelmente declarado como sendo do tipo id<SomeProtocol>, ou seja, o compilador não foi capaz de fornecer informações de tipo reais para delegateaquele ponto, e o depurador está contando com as informações fornecidas em tempo de compilação. Como idé um tipo genérico, não há informações de tempo de compilação sobre as variáveis ​​de instância em delegate.

Essas são as razões pelas quais você não vê myDataou rowcomo variáveis.

Se você deseja inspecionar o resultado do envio -rowou -myData, pode usar comandos pou po:

p (NSInteger)[indexPath row]
po [delegate myData]

ou use a janela de expressões (por exemplo, se você sabe que delegateé do tipo real MyClass *, você pode adicionar uma expressão (MyClass *)delegateou clicar com o botão direito delegate, escolher View Value as…e digitar o tipo real de delegate(por exemplo MyClass *).

Dito isso, concordo que o depurador poderia ser mais útil:

  • Pode haver uma opção para dizer à janela do depurador para usar informações de tipo de tempo de execução em vez de informações de tempo de compilação. Isso tornaria o depurador mais lento, é verdade, mas forneceria informações úteis;

  • As propriedades declaradas podem ser mostradas em um grupo denominado propriedades e permitir a inspeção (opcional) diretamente na janela do depurador. Isso também tornaria o depurador mais lento devido à necessidade de enviar uma mensagem / executar um método para obter informações, mas também forneceria informações úteis.


Obrigado pela sua explicação! Isso me ajudou muito! :-)
Manni de

7

Você pode imprimir valores na janela do console em tempo de execução. Abaixo estão as etapas:

  1. Coloque um ponto de interrupção para o qual deseja obter valores
  2. Agora execute a depuração passo a passo.
  3. Coloque um cursor na variável / delegado cujo valor deve ser verificado em tempo de execução.
  4. Agora, isso vai mostrar a descrição da variável / delegado
  5. Clicar em "i" mostrará uma descrição detalhada
  6. Isso também imprimirá detalhes na janela do console.

Captura de tela para imprimir detalhes na janela do console


1
Isso funciona no swift, sou novo no swift e não consigo ver os valores do objeto como usamos para ver no obj c.
umairhhhs

1
@umairhhhs Esta postagem é apenas para Objective-C.
Jayprakash Dubey

1
Estou me perguntando por que isso não está no editor rápido, porque isso ajudou muito e economizou tempo.
umairhhhs

1

Isso fica um pouco complicado. Esses objetos são classes ou estruturas customizadas, e olhar dentro deles não é tão fácil no Xcode como em outros ambientes de desenvolvimento.

Se eu fosse você, faria NSLog os valores que você quer ver, com alguma descrição.

ie:

NSLog(@"Description of object & time: %i", indexPath.row);

11
Sim, NSLog é uma possibilidade, mas não uma alternativa confortável para depuração. Estou muito surpreso que não haja como exibir os valores desejados. Isso pertence à funcionalidade básica de um ambiente de desenvolvimento.
Manni

2
A coisa mais irritante sobre o XCode. Patético.
ryan0,

1

Experimente Executar-> Mostrar-> Expressões

Digite o nome da matriz ou o que estiver procurando.


Obrigado! Eu inseri "indexPath.row" e "delegate.myData" na janela de expressão, mas sempre aparece "fora do escopo" na coluna "Resumo" :-(
Manni

np, tive o mesmo problema até encontrá-lo;)
tbone

1
defina um ponto de interrupção logo após definir seu array ou qualquer outra coisa e você deve encontrar o valor em Expressões. Boa sorte
tbone
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.