2022-04-22 05:38 PM
現在Webex SDK 3.2.1を利用したアプリケーションを運用しています。
Guest issuer JWT tokenの発行時にアプリケーションがCrashする事象が発生しております。
(約20回に1回程度の頻度で発生している)
調査していたところ新しいVerが公開されており
Webex iOS SDK 3.3.0での更新内容に下記の記載がありました。
"special characters"の具体的な内容をご存じの方いらっしゃらないでしょうか。
Release 3.3.0 release · webex/webex-ios-sdk · GitHub
なおCrash時のログは下記となっておりました。
同様の事象が発生して解決されたなど
情報をお持ちの方がいらっしゃいましたら共有いただけないでしょうか。
Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000 Exception Codes: 0x0000000000000001, 0x0000000000000000 0 WebexSDK 0x1080cd110 TelephonyService::getActiveCall() + 4 1 WebexSDK 0x108114cc4 TelephonyService::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 172 2 WebexSDK 0x107c8ac94 std::__1::__function::__func<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0, std::__1::allocator<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0>, bool (std::__1::shared_ptr<IService> const&)>::operator()(std::__1::shared_ptr<IService> const&) + 32 3 WebexSDK 0x107c6cb24 CoreFramework::forEachServiceUntilDone(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<bool (std::__1::shared_ptr<IService> const&)> const&) + 800 4 WebexSDK 0x107c6c77c CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&) + 68 5 WebexSDK 0x107c77bbc CoreFramework::_onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 748 6 WebexSDK 0x107c90c5c std::__1::__function::__func<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15, std::__1::allocator<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15>, void ()>::operator()() + 324 7 WebexSDK 0x107b26ab4 network::SerialTaskManager::executeTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&) + 68 8 WebexSDK 0x107b282d8 std::__1::__function::__func<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0, std::__1::allocator<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0>, void ()>::operator()() + 120 9 WebexSDK 0x1079ad594 std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::'lambda'(), std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::'lambda'()>, unsigned char ()>::operator()() + 28 10 WebexSDK 0x1079a6360 pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>::_Init(pplx::details::_TypeSelectorNoAsync) const + 136 11 WebexSDK 0x1079a6100 pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const + 40 12 WebexSDK 0x1079aca4c pplx::details::_TaskProcHandle::_RunChoreBridge(void*) + 28 13 libdispatch.dylib 0x1872881a8 _dispatch_client_callout + 16 14 libdispatch.dylib 0x18722a1fc _dispatch_queue_override_invoke + 728 15 libdispatch.dylib 0x18723743c _dispatch_root_queue_drain + 340 16 libdispatch.dylib 0x187237c38 _dispatch_worker_thread2 + 172 17 libsystem_pthread.dylib 0x1e0c46e48 _pthread_wqthread + 224 18 libsystem_pthread.dylib 0x1e0c469f0 start_wqthread + 8
こちらでは最新版(3.4.0)に更新し事象が解決するか実施予定です。
2022-04-25 05:11 PM
こんにちは。
backtraceをざっと見る限りでは、"TelephonyService::getActiveCall()"の内部でクラッシュしていて、
nullptrアクセス検知用の低位の仮想アドレスにアクセスしようとしたのが直接的な原因だと思います。
今回は、"0x0000000000000000"になっているので、インスタンス化前のクラスにアクセスしようとしたのだと思います。
クラッシュが発生したスレッドが今回ご指摘の処理のスレッドと違うのは、
今回ご指摘の処理の結果、イベント処理がDispatchされた先でのクラッシュになっているからだと思います。
"TelephonyService::getActiveCall()"自体はWebex SDKの内部のメソッドで、
現在は私もソースコード自体は見れないので、開発元に調査を依頼する必要があります。
確認にあたって、以下を教えていただければと思います。
1. "Guest issuer JWT tokenの発行時"とのことですが、
呼び出しているのは、"JWTAuthenticator.authorizedWith()"メソッドで、呼び出した直後にクラッシュしているということでしょうか?
2. こちらは、もし分かればで構いませんが、クラッシュした際のbacktraceの#0は毎回以下と同様でしょうか?
毎回、"TelephonyService::getActiveCall()"の内部でクラッシュしているかの確認になります。
0 WebexSDK 0x1080cd110 TelephonyService::getActiveCall() + 4
3. "Fixed decoding of special characters in urlencoded Guest issuer JWT token"に関しては、
内容確認してみようと思いますが、JWTのPayloadの"sub", "name"に指定している値に関して情報共有ください。
"sub"、"name"に関しては、センシティブな情報が含まれる可能性があるので、
そのまま共有は必要ありませんが、クラッシュした際に指定していた文字列が分かれば、
その特徴をお知らせいただければと思います。
例えば、漢字が入っていた、"&"記号が含まれていたなどの英数文字以外の特徴が分かれば教えていただければと思います。
以上、よろしくお願いします。
2022-04-27 01:33 PM
ご確認、ご返信ありがとうございます。
1. "Guest issuer JWT tokenの発行時"とのことですが、
呼び出しているのは、"JWTAuthenticator.authorizedWith()"メソッドで、呼び出した直後にクラッシュしているということでしょうか?
こちらはデバッグできない環境でのみ発生しており現時点では確認できていません。
(発生個所の特定ができるようログの追加などを検討中です)
2. こちらは、もし分かればで構いませんが、クラッシュした際のbacktraceの#0は毎回以下と同様でしょうか?
毎回、"TelephonyService::getActiveCall()"の内部でクラッシュしているかの確認になります。
回収できたログが3回分ですが2回は同様でしたが1件は別でした。(下記の③)
「TelephonyService::onNetworkEventHappened」までは同様に見えております。
【①前回記載させていただいたもの】 Thread 10 name: Dispatch queue: com.apple.root.default-qos Thread 10 Crashed: 0 WebexSDK 0x1080cd110 TelephonyService::getActiveCall() + 4 1 WebexSDK 0x108114cc4 TelephonyService::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 172 2 WebexSDK 0x107c8ac94 std::__1::__function::__func<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0, std::__1::allocator<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0>, bool (std::__1::shared_ptr<IService> const&)>::operator()(std::__1::shared_ptr<IService> const&) + 32 3 WebexSDK 0x107c6cb24 CoreFramework::forEachServiceUntilDone(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<bool (std::__1::shared_ptr<IService> const&)> const&) + 800 4 WebexSDK 0x107c6c77c CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&) + 68 5 WebexSDK 0x107c77bbc CoreFramework::_onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 748 6 WebexSDK 0x107c90c5c std::__1::__function::__func<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15, std::__1::allocator<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15>, void ()>::operator()() + 324 7 WebexSDK 0x107b26ab4 network::SerialTaskManager::executeTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&) + 68 8 WebexSDK 0x107b282d8 std::__1::__function::__func<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0, std::__1::allocator<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0>, void ()>::operator()() + 120 9 WebexSDK 0x1079ad594 std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::‘lambda’(), std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::‘lambda’()>, unsigned char ()>::operator()() + 28 10 WebexSDK 0x1079a6360 pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>::_Init(pplx::details::_TypeSelectorNoAsync) const + 136 11 WebexSDK 0x1079a6100 pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const + 40 12 WebexSDK 0x1079aca4c pplx::details::_TaskProcHandle::_RunChoreBridge(void*) + 28 13 libdispatch.dylib 0x1872881a8 _dispatch_client_callout + 16 14 libdispatch.dylib 0x18722a1fc _dispatch_queue_override_invoke + 728 15 libdispatch.dylib 0x18723743c _dispatch_root_queue_drain + 340 16 libdispatch.dylib 0x187237c38 _dispatch_worker_thread2 + 172 17 libsystem_pthread.dylib 0x1e0c46e48 _pthread_wqthread + 224 18 libsystem_pthread.dylib 0x1e0c469f0 start_wqthread + 8 【②①と同一事象と見えるもの】 Thread 14 name: Dispatch queue: com.apple.root.default-qos Thread 14 Crashed: 0 WebexSDK 0x105f51110 TelephonyService::getActiveCall() + 4 1 WebexSDK 0x105f98cc4 TelephonyService::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 172 2 WebexSDK 0x105b0ec94 std::__1::__function::__func<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0, std::__1::allocator<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0>, bool (std::__1::shared_ptr<IService> const&)>::operator()(std::__1::shared_ptr<IService> const&) + 32 3 WebexSDK 0x105af0b24 CoreFramework::forEachServiceUntilDone(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<bool (std::__1::shared_ptr<IService> const&)> const&) + 800 4 WebexSDK 0x105af077c CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&) + 68 5 WebexSDK 0x105afbbbc CoreFramework::_onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 748 6 WebexSDK 0x105b14c5c std::__1::__function::__func<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15, std::__1::allocator<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15>, void ()>::operator()() + 324 7 WebexSDK 0x1059aaab4 network::SerialTaskManager::executeTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&) + 68 8 WebexSDK 0x1059ac2d8 std::__1::__function::__func<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0, std::__1::allocator<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0>, void ()>::operator()() + 120 9 WebexSDK 0x105831594 std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::‘lambda’(), std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::‘lambda’()>, unsigned char ()>::operator()() + 28 10 WebexSDK 0x10582a360 pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>::_Init(pplx::details::_TypeSelectorNoAsync) const + 136 11 WebexSDK 0x10582a100 pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const + 40 12 WebexSDK 0x105830a4c pplx::details::_TaskProcHandle::_RunChoreBridge(void*) + 28 13 libdispatch.dylib 0x1832581a8 _dispatch_client_callout + 16 14 libdispatch.dylib 0x1831fa1fc _dispatch_queue_override_invoke + 728 15 libdispatch.dylib 0x18320743c _dispatch_root_queue_drain + 340 16 libdispatch.dylib 0x183207c38 _dispatch_worker_thread2 + 172 17 libsystem_pthread.dylib 0x1dcb46e48 _pthread_wqthread + 224 18 libsystem_pthread.dylib 0x1dcb469f0 start_wqthread + 8 【③TelephonyService::onNetworkEventHappenedまでは共通だが、CallManagerに処理が遷移しているパターン】 Thread 17 name: Dispatch queue: com.apple.root.default-qos Thread 17 Crashed: 0 WebexSDK 0x110d90750 CallManager::networkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 44 1 WebexSDK 0x110d9074c CallManager::networkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 40 2 WebexSDK 0x110f6d2f4 TelephonyService::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 1756 3 WebexSDK 0x110ae2c94 std::__1::__function::__func<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0, std::__1::allocator<CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&)::$_0>, bool (std::__1::shared_ptr<IService> const&)>::operator()(std::__1::shared_ptr<IService> const&) + 32 4 WebexSDK 0x110ac4b24 CoreFramework::forEachServiceUntilDone(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<bool (std::__1::shared_ptr<IService> const&)> const&) + 800 5 WebexSDK 0x110ac477c CoreFramework::forEachService(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::function<void (std::__1::shared_ptr<IService> const&)> const&) + 68 6 WebexSDK 0x110acfbbc CoreFramework::_onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs) + 748 7 WebexSDK 0x110ae8c5c std::__1::__function::__func<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15, std::__1::allocator<CoreFramework::onNetworkEventHappened(NetworkEvent, NetworkEventArgs::NetworkEventArgs)::$_15>, void ()>::operator()() + 324 8 WebexSDK 0x11097eab4 network::SerialTaskManager::executeTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&) + 68 9 WebexSDK 0x1109802d8 std::__1::__function::__func<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0, std::__1::allocator<network::SerialTaskManager::startTask(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void ()> const&)::$_0>, void ()>::operator()() + 120 10 WebexSDK 0x110805594 std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::‘lambda’(), std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::‘lambda’()>, unsigned char ()>::operator()() + 28 11 WebexSDK 0x1107fe360 pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>::_Init(pplx::details::_TypeSelectorNoAsync) const + 136 12 WebexSDK 0x1107fe100 pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, std::__1::function<void ()>, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const + 40 13 WebexSDK 0x110804a4c pplx::details::_TaskProcHandle::_RunChoreBridge(void*) + 28 14 libdispatch.dylib 0x1832e41a8 _dispatch_client_callout + 16 15 libdispatch.dylib 0x1832861fc _dispatch_queue_override_invoke + 728 16 libdispatch.dylib 0x18329343c _dispatch_root_queue_drain + 340 17 libdispatch.dylib 0x183293c38 _dispatch_worker_thread2 + 172 18 libsystem_pthread.dylib 0x1dcca2e48 _pthread_wqthread + 224 19 libsystem_pthread.dylib 0x1dcca29f0 start_wqthread + 8
3. "Fixed decoding of special characters in urlencoded Guest issuer JWT token"に関しては、
内容確認してみようと思いますが、JWTのPayloadの"sub", "name"に指定している値に関して情報共有ください。
こちらも容易にデータを確認できる環境ではなくデータ取得を調整しています。
取得でき次第連携いたします。
なお、調査の中で最新のWebexSDK(v3.4.0)がリリースされていることに気づいたので
上記に差し替えたアプリにてテストを行っていたところネットワークが切断された場合の動作が
v3.2.1までと異なりアプリが異常終了するようになってしまいました。
SDK側のリターンコードが変更されているか確認できたりするのでしょうか。
2022-04-27 06:05 PM
こんにちは。
各種情報共有ありがとうございます。
一旦、開発側にダンプ情報などを共有しています。
調査の進展次第では、より細かい情報の収集をお願いする可能性があります。
ログの共有などについては、コミュニティでの共有だと課題も出てくると思うので、
コミュニティのプライベートメッセージ(DM)を送信したので確認ください。
本コミュニティの右上の方にメールアイコンが見つかると思うので、そちらから確認ください。
なお、調査の中で最新のWebexSDK(v3.4.0)がリリースされていることに気づいたので
上記に差し替えたアプリにてテストを行っていたところネットワークが切断された場合の動作が
v3.2.1までと異なりアプリが異常終了するようになってしまいました。
SDK側のリターンコードが変更されているか確認できたりするのでしょうか。
こちらもダンプが出力されるような状況でしょうか?
ネットワーク切断は、アプリケーション起動中に圏外、Wi-Fi無効、機内モード有効などの状況でしょうか?
「異常終了」だとすると不具合の可能性があると思います。
変更内容はGitHubのChange Logや、既存のアプリケーションの動作を崩すような意図的な変更であれば、
API Referenceや開発ガイドのページに情報が記載されると思います。
2022-04-28 02:55 PM
アドバイス、ご配慮ありがとうございます。
DM確認いたしました。詳細なログ等はそちらでやり取りさせてください。
ダンプが出力されるような状況でしょうか?
こちらもダンプが出てはいるのですが
Webex SDK内ではなく別の個所の問題に見えておりリターンコードのハンドリングの問題を疑っています。
API Referenceおよび開発ガイドに変更がないかは再確認してみたいと思います。
ネットワーク切断はWebexの通話状態でWi-Fi無効化し検証しましたが
他の方法でも同様となるかは試してみます。
2022-04-28 05:55 PM
DM確認ありがとうございます!
少し込み入った確認や情報共有依頼など行うことになると思いますので、
一旦そちらでやりとり継続させていただければと思います。
エキスパートの回答、ステップバイステップガイド、最新のトピックなどお気に入りのアイデアを見つけたら、あとで参照できるように保存しましょう。
コミュニティは初めてですか?これらのヒントを活用してスタートしましょう。 コミュニティの活用方法 新メンバーガイド
下記より関連するコンテンツにアクセスできます