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はERR
OR_ACCESS_DENIEDってことのようなんですが、なぜにこれが出るのかはちょっと現段
階では分からずです。

ちなみにありがちなミスとしてメモリリーク(メモリの解放し忘れ)があるかと思う
んですが、意図的にメモリリークさせるテストをしてみた所では、VirtualAllocで14
55番の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;を使うのは良いと思います。

[ ]