MuseScore を起動してもクラッシュする件
Arch Linux にて。Version 4.0.2-2
スプラッシュスクリーンが出たと思ったらSIGSEGV で落ちる。
結論
~/.asoundrc の設定がおかしかったらしく、これを消したらクラッシュしなくなった。
調査過程
以下のように SIGSEGV で落ちる。
code:shell
$ mscore
QEventLoop: Cannot be used without QApplication
QEventLoop: Cannot be used without QApplication
20:31:19.618 | INFO | main_thread | GlobalModule | onPreInit: log path: /home/xorphitus/.local/share/MuseScore/MuseScore4/logs/MuseScore_230609_203119.log
20:31:19.618 | INFO | main_thread | GlobalModule | onPreInit: === Started MuseScore 4.0.2, build number ===
20:31:19.695 | WARN | main_thread | DiagnosticsModule | onInit: crash handling disabled
20:31:19.697 | DEBUG | main_thread | ShortcutsRegister | expandStandardKeys: removed 5 shortcut, because they are not bound to standard key
20:31:19.697 | DEBUG | main_thread | ShortcutsRegister | expandStandardKeys: added 3 shortcut, because they are alternative shortcuts for the given standard keys
fish: Job 1, 'mscore' terminated by signal SIGSEGV (Address boundary error)
なんだけどなぜか sudo mscore でルート権限だとどいううわけか起動する!
幸い OSS なので手元でビルドしながら実験。
https://github.com/musescore/MuseScore
README のビルドガイドにしたがって
code:shell
$ cmake -P build.cmake -DCMAKE_BUILD_TYPE=Debug
$ cmake -P build.cmake -DCMAKE_BUILD_TYPE=Debug run
としてみるも、やはりセグフォで落ちる。
GDB でデバッグしてみる。
まずは coredump を拾う。
code:shell
$ coredumpctl list
<snipped>
Fri 2023-06-09 19:15:31 JST 676877 1000 1000 SIGSEGV present /home/xorphitus/.ghq/github.com/musescore/MuseScore/builds/Linux-Qt-usr-Make-Debug/install/bin/mscore 5.4M
末尾に発見。coredump を取得する。
code:shell
$ coredumpctl dump -1 output mscoredump
GDB で追いかける。
code:shell
$ gdb builds/Linux-Qt-usr-Make-Debug/src/app/mscore mscoredump
(gdb) プロンプトが現れたら backtrace コマンドを打つ。
code:gdb
#0 0x00007fac4566f861 in ?? ()
Current thread is 1 (LWP 318755)
(gdb) backtrace
c + Enter すると末尾にこういうのが出る。
code:gdb
#61587 0x00007eff6f02a59f in () at /usr/lib/libasound.so.2
#61588 0x00007eff6f053acd in snd_pcm_open () at /usr/lib/libasound.so.2
#61589 0x00005589f266faf0 in mu::audio::LinuxAudioDriver::open(mu::audio::IAudioDriver::Spec const&, mu::audio::IAudioDriver::Spec*) (this=0x5589f73f9ea0, spec=..., activeSpec=0x7ffd1d194560)
at /home/xorphitus/.ghq/github.com/musescore/MuseScore/src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp:143
#61590 0x00005589f2538130 in mu::audio::AudioModule::setupAudioDriver(mu::framework::IApplication::RunMode const&) (this=0x5589f724b140, mode=@0x7ffd1d194920: mu::framework::IApplication::RunMode::GuiApp)
at /home/xorhitus/.ghq/github.com/musescore/MuseScore/src/framework/audio/audiomodule.cpp:260
#61591 0x00005589f2537747 in mu::audio::AudioModule::onInit(mu::framework::IApplication::RunMode const&) (this=0x5589f724b140, mode=@0x7ffd1d194920: mu::framework::IApplication::RunMode::GuiApp)
at /home/xorphitus/.ghq/github.com/musescore/MuseScore/src/framework/audio/audiomodule.cpp:203
#61592 0x00005589f1ba923e in mu::app::App::run(int, char**) (this=0x7ffd1d194f90, argc=1, argv=0x7ffd1d1954b8) at /home/xorphitus/.ghq/github.com/musescore/MuseScore/src/app/app.cpp:185
#61593 0x00005589f1b915c9 in main(int, char**) (argc=1, argv=0x7ffd1d1954b8) at /home/xorphitus/.ghq/github.com/musescore/MuseScore/src/app/main.cpp:335
つまり
code:gdb
/home/xorphitus/.ghq/github.com/musescore/MuseScore/src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp:143
root 権限じゃない場合にここで落ちている可能性が濃厚。
実際のコードを見てみる。
code:src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp
int rc;
snd_pcm_t* handle;
rc = snd_pcm_open(&handle, outputDevice().c_str(), SND_PCM_STREAM_PLAYBACK, 0);
if (rc < 0) {
return false;
}
君か。前後にログを仕込んでみよう。
code:src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp
LOGI() << "mylog 0";
LOGI() << "mylog 1 " << outputDevice().c_str();
rc = snd_pcm_open(&handle, outputDevice().c_str(), SND_PCM_STREAM_PLAYBACK, 0);
LOGI() << "mylog 2";
if (rc < 0) {
LOGI() << "mylog 3";
return false;
}
LOGI() << "mylog 4";
で、再ビルドして実行。
code:shell
20:46:39.713 | INFO | main_thread | DiagnosticsModule | onInit: success start crash handler
20:46:39.716 | INFO | main_thread | LinuxAudioDriver | open: mylog 0
20:46:39.716 | INFO | main_thread | LinuxAudioDriver | open: mylog 1 default
795206:795206:20230609,204639.775413:ERROR elf_dynamic_array_reader.h:61 tag not found
795206:795206:20230609,204639.776141:ERROR elf_dynamic_array_reader.h:61 tag not found
795206:795206:20230609,204639.777211:ERROR elf_dynamic_array_reader.h:61 tag not found
795206:795206:20230609,204639.777516:ERROR elf_dynamic_array_reader.h:61 tag not found
795206:795206:20230609,204639.777566:ERROR elf_dynamic_array_reader.h:61 tag not found
795206:795206:20230609,204639.777617:ERROR elf_dynamic_array_reader.h:61 tag not found
795206:795206:20230609,204639.778374:WARNING process_reader_linux.cc:125 no stack mapping
CMake Error at build.cmake:293 (message):
Run step failed with status Segmentation fault. See output above for
details.
つまり mylog 1 のあとに落ちているので snd_pcm_open が犯人であることは確定。
これが root だと上手くいくということを次は検証しよう。
outputDevice().c_str() の中身は default という値だとわかったので、こんな C プログラムを書いてみた。ただ snd_pcm_open() を呼ぶだけ。
code:main.c
#include <alsa/asoundlib.h>
int main() {
snd_pcm_t* handle;
const char* dev = "default";
int rc = snd_pcm_open(&handle, dev, SND_PCM_STREAM_PLAYBACK, 0);
return 0;
}
ビルドして実行。gcc に -lasound オプションが必要だということを理解するまで時間がかかってしまった。
code:shell
$ gcc -o snd -lasound main.c
$ ./snd
fish: Job 1, './snd' terminated by signal SIGSEGV (Address boundary error)
$ sudo ./snd
ALSA lib pcm_dmix.c:999:(snd_pcm_dmix_open) unable to open slave
はい、確定。一般ユーザだと snd_pcm_open で SIGSEGV が出て落ちますね。
Permision の問題の気はするけど具体的に何が悪いのか。使ってる一般ユーザは audio グループに属してるけどそこは関係ないってことだよな。
何だろう、とりあえず strace してみるか。今しがた作った snd を使ってみる。
code:shel
$ strace ./snd
<snipped>
access("/etc/asound.conf", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/etc/asound.conf", R_OK) = -1 ENOENT (No such file or directory)
access("/home/xorphitus/.asoundrc", R_OK) = 0
newfstatat(AT_FDCWD, "/home/xorphitus/.asoundrc", {st_mode=S_IFREG|0644, st_size=183, ...}, 0) = 0
openat(AT_FDCWD, "/home/xorphits/.asoundrc", O_RDONLY) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=183, ...}, AT_EMPTY_PATH) = 0
read(3, "pcm.!surround51 {\n type vdownm"..., 4096) = 183
read(3, "", 4096) = 0
close(3) = 0
access("/home/xorphitus/.config/alsa/asoundrc", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/alsa-lib", X_OK) = 0
openat(AT_FDCWD, "/usr/lib/alsa-lib/libasound_module_pcm_vdownmix.so", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=14256, ...}, AT_EMPTY_PATH) = 0
<snipped>
何やら設定ファイルを読んでますな。
あー、そういえば ~/.asoundrc を作ってたな。
code:shell
$ cat .asoundrc
pcm.!surround51 {
type vdownmix
slave.pcm "default"
}
pcm.!surround40 {
type vdownmix
slave.pcm "default"
}
pcm.!default "plug:surround51"
pcm.!default "plug:surround40"
default という名前はこの中にもいるな。
試しに消してみるか。
……消したら動いた! 何でか分からんけど動いたからヨシ!
設定がおかしくて存在しないデバイスか何かを参照しようとしてたのだろう。
これはユーザ固有の設定の問題であって permission の問題ではなかったのだな。そりゃいくら group の設定を確認しても分からないわけだ。
また一つ学びを得た。
pavucontrol の Playback タブを見たら、MuseScore の出力が ALSA plug-in [mscore] となっていた。MuseSore が ALSA 周りで何かやってて、それが↑の設定だと問題を引き起こすのかも。
#Linux