Swift “erro: na importação automática: falha ao obter o módulo 'foo' do contexto AST:”

9

Com a seguinte configuração ( gist ):

Package.swift:

import PackageDescription

let package = Package(
    name: "foo",
    dependencies: [
        .Package(url: "https://github.com/rxwei/LLVM_C", majorVersion: 1, minor: 0)
    ]
)

Makefile:

all:
    @swift build \
        -Xcc -I'llvm-config --includedir' \
        -Xlinker -L'llvm-config --libdir' \
        -Xlinker -rpath -Xlinker 'llvm-config --libdir'

main.swift:

import LLVM_C.Core

func foo(_ a: Int) {
    let b = a * a
    print(b)
}

foo(4)

Depois de compilar um executável com make e iniciar o executável em um depurador, não consigo imprimir os valores de nenhuma variável:

(lldb) b foo
Breakpoint 1: where = foo'foo.foo (Swift.Int) -> () + 12 at main.swift:4, address = 0x00000001000014dc
(lldb) r
Process 14376 launched: '/Users/emlai/Code/foo/.build/debug/foo' (x86_64)
Process 14376 stopped
* thread #1: tid = 0x226d5, 0x00000001000014dc foo'foo(a=4) -> () + 12 at main.swift:4, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x00000001000014dc foo'foo(a=4) -> () + 12 at main.swift:4
   1    import LLVM_C.Core
   2    
   3    func foo(_ a: Int) {
-> 4        let b = a * a
   5        print(b)
   6    }
   7    
(lldb) p a
error: in auto-import:
failed to get module 'foo' from AST context:

(lldb) p a
Shared Swift state for foo has developed fatal errors and is being discarded.
REPL definitions and persistent names/types will be lost.
warning: Swift error in module foo.
Debug info from this module will be unavailable in the debugger.

error: in auto-import:
failed to get module 'foo' from AST context

Se eu comentar a linha import LLVM_C.Core , tudo funcionará corretamente.

Isso está me impedindo de depurar meu projeto e avançar no progresso. Como posso consertar isso?

    
por emlai 05.11.2016 в 15:25
fonte

1 resposta

2

A pesquisa na web por esse problema resulta apenas em "its a lldb bug". A única maneira que encontrei para depurar é depurar testes. Mas AFAIK você não pode executar testes com o próprio script main.swift . Isso resulta em multiple definition of 'main' .

Portanto, basta seguir as instruções aqui link para criar a hierarquia de arquivos necessária para o pacote com testes ( com swift package init ou manualmente), escreva alguns testes, execute swift test e, finalmente, lldb .build/debug/fooPackageTests.xctest ( <binary name>PackageTests.xctest é arquivo binário para executar testes). Eu suponho que é compilado de forma diferente em algum ponto ao invés de binário comum. Pelo menos isso funcionou no meu caso:)

Boa sorte com a depuração! :)

    
por orange 14.12.2016 / 14:57
fonte