[ 新規に投稿する ]

V9.39β1No.11761
秀丸担当 さん 24/08/08 15:02 [ コメントを投稿する ]
  V9.39β1を公開しました。

以下のページの「先行開発バージョンはこちら」からダウンロードできます。
https://hide.maruo.co.jp/software/hidemaru.html

32bit版:
https://hide.maruo.co.jp/software/bin3/hm939b1_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hm939b1_x64_signed.exe
[ ]
RE:11761 BeginMacro Memory Error (7)No.11762
こみやんま さん 24/08/12 17:16 [ コメントを投稿する ]
  以前、v9.35のβの時に、
https://www.maruo.co.jp/turukame/3/x11708_.html#11712

BeginMacro Memory Error (6)のエラーが出ていたのですが、

これに比べるとかなり頻度は低いものの、5日に1度くらい

---------------------------
エラー
---------------------------
BeginMacro Memory Error (7) code=487
---------------------------
OK   
---------------------------

というエラーがでます。

Error (7) は共通ですが、code=487の所はエラーの度にもしかすると違うかも...

この Error (7)が出る時ってどんな類のアラートでしょうか。


[ ]
RE:11762 BeginMacro Memory Error (7)No.11763
こみやんま さん 24/08/12 17:32 [ コメントを投稿する ]
  ---------------------------
エラー
---------------------------
BeginMacro Memory Error (7) code=5
---------------------------
OK   
---------------------------

と、code=5の時の方が多いように思えます。
[ ]
RE:11763 BeginMacro Memory Error (7)No.11764
秀まるお さん 24/08/13 15:59 [ コメントを投稿する ]
  秀丸担当の代わりにとりあえずのコメントさせていただきます。秀丸担当からのコメントも後で付くと思うので、それまでのつなぎということでお願いします。

その「BeginMacro Memory Error (7)」については、変数を保存する用の共有メモリの確保の処理でWindowsからエラーが返ってるようです。具体的には、共有メモリはファイルマッピングという物になっていて、

    HANDLE hmem = CreateFileMaping( .... );
    void* pvReserve = MapViewOfFile( hmem, .... );
    void* pvCommit = VirtualAlloc( pvReserve, .... );

みたいな処理の、VirtualAllocでエラーが返ってるようです。エラーコードの5はERROR_ACCESS_DENIEDってことのようなんですが、なぜにこれが出るのかはちょっと現段階では分からずです。

ちなみにありがちなミスとしてメモリリーク(メモリの解放し忘れ)があるかと思うんですが、意図的にメモリリークさせるテストをしてみた所では、VirtualAllocで1455番のERROR_COMMITMENT_LIMITってのが返るようで、今回のケースはメモリリークが起きてる訳では無いのかなぁと思います。

とりあえずの回避策としてですが、

    setcompatiblemode 0x08000000;

をマクロの先頭(だと思う)で実行すると、変数用のメモリが共有メモリじゃなくてプロセス内のローカルメモリになり、MapViewOfFileもVirtualAllocも呼ばなくなります。プロセス切り替え(setactivehidemaruやnexthidemaruなど)を使ってないならこれで回避できると思うので、もし良かったらそれでどうかも試してみて欲しいです。
[ ]
RE:11764 BeginMacro Memory Error (7)No.11765
こみやんま さん 24/08/13 18:57 [ コメントを投稿する ]
  秀まるおさん、返答ありがとうございます。


■共通点 は HmPHPSimpleServer.mac にあり(?)


```
BeginMacro Memory Error (6) 
今回の
BeginMacro Memory Error (7)
```

両方に共通して言えることは、どうも

自分が作った「HmPHPSimpleServer.mac」が実行されていることに思えました。
(拡張子が.php のファイルを秀丸で開いてる時に出るので。
 多分「ファイルを開いた直後」に出るんだと思うのですが、「上書き保存」した時かもしれず、基本的に無意識夢想なのであまり自身がありませんw)


■ HmPHPSimpleServer

https://xn--pckzexbx21r8q9b.net/?page=nobu_tool_hm_php_simple_server

このマクロを.phpの時の「自動起動マクロ」に登録している
(eventキーワード=1 [ファイルを開いた直後]) の時に上記 HmPHPSimpleServer.mac が実行されるようにしています。

このマクロは長いわけではなく、
https://github.com/komiyamma/hm_php_simple_server/blob/main/src/HmPHPSimpleServer/bin/Release/HmPHPSimpleServer.mac


となっています。

怪しそうな項目は2つかと思います。

(1)「1つのマクロの中」で、
 setstaticvariable k, v, 1
  getstaticvariable k, 1
  と
 setstaticvariable k, v, 2
  getstaticvariable k, 2

 の両方が使われている
 (元来はもちろん問題はないハズ)

(2)「1つのマクロの中」で
 共用メモリにアクセスしており(setstaticvariable, getstaticvariable)と
 かつ個別ブラウザにアクセスしている
 (元来はもちろん問題はないハズ)

あたりだと思います。


■HmPHPSimpleServer.dll
HmPHPSimpleServer.mac から呼ばれている HmPHPSimpleServer.dll も調べてみましたが、

https://github.com/komiyamma/hm_php_simple_server/blob/main/src/HmPHPSimpleServer/HmPHPSimpleServer.cs

 本来は問題はないハズですが、
 もし、問題が起きてるのだとすれば、上記の270行目〜306行目あたりでしょうか。

(1)Hm.Macro.Exec.File とは秀丸本体側で用意されている「SendMessageにWM_REMOTE_EXECMACRO_FILEを渡す処理」のラッパーのことですが、
これで呼びだされたマクロファイルに、setstaticvariableやgetstaticvariableが記述されていて大丈夫なのか?といった問題。
(本来は問題ないハズですが...)

(2)SendMessageを呼び出しているスレッド自体が「秀丸のマクロスレッド」とは「異なるスレッド」であるという問題。



■setcompatiblemode 0x08000000  
HmPHPSimpleServer.macに一旦

setcompatiblemode 0x08000000;

を入れて試してみることにはします。


■追伸
上述の
```
https://github.com/komiyamma/hm_php_simple_server/blob/main/src/HmPHPSimpleServer/bin/Release/HmPHPSimpleServer.mac
```
はこの投稿を書いてる途中に
```
setcompatiblemode 0x08000000;
```
を追加しちゃったので(もしデバッグ等に利用する際は)注意してください。
(setcompatiblemode 0x08000000は元々は無かったため消してください)
[ ]
RE:11765 BeginMacro Memory Error (7)No.11766
秀丸担当 さん 24/08/19 08:50 [ コメントを投稿する ]
  バグ情報と詳しいことありがとうございます。
はたして何が起きているのか、現時点ではわからないですが、マクロを入れてみてしばらく使ってみます。
setstaticvariableや呼ばれ方は、最終的に本体スレッドであれば大丈夫なはずです。(正しいとすれば)
SendMessageの呼び出し元が別スレッドというのはちょっと気になりますが、正しいとすれば問題無いはずです。
問題かもしれんないので、そのあたりも気に掛けるようにしてみます。

setcompatiblemode 0x08000000;の回避策は直接的には効果あると思います。
というか、変数が秀丸エディタ間で共有なのは従来からそうなっているためで、多くのケースでsetcompatiblemode 0x08000000;を使うのは良いと思います。
[ ]

[ 新規に投稿する ]