Linux上的Swift调试 - 缺少Backtrace

时间:2017-07-06 16:23:53

标签: swift linux

我正在尝试找到崩溃,甚至将应用程序构建为调试并执行它我似乎没有得到任何符号信息。

我在控制台收到的输出是:

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

2 个答案:

答案 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)

在Linux上启用Core Dump,并使用gdb进行追溯。

  1. 通过修改/etc/security/limits.conf

    启用核心转储
    • 在该文件中,添加以下两行
      • * soft core unlimited
      • * hard core unlimited
  2. 退出外壳,然后重新登录(无需重新启动)

  3. 仔细检查修改是否有效
    • $ ulimit -c应该返回unlimited
  4. 运行程序,当它崩溃时,文件名core将出现在同一目录中
  5. 使用$ gdb <executable> <core-file>
  6. 进行调试

示例

$ 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

它将崩溃,现在您将在coreapp.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进行构建时,后向跟踪将包括正确的文件名和行号。