O 'Nome do Projeto' foi compilado com otimização - o passo pode se comportar de maneira estranha; variáveis ​​podem não estar disponíveis

210

Tentar entrar no código AFNetworking gera o seguinte aviso:

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

E é claro que não consigo depurar o código. Para ser específico, estou tentando depurar uma UIImageView+AFNetworkingcategoria que parece impossível. Alterar o código não tem efeito (tentado NSLog, etc) e ao tentar entrar em compiladores vai para o código do assembly e mostra UIImageView+TVASTAFNetworkingcomo nome da categoria que não existe em nenhum lugar da base de código.

insira a descrição da imagem aqui

Usando o Xcode 7. iOS 9 e 8. Cocoapods (sem Framework)

UPDATE Esqueci de mencionar que o Optimizer está definido para as configurações de noneliberação e depuração e, de fato, estou usando o Debugconfig.

insira a descrição da imagem aqui

ATUALIZAÇÃO 2

Strip Debug Symbols Está desligado também.

Mojtaba
fonte
Lembro-me de haver algum tipo de opção "Strip Debug Symbols". Isso provavelmente causaria esse problema. Está desligado?
NobodyNada
1
@NobodyNada Sim Strip Debug Symbolsestá desativado.
Mojtaba
Estranho, eu apenas tentei ativar o Strip Debug Symbol e o aviso desapareceu 8- |
Gomino
@Mojtaba Ei, você descobriu como resolver o problema? Estou com o mesmo problema desde que atualizado para o Xcode 7
Hadu 12/10
@Hadu: Infelizmente Não
Mojtaba

Respostas:

175

Se o seu projeto estiver usando o Swift, há duas configurações "Nível de otimização" separadas na configuração do projeto / destino.

Certifique-se de definir os dois corretamente:

  1. Selecione seu projeto no painel Navegador de Projeto
  2. Selecione as configurações do seu projeto na árvore "PROJETO"
  3. Clique na guia "Configurações de compilação"
  4. Pesquise "Nível de otimização" e você verá duas configurações, uma para LLVM e outra para rápida.
  5. Defina a configuração apropriada ( None [-O0]para LLVM e None [-0none]Swift) para a configuração de compilação em questão.

foi compilado com o passo de otimização pode se comportar de maneira estranha

Fazer isso resolveu esse aviso para mim.

Albert Bori
fonte
1
O que acontece com projetos de linguagem mista ...?
Vive
Qual é a diferença entre LLVM e Swift? Será que Swift é o que eu escrevi no projeto e LLVM é para o que eu estou fazendo no que diz respeito à depuração no depurador ou seja, coisas como po, p, expr...?
Mel
124

Parece que seu projeto está no modo Release. O modo Release compila o aplicativo com muitas otimizações, mas os depuradores odeiam otimizações; portanto, para depurar o aplicativo com confiabilidade, é necessário alterná-lo para o modo Debug, que reduz a otimização e adiciona várias informações de depuração. Para alternar para o modo Debug:

  • Clique no seu esquema no canto superior esquerdo do Xcode.

Clique no seu esquema no canto superior esquerdo do Xcode.

  • Selecione "Editar esquema ..."

Selecione "Editar esquema ..."

  • Clique no menu suspenso "Build Configuration". e mude para o modo Debug.

Clique no menu suspenso "Build Configuration".

Ninguém
fonte
8
Estou usando depuração. e o otimizador está desativado.
Mojtaba
Isso foi interessante. Também porque eu tinha definido o modo Release , alguns dos meus pontos de interrupção não foram atingidos, enquanto outros foram atingidos ¯_ (ツ) _ / ¯
Honey
59

Esse aviso aparece apenas quando você atinge um ponto de interrupção e a fonte está em um projeto em que a otimização está ativada, impedindo que você observe valores reais de variáveis ​​(cada objeto é mostrado como nulo, mesmo que não seja)

No meu caso, isso só aconteceu ao depurar passo a passo através de uma dependência de cocoapod.

Portanto, mesmo que você tenha suas configurações principais de destino e projeto definidas corretamente (Símbolo de depuração de faixa = DESLIGADO e nível de otimização Nenhum), você precisa garantir que seja o mesmo para o projeto Pod do qual está atingindo o ponto de interrupção.

insira a descrição da imagem aqui

Gomino
fonte
Leia outras respostas, eles estão sugerindo o mesmo. mas eles estão todos fora do meu projeto (aka None [-O0])
Mojtaba
2
Sei que você disse que está desabilitado no seu projeto, como no meu, mas você deu uma olhada na configuração dos projetos das dependências do Pod?
Gomino 02/10/2015
O mesmo problema aqui no Xcode 7. Provavelmente, o problema apareceu quando comecei a usar a biblioteca trachkerbird. Mas o ponto de interrupção está dentro do meu próprio código.
Mike
1
Para o projeto Pods, altere a configuração do nível de otimização "PROJECT" para None works. (nenhuma alteração para qualquer destino de pod).
ooops
2
Isto está incorreto. Ele será substituído quando você pod installnovamente. Mude assim .
Iulian Onofrei
13

Acontece que, depois de importar um projeto antigo (Xcode 7.x +) para o novo Xcode 8.3 (8E162), provavelmente devido à otimização do compilador, o Swift Compiler - Nível de Otimização foi definido por padrão como Otimização Rápida de Arquivo Único :

Antes

Mudando para nenhum, resolveu o problema:

depois de

valvoline
fonte
Eu fiz isso. Não funcionou para mim. Estou enfrentando esse problema no ios build que é gerado pelo Unity.
21915 Chandler
11

Editor-> Validate Settingsconfirme todas as alterações. Então você deve obterNível de otimização do Swift Compiler em vigor

Defina Debug como None.

james sa
fonte
1
Eu fiz isso. Não funcionou para mim. Estou enfrentando esse problema no ios build que é gerado pelo Unity.
21915 Chandler
9

Esta foi a solução para mim ...

Na linha da resposta do gimino, se você estiver usando cocoapods, adicione uma linha como esta ao Podfile:

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

ou para versões de cocoapods> = 1.0 (obrigado Diejmon)

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

Onde MyProject possui 'Debug-local', 'Debug-staging', 'Debug-PRODUCTION' como configurações de depuração, além do padrão 'Debug'

Por padrão, os cocoapods geralmente geram configurações de pod como Release, essa linha de Podfile permite que você diga que estão depurando.

wils
fonte
9

Encontrei o mesmo problema hoje e descobri (pelo menos no meu caso). Também estou usando o CocoaPods e estava tendo esse problema ao executar meu alvo de teste (Swift misturado com ObjC).

Estou usando o Xcode 7.2, com o iOS 9.2 SDK.

Na imagem abaixo, você pode ver as otimizações para o destino e o projeto antes da minha alteração:

nível de otimização antes da alteração

O surpreendente é que, embora a otimização resolvida seja None [-O0] , somente após alterar a configuração do projeto de -Os para -O0 o compilador parou de otimizar o destino.

Abaixo, você pode ver minhas configurações finais:

nível de otimização após a alteração

André Neves
fonte
7

Já faz muito tempo, mas finalmente resolvi o problema. Há uma terceira bandeira otimização LTOou Link Time Optimizatione Surpreendentemente ninguém ter mencionado aqui e por algum motivo eu não prestei atenção a ela também. Está logo acima da Optimization Levelconfiguração, como você pode ver em muitas capturas de tela postadas aqui.

Portanto, para resumir, existem três sinalizadores de otimização diferentes que você deseja desativar para depuração:

  • Otimização do tempo de link LLVM ( -flto)
  • Nível de otimização do LLVM ( -O)
  • Nível de otimização do Swift Compiler

insira a descrição da imagem aqui

Mais informações sobre o LTO: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
fonte
2
Eu fiz isso. Não funcionou para mim. Estou enfrentando esse problema no ios build que é gerado pelo Unity.
21915 Chandler
@ Chandni, Aqui enfrentei o mesmo problema, você encontrou a solução?
Ranjani
2

Se você precisar desativar as otimizações dos seus pods Swift para poder depurá-los, adicione o seguinte ao seu Podfile. Isso desativará as otimizações apenas para compilações de depuração.

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.name == "Debug"
        config.build_settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
      end
    end
  end
end
Al Priest
fonte
1

Você tem certeza de que sua configuração de depuração não otimiza o código (não deveria)? Parece que você ativou acidentalmente otimizações para a configuração de depuração e deve desativá-la nas configurações do destino.

Can Poyrazoğlu
fonte
3
a otimização está desativada para tudo. mesmo compilação de lançamento apenas para se certificar
Mojtaba
@Mojtba Mas o modo de liberação ativa as otimizações!
NobodyNada
0

Esse erro aconteceu comigo duas vezes e, em todos os casos, houve um erro no parâmetro URL usado para solicitar um serviço. Em um caso, a URL tinha algum espaço na seção port; no outro, algum valor opcional não estava sendo desembrulhado.

Portanto, a correção era para garantir que o URL da solicitação seja bem formado. Mais informações sobre o meu caso e relatos semelhantes aqui .

le0diaz
fonte
0

Tudo o que fiz foi limpar ( Product > Clean) meu projeto e executá-lo novamente

raed
fonte
0

Isso pode ser uma simplificação excessiva, mas você está construindo para o Release ou com otimização (que remove símbolos do Swift ou LLVM) muito alto? Nesse caso, edite seu esquema e mude para Depurar ou edite suas Configurações de compilação para otimização rápida ou LLVM para Nenhum (0).

Aaron
fonte
0

Caso alguém esteja enfrentando esse problema ao depurar um pod que usa uma biblioteca C internamente, há outra coisa que você precisa alterar nas configurações do projeto para fazê-lo funcionar, além de tudo o mais listado no encadeamento.

Vá para as configurações do projeto Pods -> Seu destino usando C -> Configurações de compilação -> Apple Clang - Sinalizadores do compilador personalizado -> Outros sinalizadores C e remova o -O3sinalizador que chegou de alguma forma.

Dmitry Serov
fonte