Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crash TaskFetchOriginalImageData on data.append #738

Open
lukluca opened this issue Dec 6, 2023 · 4 comments
Open

Crash TaskFetchOriginalImageData on data.append #738

lukluca opened this issue Dec 6, 2023 · 4 comments
Labels

Comments

@lukluca
Copy link

lukluca commented Dec 6, 2023

Hi!

I just noticed that there is a crash on TaskFetchOriginalImageData.

this is the stack trace

Signal: SIGTRAP
EXC_BREAKPOINT (SIGTRAP): EXC_BREAKPOINT (SIGTRAP)

libswiftCore.dylib
assertionFailure(::file:line🎏) + 248
libswiftCore.dylib
assertionFailure(:
:file:line🎏) + 248
Foundation
__DataStorage.replaceBytes(in:with:length:) + 2232
Foundation
Data.InlineSlice.append(contentsOf:) + 100
Foundation
Data.Representation.append(contentsOf:) + 356
Foundation
0x1a35d2000 + 3496304
Foundation
Data.append(
:) + 148
Circle
TaskFetchOriginalImageData.dataTask(didReceiveData:response:) (TaskFetchOriginalImageData.swift:115)
Circle
partial apply for closure #1 in closure #1 in TaskFetchOriginalImageData.loadData(urlRequest:finish:) (TaskFetchOriginalImageData.swift:77)
Circle
thunk for @escaping @callee_guaranteed @sendable () -> () (:0)
libdispatch.dylib
0x1aff91000 + 407464
libdispatch.dylib
0x1aff91000 + 411520
libdispatch.dylib
0x1aff91000 + 259836
libdispatch.dylib
0x1aff91000 + 262576
libdispatch.dylib
0x1aff91000 + 302868
libsystem_pthread.dylib
_pthread_wqthread + 284

On iOS 16

Nuke version 12.1.6

Seems that the affected line is inside this func

private func dataTask(didReceiveData chunk: Data, response: URLResponse)

of TaskFetchOriginalImageData, while appending data!

Unfortunately I am not able to replicate the crash, It happens in production few few times!

Thanks,
Luca

@kean
Copy link
Owner

kean commented Feb 18, 2024

Hey, are you still able to reproduce this issue with the latest version?

@larryonoff
Copy link
Contributor

larryonoff commented Feb 29, 2024

I have similar crash, 5 crash events affecting 4 users last 30 days.

iOS: 15, 16 (not iOS 17)
Nuke: 12.4.0

Crashed: com.github.kean.Nuke.ImagePipeline
0  Foundation                     0x359758 __DataStorage.init(bytes:length:copy:deallocator:offset:) + 368
1  Foundation                     0x35c39c Data.InlineSlice.ensureUniqueReference() + 160
2  Foundation                     0x35d55c Data.InlineSlice.append(contentsOf:) + 32
3  Foundation                     0x362444 Data._Representation.append(contentsOf:) + 356
4  Foundation                     0x355970 specialized __DataStorage.withUnsafeBytes<A>(in:apply:) + 92
5  Foundation                     0x365ee0 Data.append(_:) + 148
6  BEAT                           0x60fabc TaskFetchOriginalImageData.dataTask(didReceiveData:response:) + 115 (TaskFetchOriginalImageData.swift:115)
7  BEAT                           0x6112f8 partial apply for closure #1 in closure #1 in TaskFetchOriginalImageData.loadData(urlRequest:finish:) + 77 (TaskFetchOriginalImageData.swift:77)
8  BEAT                           0x5efcbc thunk for @escaping @callee_guaranteed @Sendable () -> () + 4347624636 (<compiler-generated>:4347624636)
9  libdispatch.dylib              0x637a8 _dispatch_call_block_and_release + 24
10 libdispatch.dylib              0x64780 _dispatch_client_callout + 16
11 libdispatch.dylib              0x3f6fc _dispatch_lane_serial_drain$VARIANT$armv81 + 600
12 libdispatch.dylib              0x401b0 _dispatch_lane_invoke$VARIANT$armv81 + 380
13 libdispatch.dylib              0x49f14 _dispatch_workloop_worker_thread + 608
14 libsystem_pthread.dylib        0x1bd0 _pthread_wqthread + 284
15 libsystem_pthread.dylib        0x1720 start_wqthread + 8

@kean kean added the crash label Apr 20, 2024
@kean
Copy link
Owner

kean commented Apr 24, 2024

Related: #572.

Hey, @larryonoff, do you happen to have any additional information around this crash? The size of the data? The crash message? Due to how rare these crashes seem to be, I suspect it's a memory issue – hitting a hard memory limit? If it is a memory issue, I wonder if I could add some defensive code to limit the size of expected data.

@kean kean changed the title crash TaskFetchOriginalImageData on data.append Crash TaskFetchOriginalImageData on data.append Apr 24, 2024
@larryonoff
Copy link
Contributor

@kean I have only crash from Crashlytics. See it below.

Crashed: com.github.kean.Nuke.ImagePipeline
0  libswiftFoundation.dylib       0xfe768 <redacted> + 344
1  libswiftFoundation.dylib       0xab68 $s10Foundation4DataV11InlineSliceV21ensureUniqueReferenceyyF + 152
2  libswiftFoundation.dylib       0x12fb0 $s10Foundation4DataV11InlineSliceV6append10contentsOfySW_tF + 36
3  libswiftFoundation.dylib       0x13d5c $s10Foundation4DataV15_RepresentationO6append10contentsOfySW_tF + 568
4  BEAT                           0x7b929c TaskFetchOriginalImageData.dataTask(didReceiveData:response:) + 115 (TaskFetchOriginalImageData.swift:115)
5  BEAT                           0x7baad8 partial apply for closure #1 in closure #1 in TaskFetchOriginalImageData.loadData(urlRequest:finish:) + 77 (TaskFetchOriginalImageData.swift:77)
6  BEAT                           0x79949c thunk for @escaping @callee_guaranteed @Sendable () -> () + 4350137500 (<compiler-generated>:4350137500)
7  libdispatch.dylib              0x63094 <redacted> + 24
8  libdispatch.dylib              0x64094 <redacted> + 16
9  libdispatch.dylib              0xa73c <redacted> + 644
10 libdispatch.dylib              0xb1f4 <redacted> + 408
11 libdispatch.dylib              0x14ec8 <redacted> + 632
12 libsystem_pthread.dylib        0x1e00 _pthread_wqthread + 284
13 libsystem_pthread.dylib        0x192c start_wqthread + 8
Screenshot 2024-04-25 at 11 41 43

I would like to add that we had another similar issue (not with Nuke), when downloading video files incrementally. Our fix was checking the length of Data to get it contents. See the sample below.

func x() {
          let lowerBound = dataRequest.requestedOffset
          let upperBound = lowerBound + Int64(dataRequest.requestedLength)

          dataRequest.respond(with: data[safe: lowerBound..<upperBound])
}


private extension Data {
  subscript(
    safe range: Range<Int64>
  ) -> Data {
    guard !isEmpty else {
      return Data()
    }

    let safeRange = range.clamped(to: 0..<Int64(count))
    guard !safeRange.isEmpty else {
      return Data()
    }

    return self[safeRange]
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants