最近の出来事

2025/09/13

AM中に起床。

gptel。先日のHSV2RGB変換を、コードのスタイルを少し変更する条件を加えてみたところ、 大分様子の違うコードが生成されました。

先日のに最後の一行を加えただけです。

/*
  色相と彩度と明度を 赤と緑と青 に変換するC言語の関数を作成してください。
  関数は「HSV2RGB(double h, double s, double v, double &r, double &g, double &b)」とし、
  入力となる色相は変数h、彩度は変数v、明度は変数vとし、変換結果はr,g,bはポインタ変数に
  赤はr、緑はg、青はbにそれぞれ値を格納してください。
  色相は0~360.0、彩度は0~1.0、明度は0~1.0 の範囲で指定します。
  赤、緑、青は 0~1.0の範囲に変換してください。
  関数の戻り値は変換できた場合は0を返し、入力となる色相、彩度、明度の値が範囲外の場合は-1を返してください。
  コード内コメントは日本語で、インデントは半角スペース2個で記してください。
*/

生成されたコードは以下の通り。

#include <math.h>

int HSV2RGB(double h, double s, double v, double *r, double *g, double *b)
{
  // 色相・彩度・明度の範囲チェック
  if (h < 0.0 || h > 360.0 || s < 0.0 || s > 1.0 || v < 0.0 || v > 1.0)
    return -1;

  // 彩度が0ならグレースケール
  if (s == 0.0) {
    *r = v;
    *g = v;
    *b = v;
    return 0;
  }

  double hh = h / 60.0;
  int i = (int)floor(hh);
  double f = hh - i;
  double p = v * (1.0 - s);
  double q = v * (1.0 - s * f);
  double t = v * (1.0 - s * (1.0 - f));

  switch (i % 6) {
    case 0: *r = v; *g = t; *b = p; break;
    case 1: *r = q; *g = v; *b = p; break;
    case 2: *r = p; *g = v; *b = t; break;
    case 3: *r = p; *g = q; *b = v; break;
    case 4: *r = t; *g = p; *b = v; break;
    case 5: *r = v; *g = p; *b = q; break;
  }

  return 0;
}

関数の説明コメントは無くなり、r,g,bのNULLポインタチェックが無くなり、 色相に対応する変換の分岐がif文からswitch文に変わって少し最適化されているようです。 気まぐれで思いっきり変えられると「大丈夫か?」をチェックするのが大変だなぁ?とは思ったりも。 コンパイルエラーするレベルで間違えるならまだしも(対人だと「そんなの出してくるなよ」と思う所ですが)、 依頼する度に合ってたり間違ってたりされると、なんか無理ってなるかも知れません。 AIに限った話でも無いのかも知れませんが🥺。 今のところは「AIにまかせればいいじゃない?」は内容によるという感じに思います。 ダメそうだったら適当に諦めるのが良いかも知れません。対人だとそうもいかない場合があるかも知れませんが🥺。 人類、もう少しがんばるます。

EmacsハングというかCygwinハングを調べていてフェードアウトしてしまっていたのですが、 Emacs-31.0.50の方も確認してみたり。起動したまましばらく放置。

Google検索が新しくなった為か、いよいよクエリパラメータの「num=数」が使えなくなってしまっていて 不便極まりありません。10じゃ少ないって。

Unicode 17.0の仕様がリリースされたらしい。 追加された絵文字は8つのようですが、歪んだ顔はともかく、シャチとか宝箱って無かったのかと思ったりも。 でも、記事によって追加された絵文字が違っているような....?🤔 (参考記事1, 参考記事2)。 そういや、まだ Windows11は Unicode16.0の絵文字もサポートされていなかったような...と思って今見てみたら 表示されるようになってました。あれぇ?いつサポートされた?と思ったのですが、 C:/Windows/Fonts/seguiemj.ttf が 9月10日付けになっていたので、この前のWindowsUpdateで入ったっぽい。 という訳で1年遅れになるのは仕方ないのか?🤔。
さておき、Emacsのmasterブランチには Unicode17.0対応 が9月11日頃に入っているようです。 という訳でテストしていたEmacs-31.0.50を一旦止めて、最新を git pull し直してパッチも当て直して ビルドし直し。何故か起動できなくなって悩んだのですが、lisp/loaddefs.elを消して再生成されたら 大丈夫になりました。 あと、Noto Emojiフォントも更新。 表示してみたのが以下。

Unicode 16.0/17.0 絵文字 on Emacs31

リンゴの芯の絵文字は何かの間違いなのか?🤔
もう少し調べてみたところ、今年7月の世界絵文字デーの時に 9つの絵文字が追加されるような事が アナウンスされていた模様 (元ネタ)。 なのですが、9月のリリース時には8つの絵文字の追加となっていたようです (元ネタ)。 どれが無くなったのかは分からない感じだったようですが、結果的に「リンゴの芯」が無くなってたみたい。 なぜ引っ込められたのかは不明。ともあれ 間違った記事が存在しているのは事実です。

2025/09/12

テレワーク。早めに終了。

gptel。gptel-send や gptel-rewrite を試してみたり。どこまで書けるものか?を試してみた感じ、 ある程度内容を示せばイケるみたい。

以下のような文言を記してみました。

/*
  色相と彩度と明度を 赤と緑と青 に変換するC言語の関数を作成してください。
  関数は「HSV2RGB(double h, double s, double v, double &r, double &g, double &b)」とし、
  入力となる色相は変数h、彩度は変数v、明度は変数vとし、変換結果はr,g,bはポインタ変数に
  赤はr、緑はg、青はbにそれぞれ値を格納してください。
  色相は0~360.0、彩度は0~1.0、明度は0~1.0 の範囲で指定します。
  赤、緑、青は 0~1.0の範囲に変換してください。
  関数の戻り値は変換できた場合は0を返し、入力となる色相、彩度、明度の値が範囲外の場合は-1を返してください。
*/

そして出てきたコードが次のような感じ。

#include <math.h>

/*
 * Convert HSV to RGB.
 *
 * Parameters:
 *   h  - Hue in degrees [0, 360]
 *   s  - Saturation [0, 1]
 *   v  - Value (brightness) [0, 1]
 *   r  - Pointer to store red component [0, 1]
 *   g  - Pointer to store green component [0, 1]
 *   b  - Pointer to store blue component [0, 1]
 *
 * Returns:
 *   0  - Success
 *  -1  - One or more parameters out of range
 */
int HSV2RGB(double h, double s, double v,
            double *r, double *g, double *b)
{
    if (!r || !g || !b)
        return -1;

    if (h < 0.0 || h > 360.0 || s < 0.0 || s > 1.0 || v < 0.0 || v > 1.0)
        return -1;

    double c = v * s;                     /* chroma */
    double h_prime = h / 60.0;
    double x = c * (1.0 - fabs(fmod(h_prime, 2.0) - 1.0));
    double m = v - c;

    double r1, g1, b1;

    if (h_prime >= 0.0 && h_prime < 1.0) {
        r1 = c;  g1 = x;  b1 = 0.0;
    } else if (h_prime >= 1.0 && h_prime < 2.0) {
        r1 = x;  g1 = c;  b1 = 0.0;
    } else if (h_prime >= 2.0 && h_prime < 3.0) {
        r1 = 0.0; g1 = c; b1 = x;
    } else if (h_prime >= 3.0 && h_prime < 4.0) {
        r1 = 0.0; g1 = x; b1 = c;
    } else if (h_prime >= 4.0 && h_prime < 5.0) {
        r1 = x;  g1 = 0.0; b1 = c;
    } else { /* h_prime >= 5.0 && h_prime < 6.0 */
        r1 = c;  g1 = 0.0; b1 = x;
    }

    *r = r1 + m;
    *g = g1 + m;
    *b = b1 + m;

    return 0;
}

合ってそうに思います。ほぅ.....。「色相は0~360.0の範囲」としか記していませんが、 コードのコメントは「Hue in degrees」となっているので、ラジアン角では無いだろうと解釈してます。 また、変換のアルゴリズムも示していません。HSVもRGBも色の表現で、 変換するアルゴリズムを知っていないとコードには落とせないと思います。 加えてC言語を知らないとダメで、ポインタも知っているという事になるかと思います。 13GBのモデルのどこかに文脈からHSVをRGBに変換するアルゴリズムとC言語の知識が 含まれているという事になるのかなぁ と思います。 仮にコードは人間が書いたコードのコピペだったとしても、文脈から変換アルゴリズムを 引き出して対応するコピペ元を紐づけられる必要はあるので、どっちにしても色々知っていないと無理だろう とは思います。器用なもんです😲。

という事から考えても、先日の「Emacsでの矩形領域の選択方法」の回答はやっぱり学習データとなる ドキュメントやWeb情報が訳わからんとなっている可能性が高いようには思ったりも😅。

2025/09/11

テレワーク。早めに終了。

記録的短時間大雨で落雷による停電がありました。体感で1分くらい停電したように思いますが、 色々リセットされてつらい。EmacsハングのテストはノートPCで行っているので継続されてました😅。

Emacsで使用できる AIチャットクライアントはいくつかあるようですが、Ollamaも使えるらしい gptelを試してみたり。 面倒臭いのは依存パッケージに Transient の 0.7.4 以降が必要なのですが、Emacs-30.2の標準パッケージのは 0.7.2.2 の為そのままでは使え無さそうです。 Transient は今や色んな所で使われつつあるので、 迂闊に新しいのを入れると色んな所がダメになりそうなのですが、仕方ないので入れてみたり。 最初に 影響を受けるであろう magit をちょろっと確認してみたのですが、「l l」でログを表示すると、 これまでのログを全て表示しようとしていたり。早速影響があるのが判明。 仕方ないのでmagitの方も更新したところ、適当な行数のログ表示で止まるようになりました。

で、本題のgptelを試したり。.emacsでの最小設定は以下くらいで良さそうです。

(require 'gptel)
(setq
 gptel-model 'gpt-oss:20b
 gptel-backend (gptel-make-ollama "Ollama"
                 :host "localhost:11434"
                 :stream t
                 :models '(gpt-oss:20b)))
(setq gptel-default-mode 'org-mode)

チャット以外にも選択したリージョンを流し込んだり、回答を挿入する事もできるみたいですが、 まだ使いこなせず😓。

何気に「テキストエディタのEmacsで矩形領域を選択する方法を教えてください。」 って聞いてみたら「矩形マークモードをオン | C-x r t」みたいなのが返ってきたのですが、 そりゃ無いわ と思ったりも。「マウスを使うことはできますか?」も 全然ダメな感じのが返ってきて、 Infoを読むしか無いのかと思ったりも😓。 なんで妙な覚え方をしているのだろう?と思わなくもありませんが、 Emacsのドキュメントが訳わからんとか、Webの情報は一つの事をやるのにいくつも方法があって やっぱり訳わからんという事を暗に示唆しているのかも知れません😓。 因みに Emacs-30.2でキーバインドを変更していなければ、 矩形選択開始は「C-x SPC」(rectangle-mark-mode)で、 マウスでの矩形選択は「C-M-<down-mouse-1>」(mouse-drag-region-rectangle)です。

とは言え「相対性理論について教えてください」みたいな質問にも答えてくれる事を考えると、 かなりの 物知り博士 には違いありません。モデルのファイルは13GBくらいなのですが、 この中に大概の情報が含まれていると考えると(同じサイズの動画ファイルとかに比べると) 情報密度がかなり高いとも思えます。

2025/09/10

テレワーク。早めに終了。

ノートPCはEmacsハングのテストの為に立ち上げっぱなしにしていたのですが、 今朝 Windowsアップデートが自動的に適用されてました。Emacsハングのテストは強制終了となったものの、 それと引き換えに いつもWindowsアップデートのダウンロートが何故か全然進まない イライラがありませんでした。 次回から使ってなくてもWindowsアップデート前日に電源入れておくかと思ったりも😓。

今まであまりよく見ていなかったのですが、何故かGPUの 3Dの負荷が常時 30% くらいあるなぁ?と思ったり。 「デスクトップウインドウマネージャー」というプロセスが薄っすらGPUを使っているようなのですが、 なんぞこれ?と思ったり。そして、起動しているEmacsを最小化するとGPU負荷が 0% になるようだったり。 どういうメカニズム?🤔
Webにあるような視覚効果の無効化をいくつか適用してみたのですが、あまり変化は無いようにみえたり。 あと、ウインドウサイズを小さくすると負荷が下がり、大きくすると上がるようです。 最小化すると0になるのとも辻褄が合っていると言われればそんな気もします。 まぁ気になるなら最小化しておくかというくらいで。

Ollamaの OpenAI互換APIを CygwinのPythonから使ってみようと思い、「pip install openai」を 実行してみたのですが、jiter という依存ライブラリがインストールできないようだったり。 エラーメッセージの一部が以下。

 :
  × pip subprocess to install build dependencies did not run successfully.
  │ exit code: 1
  ╰─> [28 lines of output]
      Collecting maturin<2,>=1
        Using cached maturin-1.9.4.tar.gz (213 kB)
        Installing build dependencies: started
        Installing build dependencies: finished with status 'done'
        Getting requirements to build wheel: started
        Getting requirements to build wheel: finished with status 'done'
        Installing backend dependencies: started
        Installing backend dependencies: finished with status 'done'
        Preparing metadata (pyproject.toml): started
        Preparing metadata (pyproject.toml): finished with status 'error'
        error: subprocess-exited-with-error

        × Preparing metadata (pyproject.toml) did not run successfully.
        │ exit code: 1
        ╰─> [3 lines of output]
            Python reports SOABI: cpython-39-x86_64-cygwin
            Unsupported platform: x86_64-cygwin
            Rust not found, installing into a temporary directory
            [end of output]

        note: This error originates from a subprocess, and is likely not a problem with pip.
      error: metadata-generation-failed

      × Encountered error while generating package metadata.
      ╰─> See above for output.

      note: This is an issue with the package mentioned above, not pip.
      hint: See above for details.
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.

 :

文字通り読むと「Unsupported platform: x86_64-cygwin」で「Rust not found, installing into a temporary directory」 だからという事らしい。Rust依存なのか....🥺

仕方ないので他の方法を少し調べてみたところ、デフォルトは「localhost:11434」のみアクセス可能なようですが、 環境変数 OLLAMA_HOST と OLLAMA_ORIGINS を設定すれば、ローカルエリアネットワークのコンピュータからも アクセス可能になるようです。VirtualBoxの仮想マシンの繋がっているネットワークを許可するように 環境変数を設定してOllamaを再起動した後、仮想マシンから「curl http://xxx.xxx.xxx.1:11434」でアクセスしたら 「Ollama is running」の文字列が返ってきたのでVMからアクセスできるようです。 VMのFedoraに「pip install openai」でopenaiライブラリをインストールした後、Webのサンプル Pythonコードを実行してみたら返事が返ってきたので一応使える模様。 ただ、JSON形式で取得できるとなっているようですが、回答内容そのものは辞書型変数の中の response.choices[0].message.content に Markdown形式が文字列で格納されているだけのように思えたり。

2025/09/09

テレワーク。早めに終了。

デスクトップのWindows11もCygwinにパッチを当てて様子を見てみることに。Emacsの動作よりも、普段使いして 他のコマンドに副作用が無いかの様子を見る感じで。

タスクマネージャでGPUの使用率にCUDAが選べなかった件は、先日の参考ページの通りで 再起動したら 表示できるようになりました。Ollamaを動かしてみたところ、問に答える時にCUDA全力で動いているようです。 あとよく見ていなかったのですが、GPUメモリをバク食い(13.8GBくらい)しています。

EmacsハングのCygwinパッチ対応。一昨日から複数のEmacsを起動しっぱなしにしていたのですが、 3つあるうちの一つが止まっていたり😭。やっぱりロックが解除できない状況に陥っているようです。 確かに、パッチのロジックでは、ロックがかかっている場合は100% スキップ されますが、ロックがかかっていないと判定した後で、ロックを掛ける前にスレッドがスイッチして ロック実行を横取りされる可能性はゼロではありません。 それをアトミックに行うのが InterlockedExchange() などのような特別な関数なのでしょうけど。うーむ。 ただ、ハング発生確率はかなり低くなっているとは言えそうです。

2025/09/08

テレワーク。早めに終了。

EmacsハングのCygwinパッチ対応。昨日から複数のEmacsを48時間ほど起動しっぱなしにしていたのですが、 どれもハングすること無く動き続けてます。ひとまず今週のWindowsアップデートが来るまでそのまま継続してみよう。

唐突ですが ローカルLLMとやらを試してみたくなったので調べてみたり。 Ollamaというツールを使えば 色々なモデルが試せるようなのでインストールしてみたり。 インストール完了と同時にプロンプト入力ウインドウが開き、適当に質問を入れたらモデル(gpt-oss:20b) がダウンロードされ始め、完了すると応答が返ってきたのでこれで使えるようです。

Ollamaスナップショット

ollamaというコマンド名でコマンドラインからも使えるので(Cygwinのmintty+bash、screenコマンドを挟んでも 良いし、Emacsのvtermからも一応使えました)、どうにかすればEmacsとかからも使えるんじゃないかなー? という気がします。ただ、応答がMarkdownで表示されるようなので、普通のターミナルでは なんか読みにくいです😓。
あと、デスクトップのWindows11のタスクマネージャはGPUの使用率表示にCUDAを選べません。 見かけ上 GPUを使っていないようにも見えるのですが、 GPU-Zで負荷を見てみると一応GPUを使っているようです。 Webで検索してみるとズバリな回答があったり (参考ページ)。 再起動が必要みたいですが、今は色々動かしてて再起動したくないので明日試してみよう。

2025/09/07

AM中に起床。

掃除したり洗濯したり。

D言語で以下のような構造体のコンストラクタを書いたのですが、何故かエラーで怒られたり。

$ cat -n struct_test.d
     1  import std.stdio;
     2  import std.string;
     3
     4  struct Test{
     5    int x;
     6
     7    this(){
     8      x=3;
     9    }
    10  }

$ dmd struct_test.d
struct_test.d(7): Error: constructor `struct_test.Test.this` default constructor for structs only allowed with `@disable`, no body, and no parameters
  this(){
  ^

イマイチ何を怒られているのか分からないのですが、「this(int){x=3;}」だと怒られないようです。 何かしら引数を与えられるようにする必要があるようですが 前からこうでしたっけ?🤔

GIMPの開発版 3.1.4のリリースアナウンスが出ているのを知ったり (GIMP 3.1.4: Second Development Release towards GIMP 3.2)。 ベクターレイヤーというものが追加されるようです。ほぅ....。 パスツールを使って描く事ができるようですが、どんなUIになるのかは説明ではよくわからず。

2025/09/06

AM中に起床。

Emacsハングの件。というかCygwinハングの件。 straceでアタッチしたままほったらかしておいたところハングしてました。 ダメなのか?と思い Process Explorer で見てみたところ何故かメインスレッドがサスペンド状態 になっていました。Resumeで再開してみたらそのままSegfaultになったり。なんだこりゃ?🤔 straceでアタッチしていたのがダメなのか?とも思ったので、今度はただ起動しておくだけにしてみたり。 どうなるか....?

12時間ほど見てみたのですが、straceでアタッチしていた時のようにサスペンド状態にはならなかったり。 なにやら動きが変わるのかも知れませんが確認ムズい🥺。
一旦区切りとして、Cygwinのパッチは以下のような感じ。

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index f79978f73..bb45b0148 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -961,7 +961,7 @@ _cygtls::interrupt_now (CONTEXT *cx, siginfo_t& si, void *handler,
       if (!inside_kernel (cx, true))
        {
          HANDLE h_veh = AddVectoredExceptionHandler (0, singlestep_handler);
-         cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
+//       cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
          SetThreadContext (*this, cx);
          suspend_on_exception = true;
          in_singlestep_handler = false;
diff --git a/winsup/cygwin/mm/cygheap.cc b/winsup/cygwin/mm/cygheap.cc
index 1c9b8037b..c34ff8c26 100644
--- a/winsup/cygwin/mm/cygheap.cc
+++ b/winsup/cygwin/mm/cygheap.cc
@@ -743,6 +743,8 @@ init_cygheap::find_tls (int sig, bool& issig_wait)
   while (++ix < (int) nthreads)
     {
       /* Only pthreads have tid set to non-0. */
+      if (threadlist[ix].thread->locked () != false)
+       continue;
       threadlist[ix].thread->lock ();
       if (!threadlist[ix].thread->tid
          || !threadlist[ix].thread->initialized)

二つありますが、Emacsハングの対応パッチは mm/cygheap.cc の方だけです。 lockがかかっていたらスキップするという そのまんまのロジックです(以前のメモ)。 因みにstraceによるデバッグ表示無しのバージョンです。 exceptions.cc の方は 3.6.4-1 でgdb上で emacsを実行すると 謎のSIGTRAP で止まりまくるのを 回避する為のパッチ(以前のメモ)ですが、 こちらは何か副作用があるかも知れません。

2025/09/05

テレワーク。気持ち早めに終了。

Emacsハングの件。というかCygwinハングの件。 先日のコンパイルのオプティマイズレベルを上げたものでもハング再現しないようだったり。 そういや既にロックしてたらスキップするみたいなコードなのですが、一度発生したらロックしっぱなしなのか、 ぶつかりさえしなければアンロックされているのか、が気になったので調べてみる事に。 と言っても、デバッガ上で動かすと動きが変わってしまいそうなので、デバッグprintを使おうと思ったのですが、 普通のはどれも大量に使用されているようだったので、special_printf()というのを使って 「strace --mask=special ...」でメッセージを絞る感じで観察しようと思ったり。 しかし、「strace --mask=special emacs-w32」で最初から strace に乗せると、メッセージが出ていなくても 異常に遅かったので、起動を済ませた後で 「strace --mask=special -p プロセスID」でアタッチする方式で網掛け。 さて、どうなるか....?

網掛けメッセージはわりとすぐに出力されたり。ただ、持続したりはしないみたい。 ついでにシグナル番号と思われるものも表示してみていたところ、どうやら SIGALRM を受けた時に 既にロックされている場面に遭遇しているようでした。killコマンドで SIGALRM を送ったらどうなる? と何の気なしに「while true; do kill -s SIGALRM pid; done」で送りまくってみたら、 デバッグメッセージが流れるように表示されたり😅。 もしかして再現を加速できる?と思ったので Cygwin 3.6.2-1 かつ オリジナル emacs-w32 で試してみた のですが、動きが遅くなったりはするもののハングにまでは至らず。むぅ。

2025/09/04

テレワーク。早くもなく遅くもなく終了。

Emacsハングの件。というかCygwinハングの件。 先日加えたCygwinの改造を適用してEmacsを立ち上げっぱなしにしていたのですが、 26時間以上ハング再現しないという状況です。 対処方法として正しいか否かは別にして、ひとまず避けられているみたい。 一旦止めて コンパイルのオプティマイズレベルをO0からO2に戻したものに差し替えて しばらく様子を見てみよう。

2025/09/03

テレワーク。早めに終了。

Emacsハングの件。もう一度Cygwinのソースコードを眺めたり。 ロック制御している箇所の一つは winsup/cygwin/mm/cygheap.cc:init_cygheap::find_tls() の中なのですが、 もう一つ winsup/cygwin/local_includes/cygtls.h 内で定義されるクラス _cygtls の中の get_signal_arrived()というメソッドがありました。 なんとなく、シグナルが到着したら何かするって感じみたいです。 昨日の改造コードは既にロックがかかっていればそのままにするってロジックにしたのですが、 なんかダメかもなぁ?って感じだったかも。 そこで、find_tls()の方を ロックがかかっていたらそのスレッドは無視して次のスレッドを チェックするようなロジックにしてみたり。まぁこれも直している事になっているのか分かりませんが、 二重にロックしようとして脱出できなくなる事は無くなるハズ?という期待です。 そもそも、一つのスレッドで find_tls() と get_signal_arrived() を同時に実行する事は無い のだとすると、find_tls()を実行するスレッドAと、get_signal_arrived()を実行するスレッドBが ちゃんと切り替われば、ロックが脱出できなくなることは無いハズと考えられます。 しかし、実際にロック処理で脱出できなくなっているので、 「lock()~unlock()」の組がどの瞬間にも複数重ならないようにしたらどうなるか? という感じです。

Emacsハングとは関係無い話。ELISPの message関数を使ってデバッグしていて、何故かELISPエラーと なって、なんで?ってなりました。最小コードで示すと「(message "100%")」でエラーとなりました。 message関数の1番目の引数はフォーマットストリングなので「%」がダメって事でした。 実際には文字列の入っている変数を 何の気なしに「(message strvar)」とかやってしまってたのですが、 習慣的に「(message "%s" strvar)」と書く癖を付ける必要があるかもなぁ?とは思ったりも。 修行が足りません🥺。

タケモトピアノのCMがリニューアルでHD化されとる。

2025/09/02

テレワーク。早めに終了。

先日のロックコードのループにカウンタを設けて、あるカウント回数に達したら exit するようなコードにして ハングではなく終了するか?という網掛け確認してみたり。.....すぐに再現せず。

時間はかかりましたが一応 網にはかかったり。やっぱりlockを脱出できない場合があるみたい。 で、ロックを実行するコードを眺めていて思ったのですが、自分でロックをかけて用事が終わったら 自分でアンロックするという前提のコードになっているのですが、既にロックがかかっている場合は 脱出できない状況に必ず陥ると思われます。なので、ロックがかかっていない場合に限り ロックをかけるという風にしてはどうか?と思ったり。

コードを変更して実行。ひとまずハング再現待ち。と言ってもハングしない状況になるので、 どこでロックされたか分からないのに別の所でロックを外す事になるけど、それで変にならないか?という 確認になるかも知れませんが。

ん~~、なんかダメでした。何故かハングが再現する場合と、exitする網掛けに引っかかる場合があって、 なんで?な感じ。

2025/09/01

テレワーク。早めに終了。

Emacsハングの件。 Emacsをgdbに乗せずに直実行したところでハングが再現した後、以下のような操作でどこで止まっているかを 調べてみたり。

  1. Process Explorer で予めCPUをバグ食いしているスレッドIDを調べておく。
  2. 「gdb -p プロセスID」でアタッチする。
  3. 「info threads」のスレッド一覧と、1.のスレッドIDを付き合わせて、「thread #id」でスレッドを切り替える。
  4. 「si」コマンドで命令単位のステップ実行をしばらく繰り返して、Cygwin上のコード領域に脱出する。

って感じで見たところ、 winsup/cygwin/mm/cygheap.cc の中の init_cygheap::find_tls() の中の 「threadlist[ix].thread->lock ()」のロック処理が脱出できないように見えたり。 lock()は ./winsup/cygwin/local_includes/cygtls.h 内の class _cygtls の中に実装されているようで、

  void lock ()
  {
    while (InterlockedExchange (&stacklock, 1))
      {
#ifdef __x86_64__
        __asm__ ("pause");
#else
#error unimplemented for this target
#endif
        Sleep (0);
      }
  }

というコードのようですが、InterlockedExchange()が非ゼロのままだと無限ループしてしまうと いう感じになるようです。ただ、先日の truncl()とは関係無い場所にも見えるので、 本当にCPUをバク食いしている原因コードの中なのかは分からず。
まだよくわかりませんが、InterlockedExchange()は &stacklock の値が0なら1をセットして 戻り値は 変更前の0が返るのでループを脱出できるという事のようです。誰かがロックしていて &stacklockの値が1ならば、戻り値は元の&stacklock値の1が返るのでループするという感じ。 ロックされてなくて自分がロックできれば脱出できるけど、誰か他の人がロックしっぱなしだと 自分がロックできるまでループを脱出できないという事が起こる可能性はあるかも知れません。 でもそれはデッドロックしているのでダメかも。

2025/08/31

AM中に起床。

掃除したり洗濯したり。

先日の 関数truncl() ですが、これってマルチスレッドの時はどうなってるんだ?と思ったりも。 というのは、(1)それまでのFPUの制御レジスタの値を一旦保存しておいて、(2)丸めの設定をtruncl()用に変更した後、 (3)実際に丸め処理を行って、(4)終わったら保存していた丸めの設定を元に戻す、というような事をやっているようです。 ただこれ、例えば丸めの設定を変更した後に実際の丸め処理を行う前にスレッドが切り替わったとして、 その後またスレッドに実行権が戻って来た時に 丸めの設定が他のスレッドで変えられていないという 保証ってされてるの?と思ったりも。一連の操作がアトミックに行われる保証があるなら問題無い かも知れませんが、関数truncl()ってスレッドセーフなのかしら?が先日のコードだけ見てもよくわかりません。
いや、スレッドが切り替わるときにレジスタを全て保存してれば大丈夫か。 だた、saved_cw や tmp_cw がスレッドローカルストレージには見えないので、最適化によりメモリに置くことは無く レジスタに保持しているという保証が必要では?とは思ったりも。

先日よりgdb上で動かしているEmacsですが、その後も何度かハング状態になり、その度にメインスレッドが サスペンド状態だったのですが、Resumeすれば回復するという感じになりました。 でも gdbのプロンプトに戻ってくる訳では無いので 状態を見ることができません。 gdb上で動かすか否かで挙動が大分違うのでどうにも困った感じです。 何かしら動いてはいるので、CPUをバク食いしているスレッドにアタッチできれば良さそうにも思うのですが、 どうやればよいのか分かりません🥺。

VirtualBoxのFedoraのソフトウェアアップデートしたらEmacs30.2が来てました。 結構タイムラグがあるなぁとは思ったりも。

2025/08/30

AM中に起床。

全然関係ない流れで 「【100年以上未解決】小学生でもわかる・昆虫が海にいない理由【科学・ざっくり解説】」 という動画を知りました。内容はアカデミックなのに表現が独特で難しさが和らいでいるように感じました。 全部は見れていませんが他の動画も面白かったです。

プロセス起動時に生成される謎のスレッド。 D言語で以下のようなほぼ無限ループのコードを実行した状態を Process Explorer で観察してみました。

import std.stdio;
import std.string;

void main()
{
  for( long i=0 ; i<0x10000000000; i++){
    if( i%1000000000==0 ){
      writeln("Hello D world.",i);
    }
  }
  return;
}

起動して直ぐは、謎のスレッドが3つほど立ち上がっているのですが、30秒ほどすると メインスレッド以外のスレッドは終了するようです。

プロセス起動直後のスレッド一覧 →30秒後→ 30秒ほど経った後のスレッド一覧

また、謎のスレッドが無くなる前に意図的にスレッドをkillしてみた(スレッドを選んでkillボタンで殺せる)のですが、 メインスレッドがどうにかなる事は無く動き続けるようです。 ハングの要因にこの謎のスレッドが関係しているのではないか?と思っていた訳ですが、 そもそもメインスレッドには何も影響は無く、ほっとけば勝手に終了してしまうスレッドという事から、 Cygwin管理下のスレッド群の何かがどうにかなっててEmacsがハング状態に陥っているのかなぁ? と思い直したりも。

なんとなく「これか?」と思う所があったりも。 Emacsがハング状態に陥っているところで、残っているスレッドを見てみたところ、「Cycles Delta」 というパラメータがやたら大きくなっているスレッドがありました。これってCPUをバク食いしているスレッドで、 これがハングの原因じゃね?と思った次第。二つのEmacsで再現したので両方で見てみたところ、 どちらも同じ感じになっているようでした。CPUをバグ食いしているスレッドのスタックを表示したのが以下。

Emacsハング時にCPUをバク食いしているスレッドのスタック

見える範囲では、cygwin1.dll内の truncl って関数の中で何かが起こっているのかな?と思ったりも。 関数truncl 自体はいくつかの箇所で定義されているようですが、Cygwin本体のは winsup/cygwin/math/truncl.c の奴かな?と思って調べてみたり。 git log上は 2016年3月18日にファイルが追加されて、2016年7月18日に更新された以降は特に手が加えられては いないようです。ファイル自体は大きくはなくて、全部表示しても以下のような感じみたいです。

$ cat winsup/cygwin/math/truncl.c
/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#include <fenv.h>
#include <math.h>

/* Mask and shift amount for rounding bits on x86/x86_64. */
#define FE_CW_ROUND_MASK        (0x0c00)
#define FE_CW_ROUND_SHIFT       (10)

long double
truncl (long double _x)
{
#if defined(_ARM_) || defined(__arm__)
  return trunc(_x);
#else
  long double retval = 0.0L;
  unsigned short saved_cw;
  unsigned short tmp_cw;
  __asm__ __volatile__ ("fnstcw %0;" : "=m" (saved_cw)); /* save FPU control word */
  tmp_cw = (saved_cw & ~FE_CW_ROUND_MASK)
           | (FE_TOWARDZERO << FE_CW_ROUND_SHIFT);
  __asm__ __volatile__ ("fldcw %0;" : : "m" (tmp_cw));
  __asm__ __volatile__ ("frndint;" : "=t" (retval)  : "0" (_x)); /* round towards zero */
  __asm__ __volatile__ ("fldcw %0;" : : "m" (saved_cw) ); /* restore saved control word */
  return retval;
#endif /* defined(_ARM_) || defined(__arm__) */
}

x86の場合はインラインアセンブラで書かれている模様。 そもそも、trunclは浮動小数点数値を絶対値に最も近い整数値に切り捨て方向に丸めるという関数のようなのですが、 そういう関数でハング状態に陥るか????🤔 とは思ったりも。

ソースコードを眺めてみても、関数sigfilset()から関数secure_getenv()に辿り着けそうに無いし、 関数secure_getenv()から 関数truncl()にも辿り着けそうにありません。このスタック表示は正しいのだろうか?🤔

gdb上で関数trunclにブレークポイントを張った状態でEmacsを動かして ハングが再現したのですが、 trunclで止まっている訳ではなさそう(gdbプロンプトに落ちてこない)で あれぇ? な感じに。 ただ、何故かメインスレッドがサスペンドした状態になっていて、Process Explorer で Resume が 可能だったので Resumeしてみると再び動き始めました。 むむ、何かgdbではキャッチしていないシグナルを受けて止まっているという状況なのか???🤔 そんな事できるんだっけ?

2025/08/29

テレワーク。早めに終了。

Emacsのハング再現。 「Process Explorer」 を使ってスレッドの観察をしてみているのですが、イマイチ振る舞いがよくわからず。 プロセス起動時に生成されるスレッドを見ていると何故か無くなる場合があるようで、 それでも動いているので「どういう事?🤔」ってなってます。 gdb上で動かす場合とそうでない場合で振る舞いが異なるようにも見えている気も。うーむ?

2025/08/28

テレワーク。早めに終了。

タイピングplus。バグってたのは直った模様。

調べごとをして終了。

2025/08/27

テレワーク。早めに終了。

タイピングplus、なんか激しくバグってないか?

Emacsのハング再現。なにやら緩めの負荷でやっているせいか再現しないなぁ?🤔

2025/08/26

テレワーク。早めに終了。

Windowsプロセスのスレッド。そういや 「Process Explorer」 があったのを思い出したり。スレッドも表示ができるようなので、ハングした時の様子を観察するのに使えないか? という事で試してみることに。見ている時間でハング再現せず😓。 因みに、Process Explorerで見ても、プロセス起動時に生成される名無しのスレッドがどれなのか?は分からないので、

  1. gdb上で Emacsを実行。
  2. Ctrl-Zなどで適当にSIGSTOPで「info threads」でスレッドの一覧を表示。
  3. Process Explorerで対象となるEmacsのプロセスを探して、右クリック→Propertiesの Threadsタブを開く。
  4. 2.のgdbでの ThreadId xxxx.0x???? の 0x????を 10進数にしたものが、3.のProcess ExplorerでのThreadsタブの TIDに対応する。

で対応付けを確認する必要があるみたい。

とか調べているとハングが再現したり。スレッドのスタックが表示できるようなので、名無しのスレッドの一つを見てみると、

0x0000000000000000
ntdll.dll!ZwWaitForAlertByThreadId+0x14
ntdll.dll!RtlInitializeResource+0x9bf
ntdll.dll!RtlRaiseStatus+0x48f
ntdll.dll!RtlEnterCriticalSection+0xf2
ntdll.dll!RtlSizeHeap+0x109a
ntdll.dll!RtlAllocateHeap+0x753c
ntdll.dll!RtlFreeHeap+0x620
ntdll.dll!LdrLockLoaderLock+0x6ae
ntdll.dll!RtlAcquireSRWLockExclusive+0x150a
KERNEL32.DLL!BaseThreadInitThunk+0x17
ntdll.dll!RtlUserThreadStart+0x2c

という感じになっていて、WaitForAlertByThreadId なる所で何かを待っているっぽいようです。 スレッドのステートは「Wait:WrAlertByThread」なるものになっているようです。うーむ、分からん🥺。

2025/08/25

テレワーク。早めに終了。

Windowsプロセスのスレッド。D言語で書いてdmdやldc2でコンパイルした HelloWorld的なコマンドラインの プログラムでも、スレッドが生成されているようなので こういうものなのか?と思ったりも。 Webで検索すると、必ず1つ プライマリスレッドが生成されるらしいというのは分かったのですが、 複数のスレッドの場合があるのかはよくわかりませんでした。 また、dmdだとスレッドが3つだけど ldc2ではスレッドが2つ生成される感じになっていて、 どういう事?かがよく解らなかったり。だた、dmdやldc2でコンパイルした実行ファイルは objdumpで逆アセンブルしてもシンボルが無くて何やっているのかが分かりません。 .textセクションの先頭アドレスでブレークポイントを置いても、そのブレークポイントに 達する前にスレッドが生成されているようです。Cygwinでコンパイルした emacsバイナリでも、 先頭アドレス(シンボル的にはWinMainCRTStartup)で止まる前にスレッドが生成されているという感じのようです。

(gdb) b WinMainCRTStartup
Breakpoint 1 at 0x100401004: file /usr/src/debug/cygwin-3.6.2-1/winsup/cygwin/crt0.c, line 17.
(gdb) run
Starting program: /cygdrive/d/cygwin/home/TANE-HP/develop/work/emacs-30.2/emacs-30.2-ime/emacs-30.2/src/emacs.exe
[New Thread 9556.0x9fdc]
[New Thread 9556.0x68fc]
[New Thread 9556.0x4db8]
[New Thread 9556.0x4cb0]

Thread 1 hit Breakpoint 1, mainCRTStartup () at /usr/src/debug/cygwin-3.6.2-1/winsup/cygwin/crt0.c:17
warning: 17     /usr/src/debug/cygwin-3.6.2-1/winsup/cygwin/crt0.c: No such file or directory
(gdb) info threads
  Id   Target Id          Frame
* 1    Thread 9556.0x6404 mainCRTStartup () at /usr/src/debug/cygwin-3.6.2-1/winsup/cygwin/crt0.c:17
  2    Thread 9556.0x9fdc 0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  3    Thread 9556.0x68fc 0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  4    Thread 9556.0x4db8 0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  5    Thread 9556.0x4cb0 0x00007ffb9225c320 in ntdll!RtlUserThreadStart () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
(gdb) thread apply all bt

Thread 5 (Thread 9556.0x4cb0):
#0  0x00007ffb9225c320 in ntdll!RtlUserThreadStart () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#1  0x0000000000000000 in ?? ()

Thread 4 (Thread 9556.0x4db8):
#0  0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#1  0x00007ffb922b259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#2  0x00007ffb90b9e8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/windows/System32/KERNEL32.DLL
#3  0x00007ffb9225c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 3 (Thread 9556.0x68fc):
#0  0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#1  0x00007ffb922b259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#2  0x00007ffb90b9e8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/windows/System32/KERNEL32.DLL
#3  0x00007ffb9225c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 2 (Thread 9556.0x9fdc):
#0  0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#1  0x00007ffb922b259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#2  0x00007ffb90b9e8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/windows/System32/KERNEL32.DLL
#3  0x00007ffb9225c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 1 (Thread 9556.0x6404):
#0  mainCRTStartup () at /usr/src/debug/cygwin-3.6.2-1/winsup/cygwin/crt0.c:17
(gdb)

プログラムの先頭で既に複数のスレッドが存在している状況に見えるので、もう調べようがありません🥺。

2025/08/24

AM中に起床。

掃除したり洗濯したり。

そういえばと思い今更ですが検索した 「REALFORCE TYPING CHAMPIONSHIP 2025」。 おかしな速度(褒め)なのは以前にも思った事ですが、 史上最年少って小学生らしい。すげぇ....。 で、最近は上位ランカーが多くて全然見ていなかったのですが、 「タイピングplus」のランキング上位に 大会に出場していた選手と思われる 人たちが居るなぁと思ったり。 TANE自身は一応毎日1回以上は練習しているものの、サービス全体平均スコアくらいを維持するので精一杯です😅。 ところで、8月21日くらいから練習記録の練習時間が妙な時間を表示するようになってますがバグか?

Emacsハングの件。結局程度の差はあるけど、どのようなビルドでもハングはするという感じに見えます。 そこでスレッドのバックトレースを取れるのを知ったので、それで何か分からないかと少し調べてみました。 何度か再現させて観察してみたところ、ハングが再現した後にいくつかのスレッドが終了しているように 思いました。

  Id   Target Id                             Frame
* 1    Thread 27424.0x369c "emacs-30.2.1"    0x00007fff14b12352 in _cygtls::lock (this=<optimized out>) at /home/TANE-HP/develop/work/cygwin/newlib-cygwin/winsup/cygwin/local_includes/cygtls.h:245
  2    Thread 27424.0x5514                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  3    Thread 27424.0x2c14                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  4    Thread 27424.0x2ce4                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  5    Thread 27424.0x2fa8 "sig"             0x00007fffc5547f7a in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll
  6    Thread 27424.0x2b2c                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  7    Thread 27424.0x6350                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  8    Thread 27424.0x4b20 "timerfd"         0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  9    Thread 27424.0x4dec "gmain"           0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  10   Thread 27424.0x6698 "pipesel"         0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  11   Thread 27424.0x315c "itimer"          0x00007fffc5547f7a in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll
  12   Thread 27424.0x5178                   0x00007fffc52d1324 in win32u!NtUserGetMessage () from /cygdrive/c/WINDOWS/System32/win32u.dll
  13   Thread 27424.0x4dd4                   0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  16   Thread 27424.0x672c                   0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  17   Thread 27424.0x2b54                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  18   Thread 27424.0x3594 "waitproc"        0x00007fffc7da2974 in ntdll!ZwReadFile () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  19   Thread 27424.0x173c                   0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  20   Thread 27424.0x2350 "pipesel"         0x00007fffc7da2934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  21   Thread 27424.0x39c4 "[pango] fontcon" 0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  22   Thread 27424.0x2f8c "emacs-30.2.1"    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  23   Thread 27424.0x1e1c "emacs-30.2.1"    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  24   Thread 27424.0x4124                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
[Thread 27424.0x2c14 exited with code 0]
[Thread 27424.0x5514 exited with code 0]
[Thread 27424.0x2ce4 exited with code 0]
[New Thread 27424.0x634c]

一覧の番号で言うと Id=2,3,4 のスレッドが code 0 で終了しているようです。 で、この Id=2,3,4 って何?というのをスタックダンプで見たのが以下。

  :
Thread 4 (Thread 27424.0x2ce4):
#0  0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007fffc7cd259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x00007fffc68ae8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#3  0x00007fffc7c7c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 3 (Thread 27424.0x2c14):
#0  0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007fffc7cd259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x00007fffc68ae8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#3  0x00007fffc7c7c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 2 (Thread 27424.0x5514):
#0  0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007fffc7cd259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x00007fffc68ae8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#3  0x00007fffc7c7c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()
  :

これらのスレッド以外のスレッドは何かしらCygwinを経由しているようなトレースが取れていますが、 これらはCygwinとは無関係な何かに見えます。 ここからは想像ですが、何かしらの理由で Id=2,3,4 のスレッドが終了してしまうけど、それが検知されず ハング状態に陥ってしまうという事か? 因みに、今回の出所不明のスレッドについては、 Idは違いますがこちらのML記事 と同じように存在しているものと思われます。ただ、何者なのかは分からないみたい。 スレッド生成のAPIにブレークポイントを仕掛けて誰がスレッドを作っているかを調べるしか無いのか?

とりあえずWin32APIの CreateThread() にブレークポイントを設定してみたのですが、 以下のような感じになりました。

(gdb) b CreateThread
Breakpoint 1 at 0x1007173f0
(gdb) run
Starting program: /home/TANE-HP/develop/work/emacs-30.2/emacs-30.2-ime/hangtest-emacs-30.2/src/emacs-30.2.1.exe
[New Thread 19000.0x43c4]
[New Thread 19000.0x5490]
[New Thread 19000.0x5a4c]

Thread 1 hit Breakpoint 1.2, 0x00007fffc68b3107 in KERNEL32!CreateThread () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
(gdb) info threads
  Id   Target Id           Frame
* 1    Thread 19000.0x27e8 0x00007fffc68b3107 in KERNEL32!CreateThread () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
  2    Thread 19000.0x43c4 0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  3    Thread 19000.0x5490 0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  4    Thread 19000.0x5a4c 0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
(gdb) thread apply all bt

Thread 4 (Thread 19000.0x5a4c):
#0  0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007fffc7cd259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x00007fffc68ae8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#3  0x00007fffc7c7c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 3 (Thread 19000.0x5490):
#0  0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007fffc7cd259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x00007fffc68ae8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#3  0x00007fffc7c7c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 2 (Thread 19000.0x43c4):
#0  0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#1  0x00007fffc7cd259e in ntdll!RtlAcquireSRWLockExclusive () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#2  0x00007fffc68ae8d7 in KERNEL32!BaseThreadInitThunk () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#3  0x00007fffc7c7c34c in ntdll!RtlUserThreadStart () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x0000000000000000 in ?? ()

Thread 1 (Thread 19000.0x27e8):
#0  0x00007fffc68b3107 in KERNEL32!CreateThread () from /cygdrive/c/WINDOWS/System32/KERNEL32.DLL
#1  0x00007fff14af50e3 in cygthread::create (this=this@entry=0x7fff14cf54e0 <threads>) at ../../../../newlib-cygwin/winsup/cygwin/cygthread.cc:299
#2  0x00007fff14af515d in cygthread::async_create (arg=140733542520032) at ../../../../newlib-cygwin/winsup/cygwin/cygthread.cc:273
#3  0x00007fffc7cb1b93 in ntdll!RtlDeleteElementGenericTableAvlEx () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#4  0x00007fffc7da67be in ntdll!KiUserApcDispatcher () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#5  0x00007fffc7da6304 in ntdll!ZwTestAlert () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#6  0x00007fffc7ca37e6 in ntdll!EtwEventWriteNoRegistration () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#7  0x00007fffc7ca367e in ntdll!EtwEventWriteNoRegistration () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#8  0x00007fffc7c75fce in ntdll!LdrInitializeThunk () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
#9  0x0000000000000000 in ?? ()
(gdb)

一応止まるのですが、止まった時点では既に Id=2,3,4 が生成されているように見えます。CreateThread()じゃない 何かでスレッドが生成されているという事?🤔
gdbは「[New Thread 39784.0x5310]」のような感じで新しいスレッドが生成されたことを認識できているように 思えるのですが、何かしらgdb側でスレッドが生成された時に止めるとか情報表示する方法は無いのかしら?🤔

2025/08/23

AM中に起床。

午前中に通院。

Emacsハングの件。

| imagemagick | native-image-api |  rsvg   | IMEpatch | ハング再現 |       その他       |
|-------------+------------------+---------+----------+------------+--------------------|
|   without   |     without      | without |   with   |    する    |     パッチ有り     |
|   without   |     without      | without | without  |    する    |     パッチ有り     |
|   without   |        -         |    -    |    -     |    する    |     パッチ無し     |
|      -      |        -         |    -    |    -     |    する    | オリジナルバイナリ |

※Cygwin 3.6.5相当(commit a5f96c196 (HEAD -> cygwin-3_6-branch, origin/cygwin-3_6-branch))にSIGTRAP回避パッチを当てたもの
※ベースのconfigureオプションは「--prefix=/usr --with-w32 --with-native-compilation=no」
※観察の為にgdb上で動かし SIGTRAPをトリガに info threads を表示する(参考)
※IMEpatchは src/config.h を手で変える方式
※「-」は選択不能でwithoutと同等

これまで大丈夫と思っていたオリジナルのemacs-w32バイナリでも、 時間をかければハング再現してしまう感じになっています🥺。 ただ、gdb上で動かしているとか、シグナルを送っているとか、普段使いでは行わない事をやっているので、 加速する感じになっている気がしなくはありません。
必ず再現する手番(時間をかけるようなのではなくて再現する一意の操作手順)が見つかっていないのと、 ハングしている状況では何も調べられないのとで、原因究明が困難になっています。

Web検索していると 過去にCygwinのMLで 「Threads」という 投稿からの一連の流れがあった事を知ったり。 現在もCygwinのEmacsパッケージをメンテナンスしている Ken Brown氏が Emacsを起動すると大量の threadが生成されるけど 誰が生成しているんだ?的な話から、 シグナルの話など なんか既視感のある話題だなぁ?と思ったりも。 今から10年くらい前の話なので直接関係は無いと思いますが。 全部読めてません(英語よく解らんもある😓)が、最終的に解決した話題のようなので 当時は何が問題でどういう原因をどう直したかが読めると、今回の話のヒントが何かないかなぁ?と 思ったりも。何も分からないかも知れませんが😓。

gdbコマンドの「info threads」でスレッドの一覧を表示できることを知ったのですが、 「thread apply all bt」で全スレッドのスタックトレースを表示できることを知ったり。
こちらのML記事の中に スレッドの負荷テストのコードが記されているのですが、試しにコンパイル&実行してみたところ 謎の動きになったり。

$ cat signal-stress.c
#include <assert.h>
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

long SmartScheduleInterval = 1; /* ms */
long SmartScheduleTime = 0;

static void
SmartScheduleTimer(int sig)
{
    if (sig != 0)
       SmartScheduleTime += SmartScheduleInterval;
}

void
SmartScheduleStartTimer(void)
{
    struct itimerval timer;
    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
    timer.it_value.tv_sec = 0;
    timer.it_value.tv_usec = SmartScheduleInterval * 1000;
    setitimer(ITIMER_REAL, &timer, 0);
}

int main()
{
    /* Set up the timer signal function */
    struct sigaction act;
    act.sa_handler = SmartScheduleTimer;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, SIGALRM);
    if (sigaction(SIGALRM, &act, 0) < 0) {
        perror("sigaction failed");
        return -1;
    }

   /* start timer */
   SmartScheduleStartTimer();

   /* Loop forever, doing tests which should always succeed, with lots of signals */
   int x = 0;
   int i = 0;
   while (1) {
     x = i;
     int j = x;
     if (j != i)
       {
          printf("failed: %d isn't equal to %d, apparently\n", i, j);
          break;
       }
     i++;
  }
  return 0;
}

$ gcc signal-stress.c  -Wall -O0 -g

$ ./a
Alarm clock

$ ※エラーしないと終了しないプログラムなのに、コードに無い文字列を表示して終了してしまう。

なんで?🤔 gdbから実行すると期待通りに動いているようです。 少なくとも「Alarm clock」なんて文字列が出力される理由が分からない。謎。
その後、一通りMLの記事を翻訳で読んでみたつもりですが、どこをどのように修正したかが分かりませんでした🥺。

2025/08/22

テレワーク。早めに終了。

Emacsハングの件。 Cygwinパッケージ の オリジナルemacs-w32(組み込みImageMagick無し、組み込みRSVG描画無し) だと3.6.5相当の野良ビルドしたCygwinでもハングせず。 IME/他パッチをあてて、ImageMagick無し、組み込みRSVG無し にしてみたのですがハングします。 むむ。--with-native-image-api を付けていたり IMEパッチも有効なので、もっとオリジナルの emacs-w32に寄せてみるとどうなるのだろう?と思って試してみる事に。

2025/08/21

テレワーク。早めに終了。

先日のEmacsで起動されるスレッドの観察。ハングは再現していたのですが 何か掴む事はできず。 ただ、killコマンドが 「bash: kill: (1775) - Permission denied」てな感じでエラーしていて、 何やらシグナルを送れない状況になっているのか?と思ったりも。 正確に権限の問題なのか、理由はともかくシグナルを送れない状況を権限の問題と丸めてしまっているのかは判らず。

ハング前に表示されていた最後のスレッド一覧は以下のようになっていました。

Thread 1 "emacs-30.2.1" hit Catchpoint 1 (signal SIGSTOP), 0x00007fffbf618019 in WindowsCodecs!WICSetEncoderFormat_Proxy () from /cygdrive/c/WINDOWS/SYSTEM32/WindowsCodecs.dll
  Id   Target Id                            Frame
* 1    Thread 8512.0x10ac "emacs-30.2.1"    0x00007fffbf618019 in WindowsCodecs!WICSetEncoderFormat_Proxy () from /cygdrive/c/WINDOWS/SYSTEM32/WindowsCodecs.dll
  2    Thread 8512.0x6c64                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  3    Thread 8512.0x31a4                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  4    Thread 8512.0x3960                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  5    Thread 8512.0x6298 "sig"             0x00007fffc5547f7a in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll
  6    Thread 8512.0x56dc                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  7    Thread 8512.0x2a6c                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  8    Thread 8512.0x6f68 "timerfd"         0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  9    Thread 8512.0x1e08 "gmain"           0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  10   Thread 8512.0x6e54 "pipesel"         0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  11   Thread 8512.0x3284 "itimer"          0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  12   Thread 8512.0x651c                   0x00007fffc52d1324 in win32u!NtUserGetMessage () from /cygdrive/c/WINDOWS/System32/win32u.dll
  13   Thread 8512.0x26f8                   0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  16   Thread 8512.0x4130                   0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  17   Thread 8512.0x5cd8                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  18   Thread 8512.0x1c8 "waitproc"         0x00007fffc7da2974 in ntdll!ZwReadFile () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  19   Thread 8512.0x54e8                   0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  20   Thread 8512.0x3458 "pipesel"         0x00007fffc7da2934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  21   Thread 8512.0x62bc "[pango] fontcon" 0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  22   Thread 8512.0xe78 "emacs-30.2.1"     0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  23   Thread 8512.0x6f9c "emacs-30.2.1"    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  30   Thread 8512.0x5258 "emacs-30.2.1"    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  31   Thread 8512.0x6ed0 "emacs-30.2.1"    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  32   Thread 8512.0x3308 "emacs-30.2.1"    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
[New Thread 8512.0x1da8]

スレッドIDが32に達しているなぁ?とは思ったりも。ただ、番号は抜けているので 総数は24のようですが。 IDは再利用されていないのだろうか?🤔 IDが32に達したところで、新しくスレッドを作っているようですが、 まさかオーバーフロー的に溢れてダメになっているとかじゃないよね?

今のところハングの再現しない Cygwin 3.6.2-1で、同じく Emacsを gdb上で動かして 定期的にSIGSTOPを送って スレッドを表示するとどうなるか?を試してみたところ、4時間ほどするとハングしてしまいました🥺。 以下はハング直前の最後のスレッド表示です。 ノートPCではなくデスクトップPCで試したのですが、何故かスレッドの数がちょっと多いです。

Thread 1 "emacs-30.2.1" hit Catchpoint 1 (signal SIGSTOP), 0x00007ffb8ff8acc4 in win32u!NtUserMsgWaitForMultipleObjectsEx ()
   from /cygdrive/c/windows/System32/win32u.dll
  Id   Target Id                             Frame
* 1    Thread 37036.0x622c "emacs-30.2.1"    0x00007ffb8ff8acc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/windows/System32/win32u.dll
  2    Thread 37036.0x4ad8                   0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  3    Thread 37036.0x2200                   0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  4    Thread 37036.0x8dbc                   0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  5    Thread 37036.0x8600 "sig"             0x00007ffb8faf7f7a in RaiseException () from /cygdrive/c/windows/System32/KERNELBASE.dll
  6    Thread 37036.0x73dc                   0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  7    Thread 37036.0xdd0                    0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  8    Thread 37036.0x1f80 "timerfd"         0x00007ffb8ff8acc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/windows/System32/win32u.dll
  9    Thread 37036.0x70ec "gmain"           0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  10   Thread 37036.0x6c68 "itimer"          0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  11   Thread 37036.0x15c8 "pipesel"         0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  12   Thread 37036.0x8ee4                   0x00007ffb8ff81324 in win32u!NtUserGetMessage () from /cygdrive/c/windows/System32/win32u.dll
  14   Thread 37036.0x9538 "waitproc"        0x00007ffb92382974 in ntdll!ZwReadFile () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  15   Thread 37036.0x7c50                   0x00007ffb8ff8acc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/windows/System32/win32u.dll
  16   Thread 37036.0x5d30 "pipesel"         0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  17   Thread 37036.0x85fc "[pango] fontcon" 0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  18   Thread 37036.0x5d0c "ptym"            0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  19   Thread 37036.0x782c "ptymf"           0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  20   Thread 37036.0x6a00 "ptym"            0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  21   Thread 37036.0x5a14 "ptym"            0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  22   Thread 37036.0x4288 "ptymf"           0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  23   Thread 37036.0x89c4 "ptymf"           0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  24   Thread 37036.0x5a0c "itimer"          0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  25   Thread 37036.0x7388 "waitproc"        0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  26   Thread 37036.0x7b28 "pipesel"         0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  27   Thread 37036.0x7c18 "ptymf"           0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  28   Thread 37036.0x8a64 "ptymf"           0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  29   Thread 37036.0x904 "waitproc"         0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  30   Thread 37036.0x3b1c "itimer"          0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  31   Thread 37036.0x8634 "waitproc"        0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  32   Thread 37036.0x5b40 "waitproc"        0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  33   Thread 37036.0x95a8 "waitproc"        0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  34   Thread 37036.0x7d9c "waitproc"        0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  35   Thread 37036.0x2288 "pipesel"         0x00007ffb92382934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  36   Thread 37036.0x5b30 "emacs-30.2.1"    0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  37   Thread 37036.0x8f20 "emacs-30.2.1"    0x00007ffb92383404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
  38   Thread 37036.0x6b58                   0x00007ffb92386564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/windows/SYSTEM32/ntdll.dll
[Thread 37036.0x2200 exited with code 0]
[Thread 37036.0x8dbc exited with code 0]
[Thread 37036.0x4ad8 exited with code 0]
[New Thread 37036.0x7cdc]

シグナルを送る為のkillコマンドも「bash: kill: (638) - Permission denied」てな感じになっていました。 という訳で、Cygwin 3.6.2-1でもハングしない訳では無いという感じのようです。

それじゃぁと思い、Cygwinオリジナルの emacs-w32(組み込みImageMagick無し、組み込みRSVG描画無し) だとどうなんだ?と思ったり。ひとまず仕掛けてみたのですが、なんかスレッド数が半分しか無いぞ? もしかしてスレッド数とハングには因果関係がある?🤔

マクドナルドのハッピーセットで転売目的の大量購入や食品廃棄などの問題の話。 え?マクドナルド側の方が何か言われるの?

2025/08/20

テレワーク。早めに終了。

先日、gdbで handleコマンドにより シグナル受信時の振る舞いを変えられるのを知りましたが、 シグナルを受信した時に 任意のgdbコマンドを実行できないのか?と思ったり。 Web検索で見つけられなかったので Copilotで聞いてみたら、catch signal と commands の組み合わせで 実現できるという答えが返ってきました。

(gdb) catch signal SIGSTOP
Catchpoint 1 (signal SIGSTOP)
(gdb) commands 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>info threads
>continue
>end
(gdb) run

これで実行した状態で、プロセスに「kill -s SIGSTOP プロセスID」でシグナルを送ると、 スレッドの情報を表示したのち continueで実行を継続する感じになるようです。なる。
なぜこのような事がしたかったかと言うと、C-zでちょこちょこ止めて「info threads」で 見てみるとスレッドの数が増えているようだったので、増え続けたりするのだろうか? と思った次第。別bashから「while true; do kill -s SIGSTOP プロセスID; sleep 1; done」で シグナルを送り続けて Emacsハング再現した時の最後の瞬間が見られないだろうか?という訳で 試してみたり。....直ぐには再現しないようなのでそのまま放置。

2025/08/19

テレワーク。気持ち早めに終了。

Cygwin 3.6.3-1以降で Emacsがハングする件。
如何せんハング状態に陥っていると、 strace -p でアタッチしてもそのまま何もできない状況になるし、 gdb -p でアタッチしても同様に C-z で SIGSTOPを送ることもできません。 でも、なにやら大量にスレッドが生成されているようなので、どこで生成されているのだろうか?と思ったり。 src/systhread.c:sys_thread_create() が呼ばれているのだろうかと思い、ブレークポイントを設定しても 止まる気配が無し。どこでスレッドが生成されているのかよくわからず🤔。
gdb上で動かして、適当なところで C-z で止めてから info threadコマンドを実行してみたところ、 以下のようなスレッドが生成されているようでした。

(gdb) info threads
  Id   Target Id                             Frame
* 1    Thread 28184.0x5f0c "emacs"           0x00007fffc52d1344 in win32u!NtUserMessageCall () from /cygdrive/c/WINDOWS/System32/win32u.dll
  2    Thread 28184.0x4828                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  3    Thread 28184.0x69b0                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  4    Thread 28184.0x6390                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  5    Thread 28184.0x5fc0 "sig"             0x00007fffc5547f7a in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll
  6    Thread 28184.0x3050                   0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  7    Thread 28184.0xf60                    0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  8    Thread 28184.0x6f38 "timerfd"         0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  9    Thread 28184.0x2184 "gmain"           0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  10   Thread 28184.0x2d68 "pipesel"         0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  11   Thread 28184.0x6b34 "itimer"          0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  12   Thread 28184.0x5684                   0x00007fffc52d1324 in win32u!NtUserGetMessage () from /cygdrive/c/WINDOWS/System32/win32u.dll
  13   Thread 28184.0xef8                    0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  16   Thread 28184.0x6db0                   0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  17   Thread 28184.0x704                    0x00007fffc7da6564 in ntdll!ZwWaitForWorkViaWorkerFactory () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  18   Thread 28184.0x4268 "waitproc"        0x00007fffc7da2974 in ntdll!ZwReadFile () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  19   Thread 28184.0x3450                   0x00007fffc52dacc4 in win32u!NtUserMsgWaitForMultipleObjectsEx () from /cygdrive/c/WINDOWS/System32/win32u.dll
  20   Thread 28184.0x5b1c "pipesel"         0x00007fffc7da2934 in ntdll!ZwWaitForSingleObject () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
  21   Thread 28184.0x64c8 "[pango] fontcon" 0x00007fffc7da3404 in ntdll!ZwWaitForMultipleObjects () from /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll
(gdb)

「Id 1」は emacsのメインスレッドと思われますが、それ以外は何のスレッドなのかよくわかりません。 ただ、「[pango] fontcon」は数日前に何かあるのか?と思った所でした。 「sig」もスレッドのようなのですが、どちらも emacs本体のスレッドでは無いようにも思えたり。 特に何かを得られた感じはせず🥺。

2025/08/18

テレワーク。早めに終了。

Cygwin 3.6.3-1以降で Emacsがハングする件。
先日の続きで 謎のSIGTRAP対応をしたリリースされていない野良ビルド Cygwin 3.6.5相当でハング再現の様子見していたのですが、 やっぱり3.6.3以前よりも再現性が高いです。 あと、一度だけで契機は判りませんが「Fontconfig warning: using without calling FcInit()」というメッセージが 起動したターミナルに表示された事がありました。 少し前にpangoや fontconfigが何か関係している可能性を考えたのですが、 何かあるのか?と思ったり。原因では無く影響を受けた結果かも知れないのでなんとも言えませんが....🤔

特に何も掴めず🥺。

2025/08/17

AM中に起床。

Cygwin 3.6.3-1以降で Emacsがハングする件。
昨日のCygwin 3.6.2-1に相当する 野良ビルドしたcygwin1.dllでハング再現しない事を確認していたのですが、 ハング再現してました🥺。むむ。 ただし、2つのEmacsのうち一つだけハング再現で、もう一つは朝まで耐えていた感じではありますか。

ちょっと話は逸れて gdbで実行すると謎のSIGTRAPが発生する件。3.6.3-1では試していなかったというのに 気づいたのでパッケージでCygwin 3.6.3-1を再インストールして確認。総合結果で言うと以下のような感じ。

  | Version   | 謎のSIGTRAP | 備考       | 備考(Emacsハング)            |
  |-----------+-------------+------------+------------------------------|
  | 3.6.1-1   | ?          | パッケージ | ハングしない                 |
  | 3.6.2-1   | 発生しない  | パッケージ | (パッケージ版は)ハングしない |
  | 3.6.3-1   | 発生しない  | パッケージ | ハングする                   |
  | 3.6.4-1   | 発生する    | パッケージ | ハングする                   |
  | 3.6.5相当 | 発生する    | 野良ビルド | ハングする                   |

3.6.4-1は、よりによってこのタイミングで感🥺。逆に 謎のSIGTRAP と Emacsハング との因果関係は無いかも。

話は Cygwin 3.6.3-1以降で Emacsがハングする件に戻る。
デッドロック的なものが発生しているとして、どうやって止めれば良いのだろう?🤔。
Cygwin 3.6.2-1相当で オプティマイズレベルを -O0にして 野良ビルド。ハング再現待ち。

ハング再現待ちの間に掃除でもするかと思って掃除機の電源を入れたところ、 モーターの回転が急に遅くなり部屋の照明が点滅したり。これはショートか?と思い即停止。なんてこった😭。 午前中だったので即座にヨドバシヘ調達に。普段行かない家電フロアでいくつか試して、 型落ちだけど持ち帰り可能なコードレスのスティックタイプに決定。約25000円でしたが全額ポイントで支払い。
因みに、壊れた掃除機は2001年1月に引っ越した時に買ったものだったので 約24.5年 使用したことになります。掃除機って壊れないのかと思っていたのですが突然壊れるのか....

掃除したり。説明書にはフル充電に4時間かかると書かれていたのですが小一時間ほどで充電完了。 バッテリー保管時は満充電にしておけとも記されていたので、出荷時に充電されていたのかも。 さておき、軽くて快適😄。そしてめっちゃ吸う😆。よき。

掃除機調達やら掃除の間、5時間ほどハング再現待ちはほったらかしにしていたのですが、 この時間では再現せず。3.6.2は実はギリギリ大丈夫で、コンパイル条件とかによって再現性が変わるのか?🤔 いずれにしても、これまで たまたま大丈夫だっただけという疑惑も湧いてきた気がしたりも。困った。
その後もハング再現せず トータル7時間ほど耐えたので 一旦別条件に。

Cygwin 3.6.3相当を野良ビルドしてみたり。ただし、オプティマイズレベルを -O0にしてみます。 Cygwin 3.6.3-1のパッケージから ハングが再現するのですが、一旦オプティマイズレベルを下げるとどうなるか? を見てみる事に。ただ、3.6.2と 3.6.3は差分内容的にはほぼ変更無しにも見えるので (数日前のメモ)、 オプティマイズレベルを下げると再現性に影響あるのかを見る感じで。 ....1.5時間くらいでハング再現。マジか🥺。 ダメになったのは強制終了して、追加でEmacsを起動して様子見継続した感じ6時間は耐えられてそう。 イケるときはイケるし、ダメなときはダメという感じだな......

gdb上でemacsを実行すると謎のSIGTRAPが発生する件。 git log を眺めていると、スレッドに関連する不具合に対処する為に、 意図的にトラップを起こすような変更を加えているようでした。 複数のコミットで色々な部分を直しているので全部を外す事は難しそうだったのですが、 x86の EFlagsレジスタのTF(トラップフラグ)を設定するようなコードがあり、 これが何かしら悪さをするケースがあるのではないか?と推測してみたり。 フラグの設定コードをコメントアウトして、リリースされていない Cygwin 3.6.5相当で野良ビルドしたところ、 gdb上で emacsを実行しても 謎のSIGTRAP は発生しなくなりました。 Emacsは結構な数のスレッドが起動されるようなので、強めの負荷テストになっているのかも知れません。 で、Emacsのハングに影響するのか?を見てみたところ早めにハング再現😓。 という訳で、gdb実行での 謎のSIGTRAP は別件確定という感じかも。

2025/08/16

AM中に起床。

直ぐには出ないだろうと思っていたら、Cygwinパッケージに emacs 30.2-1 がもう来ていたり。マジか😓。
ひとまず「Emacsの雑記」を Emacs-30.2ベースに更新してみました。 御参考まで。まだ Cygwinのバージョンとの組み合わせでハングする件は解決できていないので、 先日のワークアラウンド方法を但し書きとして記してます。

話は Cygwin 3.6.3-1以降で Emacsがハングする件に戻る🥺。
調査しているノートPCは Cygwin 3.6.3-1の一つ前が Cygwin 3.6.1-1だったのですが、3.6.1-1まで戻しても ハングは再現しませんでした(なので「Emacsの雑記」には 3.6.1-1まで戻すのもワークアラウンドとしています)。 で、3.6.1-1でも gdb上で実行すれば SIGTRAPは発生しません。3.6.3-1以降だと 謎のSIGTRAPが発生するのと ハングは関係があるのじゃないか?と思い始めたりも。
SIGTRAPを受け取ると一応 gdbの操作は可能で バックトレースも表示できるのですが、シグナルの発生源は 判らんなぁ?と思ったりも。何かしらデバッガ上で発生源を調べられるかと思いきや方法が見当たらず。むぅ🤔

ハング調査のノートPCのEmacsを30.2-1にアップデートしてみたり。Cygwin本体のバージョンを上げたり下げたり していると、関係無いパケージも更新するかしないかを指示しなくてはならないのが面倒臭いから。それだけ😓。 でもやっぱりハングは再現します。やっぱり原因は Cygwin側にあると考えるのが打倒だろうか....

Cygwinを野良ビルドしてみる事に。ひとまず先日調べた cygwin-3_6-branch の HEAD(まだリリースされていない3.6.5に相当)で試してみたり。 一度もCygwinをビルドしたことの無いノートPCだったので、ツールのインストールが足りなかったのを追加したり、 以前ハマった「shilka」ってコマンドが無くてビルドに失敗するのを 回避手順で対応したり。ひとまず new-cygwin1.dll のビルドは成功。 3.6.4-1と入れ替えて(rebaseは無し)様子を見てみることに。
gdbで実行すると 謎のSIGTRAPが発生する件は ビルドしたcygwin1.dllにしても再現するようです🤔。
Emacsを起動して様子見中に Cygwin の git logを眺めていたところ、何やらデッドロック案件が修正されているみたい。 もしこれが関係しているのだとすると、様子見中のEmacsはハングしない事が期待できるかも?...... と期待したのですが、やっぱりハングが再現しました🥺。

Cygwin 3.6.2-1に相当するコミットをcheckoutしてビルド。野良ビルドしてもこのバージョンならハング再現しないのか? を確認してみる事に。何故かビルドに失敗したのですが、Cygwin 3.6.2-1の 後にw32apiが13.0.0-1になった為 ヘッダの二重定義が発生している模様。手でちょっと直して対応。
gdbで実行すると パッケージのCygwin 3.6.2-1と同じく 謎のSIGTRAPが発生する事は無いようです。 少なくとも謎のSIGTRAPについては面倒ですがどのコミットで発生するようになるかを特定する事は可能かも。 Emacsの方は見ている範囲ではハング再現はせず。再現しないのが期待ですが、一応一晩放置で様子見する事に。

2025/08/15

AM中に起床。

Emacs 30.2のリリースアナウンス (Emacs 30.2 released)。 メンテナンスリリースという位置づけのようです。結局昨日は深夜までアクセス可能になりませんでした🥺。

Cygwinパッケージの libglibのバージョンを libglib2.0_0-2.85.x-1(今年の5月末~のリリース) よりも前の libglib2.0_0-2.84.1-1(今年の4月頃リリース) まで戻したいと思ったのですがインストーラーで選択できず。 ローカルにはダウンロードしたアーカイブファイルがあるので再インストール可能なハズですが。 しかたないので選択可能な範囲で一番古い libglib2.0_0-2.85.1-1 まで戻して様子見。

うーむ、やっぱりハングが再現します。libglibじゃない可能性もあるのですが、やっぱりもっと古いのに戻したい。 という訳でlibglib2.0_0-2.84.1-1のアーカイブ(runtimeとdevel)を展開して手動インストールした後、 適当にCygwin本体を再インストールしてrebaseを実行。 一応ファイルの日付は4月になっている事と、野良ビルドしたemacs-w32は再ビルドしなくても起動できたので様子見。

glibを4月のまで戻してもやっぱりハングが再現しました🥺。 先日も記したのですが、glibは最新のままでCygwin本体を 3.6.2-1まで戻せば動くので、 glibが原因では無いかも知れません。困った。
現時点のワークアラウンドは以下のいずれかになるかと思います。


ただし、前者は 時期を逃すと Cygwinのインストーラで選択できるバージョンのスコープを外れる可能性があり、 一度新しいのを入れてしまうと戻れなくなる可能性はあります。 また、後者は ImageMagickの処理を全て外部コマンドで行うように設定変更を伴ったり、 そもそも SVG描画が使えなくなります(SVGを直接描画使用するアプリは使用できなくなります)。 どちらにしてもダメージが大きすぎる🥺

gdbからプログラムを実行すると謎の SIGTRAPを受信して停止しまくる件。 handleコマンドで「handle SIGTRAP nostop」のようにして停止しないようにして実行してみたり。 停止はしないけどSIGTRAPを受信した事は表示されるのでひとまずこれでハング再現するか?を 様子見してみたり。
SIGTRAPで停止しないようにしたEmacsでハングが再現したのですが、C-zを押してもSIGSTPが 受信されていないのか止められず。当然のように C-cもダメ。むーん🤔。 タスクマネージャでプロセスを終了すると、SIGHUPを受けて終了するようです。 コンパイルのオプティマイズレベルでも下げてみるか....
もしかするとハングがSegfaultとかに変わる事を期待したのですが、オプティマイズレベルを下げても様子は変わらず。
clangでコンパイルしてみるかと思い試してみたり。warningメッセージは出るもののビルドに成功。 実行してみるもやっぱりハングは再現します。
straceを使ってハング直前に何をやってたか判るか?と思って試してみるも、 イマイチ何やってたんだか判らず。 何度か straceを使用した状態でハングが再現したのですが、

   :
   80 381962734 [sig] emacs-30.1.1 1052 sigpacket::process: signal 14, signal handler 0x1005F9BB0
   41 381962775 [sig] emacs-30.1.1 1052 sigpacket::setup_handler: suspending thread, tls 0x7FFFFCE00, _main_tls 0x7FFFFCE00
  107 381962882 [[pango] fontcon] emacs-30.1.1 1052 set_signal_mask: setmask C082006, newmask 0, mask_bits C082006
   64 381962946 [sig] emacs-30.1.1 1052 _cygtls::inside_kernel: pc 0x7FFFC52D1364, h 0x7FFFC52D0000, inside_kernel 1
   61 381963007 [[pango] fontcon] emacs-30.1.1 1052 sig_send: sendsig 0x13C, pid 1052, signal -71, its_me 1
   48 381963055 [sig] emacs-30.1.1 1052 sigpacket::setup_handler: couldn't interrupt.  trying again.
  101 381963156 [[pango] fontcon] emacs-30.1.1 1052 sig_send: wakeup 0x125C
   42 381963198 [sig] emacs-30.1.1 1052 sigpacket::setup_handler: suspending thread, tls 0x7FFFFCE00, _main_tls 0x7FFFFCE00

「[[pango] fontcon] ....」というのが毎度 ハングでメッセージが出なくなる前に現れていて、 どちらもImageMagickの /usr/bin/cygMagickCore-7.Q16HDRI-9.dll や RSVGの /usr/bin/cygrsvg-2-2.dll から辿れると言えば辿れるような気も。 ただ、Emacs本体からpangoの関数を呼んでいる訳ではない(というかpangoの何を指しているかもよくわからない)ので、 スタックトレース的な物がないと調べられないなぁという感じ。うーむ🤔

2025/08/14

AM中に起床。

Cygwin 3.6.3-1以降で Emacsがハングする件。
まずCygwinパッケージのemacs-w32の .pdmp ですが、例えば 30.1 であれば 「/usr/libexec/emacs/30.1/x86_64-pc-cygwin/emacs-*.pdmp」に配置されていた模様。 なので、pdump対応を外している訳では無かったみたい。 なのですが、、、configureオプションに「--with-dumping=none」を追加してダンプを抑止した 実行バイナリだとハングが すぐには再現しなくなりました。むぅ🤔

その後、色々試してみたり。見かけ上、


という感じになっています。
あと、様子見してみる限り 恐らくEmacsがハングするのとは別件のようですが、


というのもあります。

以前、Cygwin 3.6.2と 3.6.3の変更点でそんな事になるのか? と思ったのですが、当時はリリースノートを見ただけの感想でした。 実際にどんな変更が入っていたのだろうか?と思い、gitリポジトリをcloneして 3.6.2と 3.6.3のタグを 比較(==3.6.3の変更差分の抽出)してみた結果が以下です。

$ git branch
* cygwin-3_6-branch
  main

$ git diff cygwin-3.6.2 cygwin-3.6.3
diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h
index 622aaa95a..961a98c78 100644
--- a/winsup/cygwin/include/cygwin/version.h
+++ b/winsup/cygwin/include/cygwin/version.h
@@ -11,7 +11,7 @@ details. */
    changes to the DLL and is mainly informative in nature. */

 #define CYGWIN_VERSION_DLL_MAJOR 3006
-#define CYGWIN_VERSION_DLL_MINOR 2
+#define CYGWIN_VERSION_DLL_MINOR 3

 /* CYGWIN_VERSION_DLL_COMBINED gives us a single number representing the
    combined DLL major and minor numbers. */
diff --git a/winsup/cygwin/release/3.6.3 b/winsup/cygwin/release/3.6.3
new file mode 100644
index 000000000..60031e5b0
--- /dev/null
+++ b/winsup/cygwin/release/3.6.3
@@ -0,0 +1,5 @@
+Fixes:
+------
+
+- Fix "There are no available terminals" error with AzureAD accounts.
+  Addresses: https://cygwin.com/pipermail/cygwin/2025-May/258214.html
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 83883f9f6..ffe71ee07 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -1996,10 +1996,6 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
       if (sid_id_auth (sid) == 5 /* SECURITY_NT_AUTHORITY */
          && sid_sub_auth (sid, 0) == SECURITY_APPPOOL_ID_BASE_RID)
        break;
-      /* AzureAD SIDs */
-      if (sid_id_auth (sid) == 12 /* AzureAD ID */
-         && sid_sub_auth (sid, 0) == 1 /* Azure ID base RID */)
-       break;
       /* Samba user/group SIDs */
       if (sid_id_auth (sid) == 22)
        break;


うーむ、やっぱりこれで変になるとは思えない....🤔

だんだん rebase関連の事案じゃないかと思い始めたり。オリジナルのemacs-w32は imagemagick無し(デフォルト)、rsvg無し(Cygwin向けは未対応)ですが、 IME他パッチ版の野良ビルドではこれらを含んでいます。これを順に外してみる事に。


imagemagickもrsvgも両方外せばハング再現せず。ある意味オリジナルのemacs-w32(ハングせず)に近いのかも。 で、imagemagickとrsvgに共通する点で心当たりがあると言えば glibが思い浮かんだり。 丁度 Cygwin 3.6.3-1のアップデートと同じくらいの時期に glib2.0_0-2.85.x-1 ってのがパッケージリリースされています。 Cygwin本体だけを 3.6.2-1に戻せば大丈夫というのと辻褄が合わないですが、 時期的な所に連動しているので何か手がかりはないか?と思ったり。 それにしても、毎年 Cygwin本体が更新されると なにやら Emacsが不調になって、その原因を調べているような気がします🥺。

とかやっているうちに、Emacs30系のブランチに emacs-30.2 のタグが打たれたっぽい。 git pullして気づいたので リリースアナウンスを確認したいのですが、 MLアーカイブページがタイムアウトで反応しなくて確認できず。 そういやここ1ヵ月くらいMLアーカイブページのタイムアウトにかなり高い確率で遭遇するなぁ?とは思ったり。 メインのftpサイトにはアーカイブが置かれている模様。ftpサイトも激烈に遅くてダウンロードに小一時間を要したり。
で、IME/他パッチを当ててビルド。configureのパッチがリジェクトされたのは 30.1.90の時と同じでした。 Cygwin 3.6.2-1での確認ですが、ちょろっと動かした感じではいきなりずっこけたりはしなさげ。 Cygwinパッケージのリリースまでテストする感じで。 少し前に、30.2に向けてそろそろ動きがあるだろうと予想していたのですが、 ハングの件が拗れてしまっているので油断していました。

2025/08/13

AM中に起床。

そういえば Unicode 16.0 で追加される絵文字に 東日本で言うところの「スコップ」、西日本で言うところの「シャベル」が追加されますが、 絵文字の説明的にはどっちになるんだ?と思い、Emacs 31.0.50 の admin/unidata/emoji-sequences.txt を調べてみたところ、0x1FA8Fに対応する絵文字は「shovel」と記されていました。 シャベルのWikipedia によると、「日本のJISでは足をかける部分があるものをシャベル、無い物をスコップとしている」 ようなので、東日本の方が逆なのかも。スコップはオランダ語らしいので 英語圏の人には分からない。 また、「園芸用こて」は英語で trowel らしいので、やっぱりスコップは通じないのかも。

シャベルの事を調べていて、JIS(Japanese Industrial Standards)の日本語呼びが 「日本工業規格」から「日本産業規格」になっていたらしい (日本産業規格のWikipedia)のを知ったり。 industrialは工業/産業どちらの意味もあるのでJISはそのままの模様。 JISマークも変わったりしているようですが、Unicodeに旧JISマーク「〄」が刻まれているのはそのままみたい。 JISマークのUnicode文字が割り当てられている経緯に MacJapanese(Wikipedia)なるAppleの独自ShiftJIS拡張が 関係しているらしい。そういえば以前、 「㌀」や「㍇」なんて誰得なんだ?と思った事がありましたが MacJapaneseが起源となっているようです。 今回、旧JISマークのようなロゴマークをUnicode文字に入れてるのは迂闊だよなぁ?と思ったのですが、 「㌀」や「㍇」の時にも思った「なんで?」の犯人はMacJapaneseだったのか。

Windows Update。ノートPCのアップデートだけ何故か異常に遅いのは変わらず。

Cygwin 3.6.3-1以降で Emacsがハングする件。 普段使いのデスクトップPCで調べるのは色々と作業の邪魔になるのでノートPCで確認してみる事に。 Cygwin 3.6.3-1まで入れてあったのですが、3.6.4-1にアップデートして Emacsをいくつか起動して再現するかを 試してみたり。やっぱり契機は判りませんが再現はする模様。で、とりあえず gdbを挟んでみるかと試してみたところ、 run実行したら何故か起動途中くらいで SIGTRAPが発生して止まったり。なんだこれ?🤔 continueで続けると、ちょっとするとまた SIGTRAPが発生するという感じで全然普通に動く様子がなかったり。 止まる場所は決まっていなさげ。むむ。 これを受けて、ハングの発生しない Cygwin 3.6.2-1 のデスクトップPCで 同じく gdb上で動かしてみたところ、 SIGTRAPが発生するような事はありませんでした。もしかしてハングと関係ある?🤔

様子を見始めたら少し模様が付いている感じに見えたり。


という事から、オリジナルのバイナリのconfigureオプションを「M-x describe-variable」で 変数 system-configuration-options から調べて適用したり、pdumpをやめたりするとどうなるか?を 調べてみる方向で。

pdumpをやめるにはconfigureオプションが必要っぽいのですが、オリジナルのバイナリのconfigureオプション にはダンプに関するオプションが指定されていません。 オリジナルのバイナリはどうやってビルドしたんだ?🤔

2025/08/12

AM中に起床。

Emacsのキー割り当てとして「\C-z」には「scroll-down」コマンドを割り当てています (Emacs24以降から(?)scroll-down-commandになっていたらしい。さっき知りました😅)。 元々 X68kの μEmacs で previous-page という scroll-downに相当するページ単位のスクロールに 割当たっていたのが由来で設定しています。 Emacsでは「\C-v」が「scroll-up-command」が割当たっていて、 これは X68kの μEmacsでも 「\C-v」に同じ動作の「next-page」が割当たっていたのですが、 Emacsでの「scroll-down-command」が「\M-v」に割当たっているのは (Metaキーは ESCキーを使った2ストローク入力だったのもあり) "無いわー"と思ったのと、 サスペンドなんて頻繁に行わないだろ?という理由から、X68kの設定を逆輸入する形で 「\C-z」への「scroll-down」割り当てを30年以上前から行っています。 で、この「\C-z」への割り当てって何由来だろう?と思って調べたのですが出所は分からず。 X68kの μEmacs では ED.Xのキーバインドが少し混ざっているので、ED.X由来か?とも思ったのですが そういう訳でも無いっぽい。
さておき、一般的に scroll-down-commandに相当する操作は「\M-v」のまま使っているのだろうか?🤔 先に記した通り ESC押しの2ストローク操作は論外にしても、CtrlとALTを押し分けるのも結構難しいように思います。

今になってX68kのμEmacsのキーバインドを調べたのですが、罫線描画のモード(バインド)があったのか...とか、 grepモードがあったのか...とか、「M-x describe-bindings」って使えたのか...など、 全然使いこなせていなかったかも知れんなぁ と思ったりも😓。

そういえば何か違和感があったのですが、Edgeで使用しているデフォルトフォントが「Noto Sans/Serif JP」になっているなぁ? と思ったり。Webで調べると4月には変わっていたようですが、Windows10には適用されていなさげだった事と、 新PC(Windows11)への乗り換えを行った 5月時点では既に変化点が無い状態だったので気づいていませんでした😅。 きっかけは 「\(ASCII 0x5c)」が「¥(円マーク)」じゃなくて「\(バックスラッシュ)」で 表示されていたので気づきました。Microsoftが表示互換を損なうようなデフォルト変更を入れてくるとは思いませんでした。 固定幅フォントは去年変更された BIZ UDGothic のままなのでpreタグ内は

\(ASCII 0x5c)

「¥」で表示されるようです。もしフォントもロケールに依存しない (例えば日本語フォントの「¥(円マーク)」やEUC-KRの「₩(ウォン)」で表示される事が無い)方向に進んでいるのだとすると、 以前 「Windows標準の日本語文字フォントでは表示互換を維持する為にバックスラッシュ表示になる事は絶対に無い」 と思っていたのが そうではなくなる可能性はあるのかも?

以前、 「游ゴシック Regular」には「猶」の文字が旧字体で表示される不具合がある と言うのを知り 確かにと思ったのですが、現在の Windows11では修正されているようです。

Windows10 游ゴシック 猶 Windows11 游ゴシック 猶

修正されたという情報を全然見つけられないのですが、少なくともTANEが知った2024年5月時点には 修正済っぽかったらしい。そしてWikipedia にも修正された事が記されていないままとなっているようです。 Windows11で修正されていてもWindows10はそのままなので、「Windows10では修正されていない」と言われれば そんな気もしますが。

2025/08/11

AM中に起床。

先日、いくつか知らないフォントがあって挙げてみたのですが、fontタグで指定してもうまく反映できない フォントがありました。例えば「Bodoni MT Poster Compressed」というフォントで、 フォントファイルは「BOD_PSTC.TTF」が対応していると思われるのですが、 Windowsのフォント設定で探すと 完全名「Bodoni MT」のフォントファミリに属していて face違いという扱いのようです。しかし、メタデータのフォントフェイスを選択することができて、 「Poster Compressed」を選択すると完全名は「Bodoni MT Poster Compressed」となります。なんだこりゃ?🤔 Emacs上ではファミリ名「Bodoni MT Poster Compressed」を指定すれば表示できる、つまり 「Bodoni MT」とは別ファミリという扱いになっています。 仮に同ファミリの別faceの扱いだとして、WeightでもSlant(italic,oblique)でも無い パラメータで指定するのか?🤔

そういえば、UNIXのラインエディタに「ed」がありますが、 X68kに標準で付属していたフルスクリーンのテキストエディタも「ED(ED.X)」だったなと思ったり。 これまでX68kの話の文脈から UNIXのedを連想した事は無いなと思ったりも。 X68kのEDのキーバインドってどんなだったっけ?と思って検索してみたら、 AI回答に X68kでラインエディタの edを操作するような例が出てきて、 「X68000のテキストエディタ「ed」のキーバインドについてですね。edはUNIX系OSで使われる基本的なテキストエディタで、X68000にも搭載されていました。具体的なキーバインドは、標準的なUNIX版edとほぼ同じです。」 と記されていたので、うーん?🤔 ってなりました。X68kの話の文脈でも UNIXのedを連想するのは AIはどういう学習をしたんだ?とは思ったりも。

2025/08/10

AM中に起床。

掃除したり。

何気にフォントの一覧を眺めていて、こんなフォントありましたっけ?と思ったり。 Windows10とWindows11とで「c:\Windows\Fonts」を比べてみて、気になったものをザックリ挙げてみました。 以下の表はfontタグのface指定を使っていますが、 Windows11じゃないとフォントが存在しなくてうまく表示できないかも知れません。

ファミリ名(完全名)表示例
Berlin Sans FBBerlin Sans FB: This is a pen. 012345
Bernard MT CondensedBernard MT Condensed: This is a pen. 012345
BroadwayBroadway: This is a pen. 012345
Brush Script MTBrush Script MT: This is a pen. 012345
ChillerChiller: This is a pen. 012345
Colonna MTColonna MT: This is a pen. 012345
Cooper BlackCooper Black: This is a pen. 012345
Curlz MTCurlz MT: This is a pen. 012345
Felix TitlingFelix Titling: This is a pen. 012345
ForteForte: This is a pen. 012345
GigiGigi: This is a pen. 012345
Goudy StoutGoudy Stout: This is a pen. 012345
Harlow SolidHarlow Solid: This is a pen. 012345
JokermanJokerman: This is a pen. 012345
Juice ITCJuice ITC: This is a pen. 012345
MagnetoMagneto: This is a pen. 012345
Matura MT Script CapitalsMatura MT Script Capitals: This is a pen. 012345
OnyxOnyx: This is a pen. 012345
RavieRavie: This is a pen. 012345
RageRage Italic: This is a pen. 012345
RockwellRockewll: This is a pen. 012345
Script MTScript MT: This is a pen. 012345
Showcard GothicShowcard Gothic: This is a pen. 012345
StencilStencil: This is a pen. 012345
Viner Hand ITCViner Hand ITC: This is a pen. 012345
VivaldiVivaldi: This is a pen. 012345
Vladimir ScriptVladimir Script: This is a pen. 012345

普段使いできる感じのものは少ない気もしますが😅。

2025/08/09

AM中に起床。

「新美の巨人たち」。伊藤若冲と円山応挙が割とご近所さん(距離にして200mくらい)だったらしい。 交流の記録は無いみたいですが 若冲の方が17歳年上だったようなので、まぁそれなら直接の交流は 無いかも知れないなぁとは思ったりも。

2025/08/08

テレワーク。早めに終了。

先日、ビデオゲームは残すのが大変と記したのですが、そういやオンラインサービスのみのゲームは サービス終了とともに遊ぶこと自体ができなくなる物もあるよなぁ?と思ったり。 かろうじてブログや動画配信で記録として残る場合は あるかも知れませんが、ゲーム進行の無いような コミュニケーションゲームだと ほとんどは思い出にしか残らない(そしていつか忘れられる)と思います。 もしかすると、今から30年後は 1980~1990年代のゲームは遊べるのに 2010~2020年代のゲーム(特にスマホゲーム)は ほとんど遊べないという状況になっているかも知れません。

2025/08/07

テレワーク。早めに終了。

「グラディウス オリジン コレクション」てのが発売されているらしい (公式ページ)。 グラディウス、II、III、沙羅曼蛇、LIFE FORCE、2、他と、 新作として沙羅曼蛇IIIが収録されているらしい。グラディウスIVは? 90年代前半までのタイトルなのか? と思ったのですが、完全な再現が難しかったので未収録とした模様 (参考記事)。 そういや グラディウスVはナンバリングタイトルだけど PS2専用で移植もされていません。 あと、言われてみれば今年はシリーズ40周年なのか。 大分前、30年とか50年とかに渡って出たら それはそれでスゴい と書いた事がありましたが、 既にビデオゲームは 本や音楽や映画と変わらないなとは思ったりも。 ただ、メディア的に残すのが大変という問題はあるかも知れませんが。

2025/08/06

テレワーク。早めに終了。

調べごとをして終了。

2025/08/05

テレワーク。早くもなく遅くもなく終了。

Web巡回して終了。

2025/08/04

テレワーク。気持ち早めに終了。

そういえば、Copilotと言われると Microsoft Copilot と GitHub Copilot がありますが、 単にCopilotというとどちらを指すかは文脈によるかも。用途は全く違うので混ざることは無いかも知れませんが。

現在では、恐竜は鳥類の祖先という事になってますが、海に棲んでいた首長竜は爬虫類に分類されていて 恐竜では無いらしい。「ドラえもん のび太の恐竜」に出てくるピー助はフタバスズキリュウという 設定でしたが、現在の分類に従うと ピー助は恐竜では無いという事になります。 そこ変わるのか....とは思ったりも。

2025/08/03

AM中に起床。

掃除したり洗濯したり。

そういえば、ラッコって日本では 鳥羽水族館のメス2頭だけになっているらしい。 海外から輸入する事もできなくなっているようなので、このままだと日本で見られなくなるのは時間の問題のようです。
ところで、Windows11の Fluent Emoji では カワウソに相当する OTTER の絵文字のデザインは ラッコのように描かれています(🦦)。ラッコは英語で Sea otter なのだそうな。 カワウソと兼用でも良いのかも知れませんが、背泳ぎで手に何か持っていると ラッコにしか見えない不思議。 Google検索でAIの回答に「ラッコの絵文字は、一般的に「🦭」で表されます。」って記されていたのですが、 それはアザラシだろ?とは思ったりも。AIは絵文字を絵として認識していないのだろうか?🤔
MSのCopilotに「🦦は何の絵文字ですか?」って聞いたら「ラッコの絵文字です」って答えが返ってきました。 ラッコと認識しているのもあるかも知れませんが「この絵文字を元に絵を描けますか?」って聞いたら、

絵文字🦦を元にMS-Copilot画伯の描いたラッコ

って絵が描かれました。器用なもんです。結局 絵文字の絵を見てラッコと判断しているのか、文字コードに ラッコが紐づけられているのかは判断できません...

そうだ、それも聞いてみればいいじゃん?と思い 「Microsoft Copilotは絵文字のテキストを絵として認識しているのですか?それとも文字コードに対応した意味として認識しているのですか?」と聞いてみたら 「Copilotは🦦のような絵文字を、画像そのものではなく「Unicodeで定義された文字コード」として処理します。その上でコンテキストや学習データに基づき、ある種の“意味”や“概念”として理解しています。」 という回答でした。文字コードにラッコが紐づけられているということらしい。どうも OTTER の絵文字は ラッコっぽく描かれた絵の方が多いようなので、人類も ラッコとカワウソの区別が付いていないようには思ったりも。

2025/08/02

AM中に起床。

何気に調べごとをしていて、node.jsは CygwinでビルドできるというAI回答が出てきたので、 マジで?と思って試してみたらダメでした🥺。大分古いバージョンでビルドできていた事があったようですが 今はできそうに無いです。検索してみてもWindowsのバイナリを使用する....みたいな方向に向いているのですが、 Cygwinからだとファイルパスの問題が解決できない場合があるので、結局用事にならない事の方が多い気がします。

2025/08/01

テレワーク。早めに終了。

そういえば「ASSEMBLY SUMMER'25」が 始まっているもよう。メインのCOMPOは日本時間の深夜から早朝という感じだと思うので、 Pouetで結果を見る感じになるかも知れませんが。


TOP

古いの
2025.07 2025.06 2025.05 2025.04 2025.03 2025.02 2025.01
2024.12 2024.11 2024.10 2024.09 2024.08 2024.07 2024.06 2024.05 2024.04 2024.03 2024.02 2024.01
2023.12 2023.11 2023.10 2023.09 2023.08 2023.07 2023.06 2023.05 2023.04 2023.03 2023.02 2023.01
2022.12 2022.11 2022.10 2022.09 2022.08 2022.07 2022.06 2022.05 2022.04 2022.03 2022.02 2022.01
2021.12 2021.11 2021.10 2021.09 2021.08 2021.07 2021.06 2021.05 2021.04 2021.03 2021.02 2021.01
2020.12 2020.11 2020.10 2020.09 2020.08 2020.07 2020.06 2020.05 2020.04 2020.03 2020.02 2020.01
2019.12 2019.11 2019.10 2019.09 2019.08 2019.07 2019.06 2019.05 2019.04 2019.03 2019.02 2019.01
2018.12 2018.11 2018.10 2018.09 2018.08 2018.07 2018.06 2018.05 2018.04 2018.03 2018.02 2018.01
2017.12 2017.11 2017.10 2017.09 2017.08 2017.07 2017.06 2017.05 2017.04 2017.03 2017.02 2017.01
2016.12 2016.11 2016.10 2016.09 2016.08 2016.07 2016.06 2016.05 2016.04 2016.03 2016.02 2016.01
2015.12 2015.11 2015.10 2015.09 2015.08 2015.07 2015.06 2015.05 2015.04 2015.03 2015.02 2015.01
2014.12 2014.11 2014.10 2014.09 2014.08 2014.07 2014.06 2014.05 2014.04 2014.03 2014.02 2014.01
2013.12 2013.11 2013.10 2013.09 2013.08 2013.07 2013.06 2013.05 2013.04 2013.03 2013.02 2013.01
2012.12 2012.11 2012.10 2012.09 2012.08 2012.07 2012.06 2012.05 2012.04 2012.03 2012.02 2012.01
2011.12 2011.11 2011.10 2011.09 2011.08 2011.07 2011.06 2011.05 2011.04 2011.03 2011.02 2011.01
2010.12 2010.11 2010.10 2010.09 2010.08 2010.07 2010.06 2010.05 2010.04 2010.03 2010.02 2010.01
2009.12 2009.11 2009.10 2009.09 2009.08 2009.07 2009.06 2009.05 2009.04 2009.03 2009.02 2009.01
2008.12 2008.11 2008.10 2008.09 2008.08 2008.07 2008.06 2008.05 2008.04 2008.03 2008.02 2008.01
2007.12 2007.11 2007.10 2007.09 2007.08 2007.07 2007.06 2007.05 2007.04 2007.03 2007.02 2007.01
2006.12 2006.11 2006.10 2006.09 2006.08 2006.07 2006.06 2006.05 2006.04 2006.03 2006.02 2006.01
2005.12 2005.11 2005.10 2005.09 2005.08 2005.07 2005.06 2005.05 2005.04 2005.03 2005.02 2005.01
2004.12 2004.11 2004.10 2004.09 2004.08 2004.07 2004.06 2004.05 2004.04 2004.03 2004.02 2004.01
2003.12 2003.11 2003.10 2003.09 2003.08 2003.07 2003.06 2003.05 2003.04 2003.03 2003.02 2003.01
2002.12 2002.11 2002.10 2002.09 2002.08 2002.07 2002.06 2002.05 2002.04 2002.03 2002.02 2002.01
2001.12 2001.11 2001.10 2001.09 2001.08 2001.07 2001.06 2001.05 2001.04 2001.03 2001.02 2001.01
2000.12 2000.11 2000.10 2000.09 2000.08 2000.07 2000.06 2000.05 2000.04 2000.03