原因調査にそこそこの労力を要した(が、ブログにするほどの知見を得られなかった)デカ目の事例をまとめる

↓「テンプレ」にカーソルを合わせて V6jy

テンプレ

  • 時期 :
  • 背景 :
  • 調査 :
  • 原因 :
  • 解決 :
  • 反省 :

std::mapに格納したOpenGLのテクスチャIDを用いて描画できない

  • 時期 : 2026-01-28
  • 背景 : C++でOpenGLを用いて画像を描画するコードを書いていた。画像が生成されると、それをPixmanにより1枚のフレームバッファに相当するテクスチャにコピーする形で描画し、OpenGLはその単一のテクスチャを描画するようになっていた。これを変更し、描画対象となる画像が生成された時、レンダラーがそのオブジェクトのIDを受け取り、std::map<ID, DrawInfo>DrawInfoを作成するようにし、これを用いた描画を実装した。DrawInfoはOpenGLのテクスチャIDなどを持っており、引数をもたないコンストラクタでglGenTextures()などによりそれらを作成する。作成したテクスチャはデストラクタで削除される。
  • 調査 : テクスチャにダミーデータ(std::vector<uint8_t> tmp(size, 0x90)など)を渡してみたが変わらなかった。glGetError()によりエラーがないことを確かめた。フラグメントシェーダの出力を定数(vec4)に置き換えると色が出た。LLM(GitHub Copilot GPT-5 mini / Claude Sonnet 4.5)にいろいろ聞いたものの、的はずれな回答ばかりだった。が、正常に動いていたバージョンと一緒に渡して「何が違うのか教えて」みたいな質問をすると教えてくれた。
  • 原因 : mapへの挿入において map.emplace(id, DrawInfo()) と書いていた。こうすると、emplaceした直後にDrawInfoのデストラクタが呼ばれ、テクスチャが削除される。
  • 解決 : map.try_emplace(id) とした。
  • 反省 : emplace() の引数がどのようになってるのか分かっておらず、それ故に発生した問題だと思う。しかし削除したテクスチャをバインドしているのだからOpenGLもエラーくらい出してくれれば良いのに。

ALSLを用いた音声再生ができない

  • 時期 : 2026-01-15
  • 背景 : Linuxが搭載されたマイコンボード的なものが支給される授業を履修している。ボードを用いて自由にシステムを構築する課題が課された。スピーカーのセットアップをするべく、cat /proc/asound/cards で表示されたインデックスを /etc/asound.conf に記述し、mpv sound.mp3 で再生を行えることを確認した。その後、同様にスピーカーを利用したいという受講者に同様の処置を施したが、音声カードが見つからないという旨のエラーが表示され、音声は再生されなかった。
  • 調査 : sudo dmesglsusb (もちろん /proc/asound/cards も)を確認し、スピーカーが認識されているのを確認した。 /etc/asound.conf の文法ミスがないこと、インデックスが /proc/asound/cards の表示と一致していることを確かめた。mpvの --audio-device=help ではオーディオカードが表示されなかった。最終的に、その受講者をしばらく放置したのち戻ってきた際に開かれていたQiita記事にsudoコマンドか何かが映っており、原因特定のきっかけとなった(記事の詳細は全く覚えていない)。
  • 原因 : よくわからないが、root権限がないとオーディオカードを使えないらしい?自身の環境ではボードへSSHする際のログインユーザーがrootだったため、この制約に気付けなかった。
  • 解決 : sudo mpv sound.mp3 で再生された。
  • 反省 : なぜrootでログインしていたのかというと、/homeディレクトリ下にあるファイルを読みたかったのに、普通にSSHした際に読もうとしたらpermission deniedで弾かれたため。今になって気付いたが、SSHする際にログインユーザーを指定していなかったため、想定していたユーザーと異なるユーザーとしてログインしていたせいなのだろう。1人しかユーザーがいないLinuxシステムに慣れてしまったが故の過ちだと思う。

WSLをインストールしても wsl --list に表示されない

  • 時期 : 2025-11-21
  • 背景 : Active Directory で管理されている Windows 11 マシンにWSLをインストールしようとしていた。Microsoft Store で Ubuntu 24.04 をインストールして起動しようとすると 0x80370114 という数字と文字化けのようなもの(??????? のような文字列)が表示されて起動できなかった。ターミナルで wsl --install を実行すると再起動が求められ、再起動後に wsl --list を実行すると、インストール済みのディストリビューションがないと言われた。
  • 調査 : 0x80370114 でググった。Hyper-V がインストールされていない場合に発生するらしいので、 Win+R から optionalfeatures を起動して、Hyper-Vや仮想マシンに関連していそうな項目にチェックを入れたが効果がなかった。 dism.exe を用いたWSL・Hyper-Vの有効化コマンドを入れたが何も変わらなかった。Windows セキュリティの “Code Flow Guard (CFG)” の設定で C:\WINDOWS\System32\{vmcompute,vmwp}.exe を例外として追加したら良い、との情報を得たので追加しようとしたところ、そもそもそのようなファイルは存在しなかった。
  • 原因 : 何らかの原因でインストールが不十分になってしまっていたらしい?
  • 解決 : Win+R → optionalfeatures で Hyper-V, Linux 用 Windows サブシステム、その他諸々のチェックを外し、再起動後にもう一度チェックを入れ、再起動後に wsl --install で動作するようになった
  • 反省 : 何だこれ

Next.js 16でWebSocketの接続に失敗する

  • 時期 : 2025-11-02
  • 背景 : Next.js の開発サーバーはWebSocketを用いてWebブラウザと接続し、ホットリロードなどの機能を提供している。僕はいつも開発用のArch LinuxサーバーにSSHして開発を行っており、dnsmasqとNginxを用いて開発サーバーのIPアドレスやポート番号を直接打ち込むことなく開発サーバーにアクセスできるようにしているが、これのせいでNext.jsを用いた開発をする際は /_next/webpack-hmr に対するWebSocketコネクションを扱えるように設定を行わなければならない。しばらく放置していたNext.js製プロジェクトのパッケージを更新したところ、Webページが一定間隔で強制的にリロードされる現象が発生していることに(この日になって)気がついた。DevToolsを確認したところ、WebSocketへの接続に失敗した旨のエラーが発生していた。
  • 調査 : 以前のバージョンと異なり、WebSocketの接続に用いられるアドレスの末尾にidパラメータが付与されるようになっていたため、これが適切にプロキシされていないのが原因ではないかと考えた。このため、proxy_pass の末尾に $arg を付けたり、正規表現と $1 を用いたりして proxy_pass を書き換えたが直らなかった。Geminiに「example.com/ws?id=123 に対するWebSocketの接続を localhost:1234/xyz?id=123 に通す方法を教えて」と聞いてconfigを出力してもらったが、漏れがあるようには思えなかった。/var/log/nginx/nginx.log にログを保存していたので見たところ、$status にあたるところが 009 になっているのを見つけたので、これをGeminiに伝えると「error.log を見ろ」と言われた。そのようなファイルはないので journalctl -xaeu nginx で見ると upstream sent no valid HTTP/1.0 header while reading response header from upstream という文字列があった。これをGeminiに投げると「サーバーがうまく動いていない可能性がある」とのことだったため、SSH port forwarding を行って localhost 経由で WebSocketへの接続に成功することを確かめた。この旨を伝えると「httpではなくhttps (WSS) にしなければならないのでは?」と言われたので、DevToolsのエラーメッセージには ws:// という文字列があると伝えたら「proxy_set_header Host$host ではなく $proxy_host にしろ」と言われたので変えたが直らなかった。これを伝えると「SELinuxのせいでは?sestatus コマンドでモードを確かめろ」と言われたので確かめようとしたらそもそもコマンドがなかった。これを伝えると「localhost127.0.0.1 に書きかえろ」と言われ、そんなわけないだろ……と思いながら変えようとして proxy_pass の設定項目に目を向けたところで、原因が判明した。
  • 原因 : proxy_pass で設定しているポート番号が間違っていた。watasuke.netの開発用に使っていたNginxの設定ファイルをコピペした際、location / における proxy_pass のポート番号は変更していたが、 location /_next/webpack-hmr における proxy_pass は変更していなかったせい。なお、これらのプロジェクトはどちらもNext.jsデフォルトのポートとは異なるポートで開発サーバーが起動するようになっている。
  • 解決 : ポート番号を正しいものにした
  • 反省 : シンプルに愚かだと思う。それに加え、しばらく放置していたプロジェクトの設定であったためポート番号を覚えていなかったり、そもそもNginxの設定に明るくなかったりといった要因により、問題解決が遅れたのではないかと考えている

Linuxカーネルモジュールを読み込んだ直後にシステムが停止する

  • 時期 : 2025年夏ごろ
  • 背景 : ラップトップPCにインストールされたLinuxで、カーネルモジュールをCで作成している。それを insmod で読み込んだ瞬間に一切の操作を受け付けなくなる(マウスポインタが動かない、Ctrl+Alt+F1等でttyを切り替えられない)。ラップトップPCでのカーネルパニックを示す(?)CapsLockのランプ点灯は見られなかった。
  • 調査 : なんとなく怪しげなコードをコメントアウトしたところ、カーネルモジュールのロード時に自作の関数で上書きされている cpuidle_driverのハンドラ(cpuidle_get_driver()->states[0].enter)で停止していること、またそのハンドラ内で、カーネルモジュールのロード時に vmalloc_user() で確保されている領域shmに読み書きしようとすると発生することを突き止めた。
  • 原因 : vmalloc_user() を呼んで shm を確保する前に cpuidle_driver のハンドラを上書きしていた。もともと shm の確保処理があって、cpuidle_driver の上書きはその後から追加した処理だったが、追加時に順序のことを何も考えていなかったせいでこのような事態が発生していた。
  • 解決 : 呼び出し順を入れ替えた
  • 反省 : シンプルに愚かだと思う。ちなみにGitHub Copilot (GPT-4.1) に聞いたところ「shm がinvalidである可能性があります」みたいな返事はあったのだが、提案された対処方法は「vmalloc_user() の呼び出し後に if (!shm) return -1; をする」というものであり、しかしこの処理は既に挿入していたため、shmが無効であるという可能性はないと判断してしまい、原因究明が遅れた一因となった

wayvncで起動時に undefined symbol: nvnc_set_log_fn_thread_local みたいなエラーが出て起動しない

  • 時期 : 2025-08-17
  • 背景 : Arch Linuxで wayvnc をインストールして起動しようとすると見出しの通りのエラーが出て落ちる。ldd $(which wayvnc) でmissingなライブラリは見つからない。
  • 調査 : とりあえず https://github.com/any1/wayvnc をcloneしてビルドしようとしたところ、 enum nvnc_keyboard_led_state が定義されていないというエラーが出て起動しなかった。GitHubでこのキーワードで検索し、wayvncの依存であるNeat VNCで定義されていることがわかったため、 grep nvnc_keyboard_led_state /usr/include/neatvnc.h すると、きちんと定義されていることが分かった。が、Neovimでsrc/keyboard.cを開き、#include <neatvnc.h> のところでgd(定義へジャンプ)してキーワードを検索すると見つからなかった。しかし、開かれたファイルのパスが /usr/local/include/neatvnc.h だったため、過去にインストールした何かの依存関係として。find $HOME neatvnc.h をすると weston/subprojects/neatvnc/include/neatvnc.h がヒットした。
  • 原因 : 過去にWaylandコンポジタを開発する際、Westonを手動ビルドしてインストールしていたが、WestonはNeat VNCに依存しており、手動ビルドした当時の依存として古いバージョンの libneatvnc.so がインストールされており、それがリンクされていたため。
  • 解決 : ninja -C build uninstall で手動ビルドした weston をアンインストールした
  • 反省 : ldd をしてライブラリが欠けていないか確認したのは良かったが、/usr/local/lib 下のライブラリがリンクされていたことに気づくべきだったかもしれない

nix-shell コマンドが floating point exception でクラッシュする

  • 時期 : 初遭遇は不明、問題解明に取り組んだのは2025-06-16
  • 背景 : Arch Linux に nix をインストールして使っている。shell.nix のあるディレクトリで nix-shell コマンドを起動すると、特に何も出力されないまま数秒待たされ、floating point exception で強制終了する。
  • 調査 : /nix を消してからパッケージを入れ直したところ、floating point exception ではなくセグフォになった。
  • 原因 : GitHubのissueに書いてあった。LD_LIBRARY_PATHがセットされていたのが原因。
  • 解決 : .zshrc において LD_LIBRARY_PATH をセットする記述を削除した(該当のコミット)。そこで設定していた値は /etc/ld.so.conf.d 下にファイルを作成し、そこに記述するようにした。
  • 反省 : 初めは本当に意味不明なエラーだと思ったが、原因を踏まえて nix の思想を考えると納得できるなあと思った。issueを見る癖をつけよう

iOSでのみ動作しないWebページがある

  • 時期 : 2021年2月ごろ
  • 背景 : Next.js製のWebアプリTAGetherを公開していた。利用者から、ある特定のページにアクセスできないとの連絡を受けた。手元で確認するとアクセスできることが確認できた。利用者はiPhoneユーザー。
  • 調査 : 忘れた
  • 原因 : Webkitが対応していない正規表現を利用していたため。テキストをJSONとして送信する必要があったため、「文字としての \ を入力したいときは \\ と入力してください」という指示をしており、この状態で['\', 'n']という文字列(改行 ['\n'] ではない)があったとき、 ['\', '\', 'n'] にしてエスケープしたかったため、 replace(/(?<!\\)\\n/g, '\\\\n') というコードを書いていたのだが、Webkitに後読みは実装されていなかった
  • 解決 : c70c92e4 で修正。コミットメッセージによると、「\\\ 以外で入力しないでください」とお願いしていたため、入力されることを考慮せず処理したらしい
  • 反省 : \を入力すると挙動がおかしくなるという状況で、ユーザーへのお願いによって入力されることを回避しようとするのはやめたほうが良いと思う(ちゃんとバリデーションするなり置換するなりすべき)。なお、後の実装ではバリデーションを行って、\ が奇数個連続している場合は使用できない文字であるとしてエラーを表示するようにしている。あと、これは反省ではないが、 (i(Pad)?|mac)OS が動く端末が手元にあればもっと早く原因がわかっていたのになあとも思った