fzwoch / obs-teleport

An OBS Studio plugin for an open NDI-like replacement. Pretty simple, straight forward. No NDI compatibility in any form.
GNU General Public License v2.0
438 stars 16 forks source link

teleport causing OBS to hang on exit (macOS) #33

Closed yamyamyamyamyam closed 2 years ago

yamyamyamyamyam commented 2 years ago

Hi again,

I've noticed that on macOS, Teleport is frequently causing my OBS to hang and consume resources on exit, regardless of whether any Teleport sources are added to any scenes. I took a spindump, which you can find here:

https://gist.github.com/yamyamyamyamyam/ab8a125b9f9e57b46da32e598c3b611f

My reproduction steps (does not occur every time, but pretty often):

  1. Open OBS
  2. Open settings
  3. Close settings
  4. Close OBS

Let me know if there's anything else I can do to help debug this. Thanks!

fzwoch commented 2 years ago

Is 2. and 3. the OBS settings, or the Teleport Output preference dialog?

The debugger throws weird things when trying to open the preference dialog. I can't make any sense out of it though. It seems to break when the callback for the menu is supposed to be called, but it does not even reach there.

Does this happen with the x86_64 version on either native or running under Rosetta the same?

At the moment I have no idea why this is happening.

yamyamyamyamyam commented 2 years ago

2 and 3 are the OBS settings, which is why I found it odd; I was not directly interacting with Teleport to trigger the hang.

I'm using a nightly build with native arm support as well as Apple's new General Capture code. I just tried with the old official 27.2.4 stable x86_64 build, and I can't trigger the hang there. I tried with a nightly x86_64 build, and the issue does occur there.

So there might be some bisecting in order to figure out exactly what's causing the regression. Possibly you'd just want to wait until there is a settled release candidate or something.

fzwoch commented 2 years ago

Thant\s interesting, thanks for checking.

It may as well be something they have changed and some things need to be done differently than before. Or maybe a dependency they have updated.

If you find something out let me know.

fzwoch commented 2 years ago

Just for completeness here is the current crash trace:

Process 817 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x000000013fcdd444 obs-teleport.so`notok + 4
obs-teleport.so`notok:
->  0x13fcdd444 <+4>:  str    x8, [x8]
    0x13fcdd448 <+8>:  b      0x13fcdd448               ; <+8>
    0x13fcdd44c <+12>: udf    #0x0

obs-teleport.so`runtime.open_trampoline.abi0:
    0x13fcdd450 <+0>:  str    x30, [sp, #-0x10]!
Target 0: (OBS) stopped.
(lldb) bt all
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x000000013fcdd444 obs-teleport.so`notok + 4
    frame #1: 0x000000013fcdda40 obs-teleport.so`runtime.sigaltstack_trampoline.abi0 + 32
    frame #2: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #4: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #3
    frame #0: 0x00000001ac81674c libsystem_kernel.dylib`__workq_kernreturn + 8
  thread #4
    frame #0: 0x00000001ac81674c libsystem_kernel.dylib`__workq_kernreturn + 8
  thread #5
    frame #0: 0x00000001ac84d078 libsystem_pthread.dylib`start_wqthread
  thread #6, name = 'libobs: hotkey thread'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000101085170 libobs`os_event_timedwait(event=0x000060000330cfc0, milliseconds=25) at threading-posix.c:121:10 [opt]
    frame #3: 0x000000010101ce4c libobs`obs_hotkey_thread(arg=<unavailable>) at obs-hotkey.c:1384:9 [opt]
    frame #4: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #7, name = 'tiny_tubular_task_thread'
    frame #0: 0x00000001ac81490c libsystem_kernel.dylib`semaphore_wait_trap + 8
    frame #1: 0x00000001010853b4 libobs`os_sem_wait(sem=<unavailable>) at threading-posix.c:213:10 [opt]
    frame #2: 0x00000001010806bc libobs`tiny_tubular_task_thread(param=0x00006000035116c0) at task.c:139:25 [opt]
    frame #3: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #8, name = 'Thread (pooled)'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000104a954e8 QtCore`___lldb_unnamed_symbol338$$QtCore + 300
    frame #3: 0x0000000104a951a0 QtCore`___lldb_unnamed_symbol337$$QtCore + 92
    frame #4: 0x0000000104a950f0 QtCore`QWaitCondition::wait(QMutex*, QDeadlineTimer) + 104
    frame #5: 0x0000000104a91678 QtCore`___lldb_unnamed_symbol309$$QtCore + 628
    frame #6: 0x0000000104a8d0c0 QtCore`___lldb_unnamed_symbol275$$QtCore + 348
    frame #7: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #9, name = 'Thread (pooled)'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000104a954e8 QtCore`___lldb_unnamed_symbol338$$QtCore + 300
    frame #3: 0x0000000104a951a0 QtCore`___lldb_unnamed_symbol337$$QtCore + 92
    frame #4: 0x0000000104a950f0 QtCore`QWaitCondition::wait(QMutex*, QDeadlineTimer) + 104
    frame #5: 0x0000000104a91678 QtCore`___lldb_unnamed_symbol309$$QtCore + 628
    frame #6: 0x0000000104a8d0c0 QtCore`___lldb_unnamed_symbol275$$QtCore + 348
    frame #7: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #10, name = 'Thread (pooled)'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000104a954e8 QtCore`___lldb_unnamed_symbol338$$QtCore + 300
    frame #3: 0x0000000104a951a0 QtCore`___lldb_unnamed_symbol337$$QtCore + 92
    frame #4: 0x0000000104a950f0 QtCore`QWaitCondition::wait(QMutex*, QDeadlineTimer) + 104
    frame #5: 0x0000000104a91678 QtCore`___lldb_unnamed_symbol309$$QtCore + 628
    frame #6: 0x0000000104a8d0c0 QtCore`___lldb_unnamed_symbol275$$QtCore + 348
    frame #7: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #11, name = 'Thread (pooled)'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000104a954e8 QtCore`___lldb_unnamed_symbol338$$QtCore + 300
    frame #3: 0x0000000104a951a0 QtCore`___lldb_unnamed_symbol337$$QtCore + 92
    frame #4: 0x0000000104a950f0 QtCore`QWaitCondition::wait(QMutex*, QDeadlineTimer) + 104
    frame #5: 0x0000000104a91678 QtCore`___lldb_unnamed_symbol309$$QtCore + 628
    frame #6: 0x0000000104a8d0c0 QtCore`___lldb_unnamed_symbol275$$QtCore + 348
    frame #7: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #12, name = 'audio-io: audio thread'
    frame #0: 0x00000001ac81808c libsystem_kernel.dylib`__semwait_signal + 8
    frame #1: 0x00000001ac720fbc libsystem_c.dylib`nanosleep + 220
    frame #2: 0x00000001ac720ed4 libsystem_c.dylib`usleep + 68
    frame #3: 0x0000000101084858 libobs`os_sleepto_ns_fast(time_target=67965395708) at platform-nix.c:192:3 [opt]
    frame #4: 0x0000000101070440 libobs`audio_thread(param=0x00000001201b8020) at audio-io.c:229:3 [opt]
    frame #5: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #13, name = 'video-io: video thread'
    frame #0: 0x00000001ac81490c libsystem_kernel.dylib`semaphore_wait_trap + 8
    frame #1: 0x00000001010853b4 libobs`os_sem_wait(sem=<unavailable>) at threading-posix.c:213:10 [opt]
    frame #2: 0x0000000101072b88 libobs`video_thread(param=0x0000000106152c20) at video-io.c:183:9 [opt]
    frame #3: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #14, name = 'libobs: graphics thread'
    frame #0: 0x00000001ac81808c libsystem_kernel.dylib`__semwait_signal + 8
    frame #1: 0x00000001ac720fbc libsystem_c.dylib`nanosleep + 220
    frame #2: 0x00000001010847e0 libobs`os_sleepto_ns(time_target=<unavailable>) at platform-nix.c:175:9 [opt]
    frame #3: 0x000000010104e398 libobs`obs_graphics_thread_loop [inlined] video_sleep(video=0x000000010603d548, gpu_active=false, p_time=0x000000010603d790, interval_ns=33333333) at obs-video.c:796:6 [opt]
    frame #4: 0x000000010104e388 libobs`obs_graphics_thread_loop(context=<unavailable>) at obs-video.c:1072:2 [opt]
    frame #5: 0x0000000101082e00 libobs`obs_graphics_thread_loop_autorelease(context=0x0000000170516f50) at obs-cocoa.m:1748:10 [opt]
    frame #6: 0x000000010104e750 libobs`obs_graphics_thread(param=0x000000010603d420) at obs-video.c:1132:9 [opt]
    frame #7: 0x0000000101082dc4 libobs`obs_graphics_thread_autorelease(param=<unavailable>) at obs-cocoa.m:1741:10 [opt]
    frame #8: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #17
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x000000013fcddca8 obs-teleport.so`runtime.pthread_cond_wait_trampoline.abi0 + 24
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #4: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #5: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #18
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac852868 libsystem_pthread.dylib`_pthread_cond_wait + 1280
    frame #2: 0x000000013fcddcdc obs-teleport.so`runtime.pthread_cond_timedwait_relative_np_trampoline.abi0 + 28
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #4: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #19
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x000000013fcddca8 obs-teleport.so`runtime.pthread_cond_wait_trampoline.abi0 + 24
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #4: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #5: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #20
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x000000013fcddca8 obs-teleport.so`runtime.pthread_cond_wait_trampoline.abi0 + 24
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #4: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #5: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #21
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x000000013fcddca8 obs-teleport.so`runtime.pthread_cond_wait_trampoline.abi0 + 24
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #4: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
    frame #5: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #22
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x000000013fcddca8 obs-teleport.so`runtime.pthread_cond_wait_trampoline.abi0 + 24
    frame #3: 0x000000013fcdc708 obs-teleport.so`runtime.asmcgocall.abi0 + 200
  thread #23, name = 'AMCP Logging Spool'
    frame #0: 0x00000001ac81490c libsystem_kernel.dylib`semaphore_wait_trap + 8
    frame #1: 0x00000001b52a6a2c caulk`caulk::mach::semaphore::wait_or_error() + 28
    frame #2: 0x00000001b528a77c caulk`caulk::concurrent::details::worker_thread::run() + 56
    frame #3: 0x00000001b528a39c caulk`void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*> > >(void*) + 96
    frame #4: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #24, name = 'com.apple.audio.IOThread.client'
    frame #0: 0x00000001ac8148d0 libsystem_kernel.dylib`mach_msg_trap + 8
    frame #1: 0x00000001ac814d40 libsystem_kernel.dylib`mach_msg + 76
    frame #2: 0x00000001ae55ea40 CoreAudio`HALB_MachPort::SendSimpleMessageWithSimpleReply(unsigned int, unsigned int, int, int&, bool, unsigned int) + 104
    frame #3: 0x00000001ae3ebcd0 CoreAudio`HALC_ProxyIOContext::IOWorkLoop() + 3396
    frame #4: 0x00000001ae3ea990 CoreAudio`invocation function for block in HALC_ProxyIOContext::HALC_ProxyIOContext(unsigned int, unsigned int) + 100
    frame #5: 0x00000001ae5b6e60 CoreAudio`HALB_IOThread::Entry(void*) + 88
    frame #6: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #25, name = 'Thread (pooled)'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000104a954e8 QtCore`___lldb_unnamed_symbol338$$QtCore + 300
    frame #3: 0x0000000104a951a0 QtCore`___lldb_unnamed_symbol337$$QtCore + 92
    frame #4: 0x0000000104a950f0 QtCore`QWaitCondition::wait(QMutex*, QDeadlineTimer) + 104
    frame #5: 0x0000000104a91678 QtCore`___lldb_unnamed_symbol309$$QtCore + 628
    frame #6: 0x0000000104a8d0c0 QtCore`___lldb_unnamed_symbol275$$QtCore + 348
    frame #7: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #26, name = 'Thread (pooled)'
    frame #0: 0x00000001ac818290 libsystem_kernel.dylib`__psynch_cvwait + 8
    frame #1: 0x00000001ac85283c libsystem_pthread.dylib`_pthread_cond_wait + 1236
    frame #2: 0x0000000104a954e8 QtCore`___lldb_unnamed_symbol338$$QtCore + 300
    frame #3: 0x0000000104a951a0 QtCore`___lldb_unnamed_symbol337$$QtCore + 92
    frame #4: 0x0000000104a950f0 QtCore`QWaitCondition::wait(QMutex*, QDeadlineTimer) + 104
    frame #5: 0x0000000104a91678 QtCore`___lldb_unnamed_symbol309$$QtCore + 628
    frame #6: 0x0000000104a8d0c0 QtCore`___lldb_unnamed_symbol275$$QtCore + 348
    frame #7: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #27
    frame #0: 0x00000001ac84d078 libsystem_pthread.dylib`start_wqthread
  thread #28, name = 'com.apple.NSEventThread'
    frame #0: 0x00000001ac8148d0 libsystem_kernel.dylib`mach_msg_trap + 8
    frame #1: 0x00000001ac814d40 libsystem_kernel.dylib`mach_msg + 76
    frame #2: 0x00000001ac91ec1c CoreFoundation`__CFRunLoopServiceMachPort + 372
    frame #3: 0x00000001ac91d0cc CoreFoundation`__CFRunLoopRun + 1180
    frame #4: 0x00000001ac91c490 CoreFoundation`CFRunLoopRunSpecific + 600
    frame #5: 0x00000001af5e86f4 AppKit`_NSEventThread + 196
    frame #6: 0x00000001ac85226c libsystem_pthread.dylib`_pthread_start + 148
  thread #29
    frame #0: 0x00000001ac84d078 libsystem_pthread.dylib`start_wqthread
  thread #30
    frame #0: 0x00000001ac84d078 libsystem_pthread.dylib`start_wqthread
  thread #31
    frame #0: 0x0000000000000000
fzwoch commented 2 years ago

https://github.com/golang/go/issues/48437 maybe related, or at least similar.

fzwoch commented 2 years ago

I cannot recreate the issue when I build OBS directly via CMake and not OBS's CI script.

So it may be due to the bundled dependencies of OBS what will be used when using the CI script. A regular build will use the local machines dependencies installed via brew.

Or it could be another plugin and is build when run the CI script which I have disabled in the local build (Browser, VST, AJA.. I don't know).

fzwoch commented 2 years ago

There was an update to the external deps in the OBS repo. I think I tried it and didn't immediately show the issue. Not sure if that fixes it - but closing for now unless it really seems to be caused by this plugin.