我正在尝试找到崩溃,甚至将应用程序构建为调试并执行它我似乎没有得到任何符号信息。
我在控制台收到的输出是:
fatal error: unexpectedly found nil while unwrapping an Optional value
Current stack trace:
0 libswiftCore.so 0x00007f1c51ca51c0 swift_reportError + 120
1 libswiftCore.so 0x00007f1c51cbfbe0 _swift_stdlib_reportFatalError + 62
2 libswiftCore.so 0x00007f1c51ab9be6 <unavailable> + 1186790
3 libswiftCore.so 0x00007f1c51c18ead <unavailable> + 2625197
4 libswiftCore.so 0x00007f1c51ab9be6 <unavailable> + 1186790
5 libswiftCore.so 0x00007f1c51bd4060 specialized _fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never + 96
6 myProgram 0x000000000045909e <unavailable> + 364702
7 myProgram 0x0000000000423f37 <unavailable> + 147255
8 libdispatch.so 0x00007f1c5276e177 <unavailable> + 278903
9 libdispatch.so 0x00007f1c52779edd <unavailable> + 327389
10 libdispatch.so 0x00007f1c5277a890 <unavailable> + 329872
11 libdispatch.so 0x00007f1c5277c5f4 <unavailable> + 337396
12 libdispatch.so 0x00007f1c5279aa18 <unavailable> + 461336
13 libpthread.so.0 0x00007f1c50c6f6ba <unavailable> + 30394
14 libc.so.6 0x00007f1c4f7b9370 clone + 109
Illegal instruction (core dumped)
我根本无法找到任何扩展此信息的方法,虽然我可以查看地图文件。我觉得现在使用现代工具我们已经超越了这个领域。
是否有人有任何指针,或者确实知道如何生成包含更多信息的构建。
Ubuntu 16.04,Swift 3.1.1
答案 0 :(得分:8)
所以,遗憾的是,这似乎是lldb中的一个错误,它在ELF可执行文件中使用了本地符号,dladdr
无法在Linux平台上找到它们。
请在此处查看错误报告: https://bugs.swift.org/browse/SR-755
注意:
好消息是,有一个bash脚本可以为你完成所有工作。说明很轻微,但这是你需要做的:
下载此脚本: https://raw.githubusercontent.com/apple/swift/master/utils/symbolicate-linux-fatal
Exectute您崩溃的应用程序。
$ myApp &> crash.log
然后执行脚本。
$ ./symbolicate-linux-fatal myApp crash.log
它帮助我永无止境。
答案 1 :(得分:1)
Core Dump
,并使用gdb
进行追溯。通过修改/etc/security/limits.conf
* soft core unlimited
* hard core unlimited
退出外壳,然后重新登录(无需重新启动)
$ ulimit -c
应该返回unlimited
core
将出现在同一目录中$ gdb <executable> <core-file>
$ mkdir testCore && cd testCore
$ touch app.swift
// app.swift
func thisWillCrash()
{
fatalError("crashing on purpose")
}
func wrapperFn()
{
thisWillCrash()
}
wrapperFn()
$ swiftc -g app.swift
这将输出名为app
的可执行文件。运行它:
$ ./app
它将崩溃,现在您将在core
和app.swift
旁边有一个名为app
的文件
使用gdb
获取回溯:
$ gdb app core
gdb
启动后,出现gdb提示符,运行bt
命令。在运行Raspbian Buster的Raspberry Pi 3B,运行Swift 5.1.5的情况下,这是我得到的跟踪:
(gdb) bt
#0 0x76d5c974 in $ss17_assertionFailure__4file4line5flagss5NeverOs12StaticStringV_SSAHSus6UInt32VtFTf4xnnnn_n () from /home/pi/swift/usr/lib/swift/linux/libswiftCore.so
#1 0x76aa07b8 in $ss17_assertionFailure__4file4line5flagss5NeverOs12StaticStringV_SSAHSus6UInt32VtF
() from /home/pi/swift/usr/lib/swift/linux/libswiftCore.so
#2 0x004f4ab8 in $s3app13thisWillCrashyyF ()
#3 0x004f4ad0 in $s3app9wrapperFnyyF ()
#4 0x004f49c4 in main ()
当我在具有多个文件的真实项目中执行此操作并使用spm
进行构建时,后向跟踪将包括正确的文件名和行号。