2016-12-26 59 views
2

我试图在我的Swift 3.0.2(与3.0.1一起发生)服务器应用程序在Heroku上运行它(它在Ubuntu上运行它)中尝试调用String(contentsOfFile:encoding:),但函数中止程序。显示在heroku logs以下错误:String(contentsOfFile:encoding :)以退出状态中止139

2016-12-26T01:59:01.304535+00:00 heroku[web.1]: Process exited with status 139 

有比其它任何错误消息。我试图读取的文件与应用程序的源文件位于同一目录树中。下面是实际的代码的功能上等同的收缩(在main.swift顶层):

let sqlDirectory = URL(fileURLWithPath: #file).deletingLastPathComponent().path + "/Models/SQL/" 

do { 
    print("reading") 
    fflush(stdout) 
    let a = try String(contentsOfFile: sqlDirectory + "createTables.sql", encoding: .utf8) 
    print("done") 
    fflush(stdout) 
} catch { 
    print("error") 
    fflush(stdout) 
} 

sqlDirectory的运行时间值是/tmp/build_514c5587b46ef976e60d4f039b4d048d/Sources/App/Models/SQL/(散列是在每个构建不同)。它在打印reading后崩溃。 doneerror从不打印。 (标准输出刷新仅用于调试,以确保所有内容都写入标准输出。删除它们不会影响崩溃。)

这是怎么回事?我该如何解决?

我也报告过这个错误here,因为它似乎这可能是一个错误。

+0

状态139是'段错误'(SIGSEGV)。 – user28434

+0

'String(contentsOfFile:encoding:)'抛出,你在do/try/catch上下文中调用它吗?你如何指定文件名和路径?你传递给该呼叫的是什么编码?我对Heroku并不熟悉,但源文件的位置可能不是该进程的当前工作目录。 –

+0

@MartinR修改了问题的细节。 – emlai

回答

0

我检查了FileManager.default.fileExists(atPath: sqlDirectory + "createTables.sql")的结果,它的结果是false

因此,这就解释了为什么String(contentsOfFile:encoding:)崩溃。虽然它应该抛出一个错误而不是崩溃。这是潜在的错误:https://bugs.swift.org/browse/SR-1547,这似乎是由这个错误引起的:https://bugs.swift.org/browse/SR-585

我仍然需要找出Heroku中不存在路径的原因。也许Heroku在构建之后移动或删除所有源文件?