キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
1353
閲覧回数
0
いいね!
5
返信

Webex iOS SDK 3.3.0の更新内容について

mkoba
Level 1
Level 1

現在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

  • Fixed decoding of special characters in urlencoded Guest issuer JWT token

なお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)に更新し事象が解決するか実施予定です。

5件の返信5

Tohru Ohzono
Cisco Employee
Cisco Employee

こんにちは。

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"の値は、全角の日本語含めて指定される可能性がありますか?

"sub"、"name"に関しては、センシティブな情報が含まれる可能性があるので、
そのまま共有は必要ありませんが、クラッシュした際に指定していた文字列が分かれば、
その特徴をお知らせいただければと思います。
例えば、漢字が入っていた、"&"記号が含まれていたなどの英数文字以外の特徴が分かれば教えていただければと思います。


以上、よろしくお願いします。

ご確認、ご返信ありがとうございます。

 

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側のリターンコードが変更されているか確認できたりするのでしょうか。

こんにちは。

各種情報共有ありがとうございます。
一旦、開発側にダンプ情報などを共有しています。
調査の進展次第では、より細かい情報の収集をお願いする可能性があります。
ログの共有などについては、コミュニティでの共有だと課題も出てくると思うので、
コミュニティのプライベートメッセージ(DM)を送信したので確認ください。
本コミュニティの右上の方にメールアイコンが見つかると思うので、そちらから確認ください。

 

なお、調査の中で最新のWebexSDK(v3.4.0)がリリースされていることに気づいたので

上記に差し替えたアプリにてテストを行っていたところネットワークが切断された場合の動作が

v3.2.1までと異なりアプリが異常終了するようになってしまいました。

SDK側のリターンコードが変更されているか確認できたりするのでしょうか。


こちらもダンプが出力されるような状況でしょうか?
ネットワーク切断は、アプリケーション起動中に圏外、Wi-Fi無効、機内モード有効などの状況でしょうか?
「異常終了」だとすると不具合の可能性があると思います。
変更内容はGitHubのChange Logや、既存のアプリケーションの動作を崩すような意図的な変更であれば、
API Referenceや開発ガイドのページに情報が記載されると思います。

アドバイス、ご配慮ありがとうございます。

DM確認いたしました。詳細なログ等はそちらでやり取りさせてください。

 

ダンプが出力されるような状況でしょうか?

こちらもダンプが出てはいるのですが

Webex SDK内ではなく別の個所の問題に見えておりリターンコードのハンドリングの問題を疑っています。

API Referenceおよび開発ガイドに変更がないかは再確認してみたいと思います。

 

ネットワーク切断はWebexの通話状態でWi-Fi無効化し検証しましたが

他の方法でも同様となるかは試してみます。

 

Tohru Ohzono
Cisco Employee
Cisco Employee

DM確認ありがとうございます!

少し込み入った確認や情報共有依頼など行うことになると思いますので、
一旦そちらでやりとり継続させていただければと思います。