注意書き

本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Vulkanアプリのデバッグ中に別の例外に悩まされる

プログラミング

Androidを対象としてVulkanのプログラムを作成しているときに、「art_sigsegv_faultに引っかかる」という問題に悩まされました。これについて記載します。

症状について

Androidを対象としてVulkanを用いた初期化処理を作っていました。デバッガで接続しながら、初期化処理を確認していたところ、不定のタイミングで art_sigsegv_fault に引っかかってしまうという問題に遭遇していました。

タイミングによっては正常に動き始めてしまい、その要因は不明というところです。初期化処理で10秒くらいデバッガで停止させていると、100%発生するという状況ではありました。

コールスタックなど

問題が起こったときのコールスタック情報は次のとおりでした。Android Studioで表示されるスタックトレース情報では表示されず、 LLDBのコンソールから取得したものです。コマンドは thread backtrace all です。

* thread #31, name = 'compressiontest', stop reason = breakpoint 5.1
  * frame #0: 0x000078a3af8684a0 libart.so`art_sigsegv_fault
    frame #1: 0x000078a3af869244 libart.so`art::FaultManager::HandleSigsegvFault(int, siginfo*, void*) + 388
    frame #2: 0x000078a6522373a9 libsigchain.so`art::SignalChain::Handler(int, siginfo*, void*) + 569
    frame #3: 0x000078a64cee59d0 libc.so`__restore_rt
    frame #4: 0x000078a380cb571c libvulkan_enc.so`gfxstream::vk::VkEncoder::getPacketContents(unsigned char const*, unsigned long) + 108
    frame #5: 0x000078a380d605fc libvulkan_enc.so`std::__1::__function::__func<gfxstream::vk::VkEncoder::vkSetEvent(VkDevice_T*, VkEvent_T*, unsigned int)::$_0, std::__1::allocator<gfxstream::vk::VkEncoder::vkSetEvent(VkDevice_T*, VkEvent_T*, unsigned int)::$_0>, std::__1::unique_ptr<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>>, std::__1::default_delete<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>>>> ()>::operator()() - 18446611430073039363
    frame #6: 0x000078a3861b0c6e libandroidemu.so`android::base::guest::HealthMonitor<std::__1::chrono::steady_clock>::main() + 1566

どうも gfxstream::vk::VkEncoder::getPacketContents あたりからのコールで異常な状態になっている可能性が高そうです。また見ての通りですが、Windows上の Androidエミュレーター上での実行です。

ブレークポイントの設定を変更

おそらく、これまでの不正コードが理由で次のような設定となっていました。これが今までのブレークポイント停止を引き起こしていたのではと思い、該当するブレークポイント設定を外してみても解決せず。

その他情報など

AndroidStudioの更新や、AVDを常にコールドブートするようにしてみたりしても、特に症状は改善しませんでした。

やはりレンダースレッドを一定時間止めることで、冒頭にあげた例外が出てしまいます。これは初期化に限らず、定常状態でも同様でした。

今のところ本件は解決に至っていないので、引き続き探っていきたいところではあります。

コメント

タイトルとURLをコピーしました