[swift-users] stack trace of Swift executable

Greg Parker gparker at apple.com
Thu May 4 02:13:06 CDT 2017


The stack trace printed by the process will never include file and line numbers. Swift and ObjC work the same way here.

You want to find the crash report generated by the OS. Either it will have file and line numbers already, or it will contain enough information to look up the file and line numbers after the fact (part of a process called "symbolication").


> On May 3, 2017, at 2:47 AM, Alex Blewitt <alblue at apple.com> wrote:
> 
> Greg,
> 
> This occurs when compiled with swiftc -g as well. In fact, I think 'swift build', when run by default, will compile with swiftc -g. It's only when you run 'swift build --configuration release' that it will compile without it.
> 
> $ swiftc --version
> Apple Swift version 3.1 (swift-3.1.1-RELEASE)
> Target: x86_64-apple-macosx10.9
> $ swiftc -g main.swift
> $ ./main
> Hello, world!
> fatal error: unexpectedly found nil while unwrapping an Optional value
> Current stack trace:
> 0    libswiftCore.dylib                 0x000000010edc7160 swift_reportError + 125
> 1    libswiftCore.dylib                 0x000000010ede3ac0 _swift_stdlib_reportFatalError + 60
> 2    libswiftCore.dylib                 0x000000010ebd4260 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
> 3    libswiftCore.dylib                 0x000000010ed4f120 partial apply for (_fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never).(closure #2) + 109
> 4    libswiftCore.dylib                 0x000000010ebd4260 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
> 5    libswiftCore.dylib                 0x000000010ed01d00 specialized _fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never + 96
> 6    main                               0x000000010eb91340 say(message : String?) -> () + 248
> 7    main                               0x000000010eb911e0 main + 328
> 8    libdyld.dylib                      0x00007fffb444d234 start + 1
> Illegal instruction: 4
> 
> Note that lldb can symbolicate the result and identify the return value, by looking at the backtrace:
> 
> $ lldb main
> (lldb) target create "main"
> Current executable set to 'main' (x86_64).
> (lldb) run
> Process 33032 launched: '/tmp/main' (x86_64)
> Hello, world!
> fatal error: unexpectedly found nil while unwrapping an Optional value
> 2017-05-03 10:41:17.340963+0100 main[33032:55100807] fatal error: unexpectedly found nil while unwrapping an Optional value
> Current stack trace:
> 0    libswiftCore.dylib                 0x00000001002c1160 swift_reportError + 125
> 1    libswiftCore.dylib                 0x00000001002ddac0 _swift_stdlib_reportFatalError + 60
> 2    libswiftCore.dylib                 0x00000001000ce260 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
> 3    libswiftCore.dylib                 0x0000000100249120 partial apply for (_fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never).(closure #2) + 109
> 4    libswiftCore.dylib                 0x00000001000ce260 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
> 5    libswiftCore.dylib                 0x00000001001fbd00 specialized _fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never + 96
> 6    main                               0x0000000100001340 say(message : String?) -> () + 248
> 7    main                               0x00000001000011e0 main + 328
> 8    libdyld.dylib                      0x00007fffb444d234 start + 1
> Process 33032 stopped
> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
>     frame #0: 0x00000001001fbd60 libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never + 96
> libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never:
> ->  0x1001fbd60 <+96>: ud2    
>     0x1001fbd62 <+98>: nopw   %cs:(%rax,%rax)
> 
> libswiftCore.dylib`protocol witness table accessor for <A> Swift.AnySequence<A> : Swift.Sequence in Swift:
>     0x1001fbd70 <+0>:  pushq  %rbp
>     0x1001fbd71 <+1>:  movq   %rsp, %rbp
> (lldb) bt
> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
>   * frame #0: 0x00000001001fbd60 libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never + 96
>     frame #1: 0x0000000100001438 main`say(message=nil) -> () at main.swift:5
>     frame #2: 0x0000000100001328 main`main at main.swift:8
>     frame #3: 0x00007fffb444d235 libdyld.dylib`start + 1
>     frame #4: 0x00007fffb444d235 libdyld.dylib`start + 1
> 
> I suspect this is because Swift is generating a .dSYM which is read by LLDB but either not read or not loaded by the swift runtime when producing the backtrace:
> 
> $ find .
> .
> ./main
> ./main.dSYM
> ./main.dSYM/Contents
> ./main.dSYM/Contents/Info.plist
> ./main.dSYM/Contents/Resources
> ./main.dSYM/Contents/Resources/DWARF
> ./main.dSYM/Contents/Resources/DWARF/main
> ./main.swift
> 
> Here's the main file, for repeatability:
> 
> $ cat main.swift 
> print("Hello, world!")
> let x: String? = nil
> 
> func say(message: String?) {
>     print(x!) // intentional crash
> }
> 
> say(message: x)
> 
> Alex
> 
>> On 2 May 2017, at 22:43, Greg Parker <gparker at apple.com <mailto:gparker at apple.com>> wrote:
>> 
>> That doesn't look symbolicated. If it were symbolicated, and the build used -g, you would have a file and line number for the main+345 frame.
>> 
>> 
>>> On May 2, 2017, at 2:31 PM, Nick Snyder via swift-users <swift-users at swift.org <mailto:swift-users at swift.org>> wrote:
>>> 
>>> In practice, I would need the stack trace first to figure out how to reproduce the issue, so lldb doesn't really help.
>>> 
>>> How would I go about symbolicating this further on macOS (Xcode or otherwise)?
>>> 
>>> From reading the docs it seems like the crash report I get is already completely symbolicated:
>>> https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATION-_DETERMINING_WHETHER_A_CRASH_REPORT_IS_SYMBOLICATED <https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATION-_DETERMINING_WHETHER_A_CRASH_REPORT_IS_SYMBOLICATED>
>>> 
>>> On Tue, May 2, 2017 at 1:21 AM, Alex Blewitt <alblue at apple.com <mailto:alblue at apple.com>> wrote:
>>> If you can reproduce it, and run it under lldb, it will print the source line for you:
>>> 
>>> $ lldb .build/debug/main
>>> (lldb) target create ".build/debug/main"
>>> ruCurrent executable set to '.build/debug/main' (x86_64).
>>> (lldb) run
>>> Process 19013 launched: '/private/tmp/main/.build/debug/main' (x86_64)
>>> Hello, world!
>>> fatal error: unexpectedly found nil while unwrapping an Optional value
>>> 2017-05-02 09:17:11.351608+0100 asdf[19013:54205130] fatal error: unexpectedly found nil while unwrapping an Optional value
>>> Current stack trace:
>>> 0    libswiftCore.dylib                 0x00000001002c1160 swift_reportError + 125
>>> 1    libswiftCore.dylib                 0x00000001002ddac0 _swift_stdlib_reportFatalError + 60
>>> 2    libswiftCore.dylib                 0x00000001000ce260 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
>>> 3    libswiftCore.dylib                 0x0000000100249120 partial apply for (_fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never).(closure #2) + 109
>>> 4    libswiftCore.dylib                 0x00000001000ce260 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
>>> 5    libswiftCore.dylib                 0x00000001001fbd00 specialized _fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never + 96
>>> 6    main                               0x0000000100001340 say(message : String?) -> () + 248
>>> 7    main                               0x00000001000011e0 main + 328
>>> 8    libdyld.dylib                      0x00007fffb444d234 start + 1
>>> Process 19013 stopped
>>> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
>>>     frame #0: 0x00000001001fbd60 libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never + 96
>>> libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never:
>>> ->  0x1001fbd60 <+96>: ud2    
>>>     0x1001fbd62 <+98>: nopw   %cs:(%rax,%rax)
>>> 
>>> libswiftCore.dylib`protocol witness table accessor for <A> Swift.AnySequence<A> : Swift.Sequence in Swift:
>>>     0x1001fbd70 <+0>:  pushq  %rbp
>>>     0x1001fbd71 <+1>:  movq   %rsp, %rbp
>>> 
>>> (lldb) bt
>>> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
>>>   * frame #0: 0x00000001001fbd60 libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never + 96
>>>     frame #1: 0x0000000100001438 main`say(message=nil) -> () at main.swift:5
>>>     frame #2: 0x0000000100001328 main`main at main.swift:8
>>>     frame #3: 0x00007fffb444d235 libdyld.dylib`start + 1
>>>     frame #4: 0x00007fffb444d235 libdyld.dylib`start + 1
>>> 
>>> There is a symbolication tool available for Linux in the ~/swift/utils/symbolicate-linux-fatal, and Xcode can do the same symbolication for you as well.
>>> 
>>> Alex
>>> 
>>>> On 28 Apr 2017, at 22:28, Nick Snyder via swift-users <swift-users at swift.org <mailto:swift-users at swift.org>> wrote:
>>>> 
>>>> I have a simple main.swift that looks like this:
>>>> 
>>>> ```
>>>> print("Hello, world!")
>>>> let x: String? = nil
>>>> 
>>>> func say(message: String?) {
>>>>     print(x!) // intentional crash
>>>> }
>>>> 
>>>> say(message: x)
>>>> ```
>>>> 
>>>> Running this results in the crash
>>>> 
>>>> ```
>>>> $ swift build && ./.build/debug/hello
>>>> Hello, world!
>>>> fatal error: unexpectedly found nil while unwrapping an Optional value
>>>> Current stack trace:
>>>> 0    libswiftCore.dylib                 0x0000000110120130 swift_reportError + 129
>>>> 1    libswiftCore.dylib                 0x000000011013cb50 _swift_stdlib_reportFatalError + 60
>>>> 2    libswiftCore.dylib                 0x000000010ff2d250 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
>>>> 3    libswiftCore.dylib                 0x00000001100a7e90 partial apply for (_fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never).(closure #2) + 109
>>>> 4    libswiftCore.dylib                 0x000000010ff2d250 specialized specialized StaticString.withUTF8Buffer<A> ((UnsafeBufferPointer<UInt8>) -> A) -> A + 342
>>>> 5    libswiftCore.dylib                 0x000000011005a9a0 specialized _fatalErrorMessage(StaticString, StaticString, file : StaticString, line : UInt, flags : UInt32) -> Never + 96
>>>> 6    hello                              0x000000010fee6200 main + 345
>>>> 7    libdyld.dylib                      0x00007fffe0375234 start + 1
>>>> Illegal instruction: 4
>>>> ```
>>>> 
>>>> From the crash, how do I map back line 6 to an actual line in main.swift?
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users at swift.org <mailto:swift-users at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-users <https://lists.swift.org/mailman/listinfo/swift-users>
>>> 
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users at swift.org <mailto:swift-users at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users <https://lists.swift.org/mailman/listinfo/swift-users>
>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170504/25ca1ff5/attachment.html>


More information about the swift-users mailing list