Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

With the following setup (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)

After compiling an executable with make and starting the executable in a debugger, I cannot print the values of any variables:

(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

If I comment out the import LLVM_C.Core line, everything works properly.

This is preventing me from debugging my project and making forward progress. How can I fix this?

like image 392
emlai Avatar asked Nov 05 '16 14:11

emlai


1 Answers

Searching the web for this problem results only to "its a lldb bug". The only way I've found to debug is to debug tests. But AFAIK you can't run tests with having own main.swift script. This results into multiple definition of 'main'.

So just follow instructions here https://swift.org/getting-started/#using-the-package-manager to create needed file hierarchy for package with tests (with swift package init or manually), write some tests, run swift test and, finally, lldb .build/debug/fooPackageTests.xctest (<binary name>PackageTests.xctest is binary file for running tests). I suppose it is compiled differently in some point rather than common binary. At least that worked in my case :)

Good luck with debugging! :)

like image 65
orange Avatar answered Nov 13 '22 03:11

orange